Drizzled Public API Documentation

wakeup.h
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 #pragma once
22 
23 #include <boost/thread/mutex.hpp>
24 #include <boost/thread/condition_variable.hpp>
25 #include <boost/shared_ptr.hpp>
26 
27 namespace client {
28 
29 // Wakeup starts in a blocking posistion
30 class Wakeup {
31 public:
32  typedef boost::shared_ptr<Wakeup> shared_ptr;
33 
34  Wakeup() :
35  sleeping(true)
36  { }
37 
38  // Signal all of the waiters to start
39  void start()
40  {
41  boost::mutex::scoped_lock scopedWakeup(sleeper_mutex);
42  sleeping= false;
43  sleep_threshhold.notify_all();
44  }
45 
46  // reset after the start of the signal so that we can reuse the wakeup
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  }
62 
63 private:
64  bool sleeping;
65  boost::mutex sleeper_mutex;
66  boost::condition_variable_any sleep_threshhold;
67 };
68 
69 } // namespace client