~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
21
#include <boost/thread/mutex.hpp>
22
#include <boost/thread/condition_variable.hpp>
1933.1.3 by Brian Aker
First pass though barriers.
23
#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
24
25
#ifndef CLIENT_WAKEUP_H
26
#define CLIENT_WAKEUP_H
27
28
namespace client {
29
30
// Wakeup starts in a blocking posistion
31
class Wakeup {
32
public:
1933.1.3 by Brian Aker
First pass though barriers.
33
  typedef boost::shared_ptr<Wakeup> shared_ptr;
34
1897.1.3 by Brian Aker
Updating with moving out wakeup to its own file. Why not use barrier for
35
  Wakeup() :
36
    sleeping(true)
37
  { }
38
1933.1.3 by Brian Aker
First pass though barriers.
39
  // 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
40
  void start()
41
  {
42
    boost::mutex::scoped_lock scopedWakeup(sleeper_mutex);
43
    sleeping= false;
44
    sleep_threshhold.notify_all();
45
  }
46
1933.1.3 by Brian Aker
First pass though barriers.
47
  // 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
48
  void reset()
49
  {
50
    boost::mutex::scoped_lock scopedWakeup(sleeper_mutex);
51
    sleeping= true;
52
  }
53
54
  void wait() 
55
  {
56
    sleeper_mutex.lock();
57
    while (sleeping)
58
    {
59
      sleep_threshhold.wait(sleeper_mutex);
60
    }
61
    sleeper_mutex.unlock();
62
  }
1933.1.3 by Brian Aker
First pass though barriers.
63
64
private:
65
  bool sleeping;
66
  boost::mutex sleeper_mutex;
67
  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
68
};
69
70
} // namespace client
71
72
#endif /* CLIENT_WAKEUP_H */