~drizzle-trunk/drizzle/development

1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2010 Brian Aker
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, write to the Free Software
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 */
20
2371.1.1 by Brian Aker
Fedora fix/use fwd header for iostream.
21
#pragma once
22
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
23
#include <boost/thread/mutex.hpp>
24
#include <boost/thread/condition_variable.hpp>
1933.1.3 by Brian Aker
First pass though barriers.
25
#include <boost/shared_ptr.hpp>
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
26
27
namespace client {
28
29
// Wakeup starts in a blocking posistion
30
class Wakeup {
31
public:
1933.1.3 by Brian Aker
First pass though barriers.
32
  typedef boost::shared_ptr<Wakeup> shared_ptr;
33
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
34
  Wakeup() :
35
    sleeping(true)
36
  { }
37
1933.1.3 by Brian Aker
First pass though barriers.
38
  // Signal all of the waiters to start
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
39
  void start()
40
  {
41
    boost::mutex::scoped_lock scopedWakeup(sleeper_mutex);
42
    sleeping= false;
43
    sleep_threshhold.notify_all();
44
  }
45
1933.1.3 by Brian Aker
First pass though barriers.
46
  // reset after the start of the signal so that we can reuse the wakeup
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
47
  void reset()
48
  {
49
    boost::mutex::scoped_lock scopedWakeup(sleeper_mutex);
50
    sleeping= true;
51
  }
52
53
  void wait() 
54
  {
55
    sleeper_mutex.lock();
56
    while (sleeping)
57
    {
58
      sleep_threshhold.wait(sleeper_mutex);
59
    }
60
    sleeper_mutex.unlock();
61
  }
1933.1.3 by Brian Aker
First pass though barriers.
62
63
private:
64
  bool sleeping;
65
  boost::mutex sleeper_mutex;
66
  boost::condition_variable_any sleep_threshhold;
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
67
};
68
69
} // namespace client