15 #ifndef STXXL_SWITCH_HEADER
16 #define STXXL_SWITCH_HEADER
18 #ifdef STXXL_BOOST_THREADS
19 #include <boost/thread/mutex.hpp>
20 #include <boost/thread/condition.hpp>
25 #include <stxxl/bits/noncopyable.h>
26 #include <stxxl/bits/common/error_handling.h>
29 __STXXL_BEGIN_NAMESPACE
33 class onoff_switch :
private noncopyable
35 #ifdef STXXL_BOOST_THREADS
37 boost::condition cond;
39 pthread_mutex_t mutex;
45 onoff_switch(
bool flag =
false) : _on(flag)
47 #ifndef STXXL_BOOST_THREADS
48 check_pthread_call(pthread_mutex_init(&mutex, NULL));
49 check_pthread_call(pthread_cond_init(&cond, NULL));
54 #ifndef STXXL_BOOST_THREADS
55 int res = pthread_mutex_trylock(&mutex);
57 if (res == 0 || res == EBUSY) {
58 check_pthread_call(pthread_mutex_unlock(&mutex));
60 stxxl_function_error(resource_error);
61 check_pthread_call(pthread_mutex_destroy(&mutex));
64 check_pthread_call(pthread_cond_destroy(&cond));
69 #ifdef STXXL_BOOST_THREADS
70 boost::mutex::scoped_lock Lock(mutex);
75 check_pthread_call(pthread_mutex_lock(&mutex));
77 check_pthread_call(pthread_mutex_unlock(&mutex));
78 check_pthread_call(pthread_cond_signal(&cond));
83 #ifdef STXXL_BOOST_THREADS
84 boost::mutex::scoped_lock Lock(mutex);
89 check_pthread_call(pthread_mutex_lock(&mutex));
91 check_pthread_call(pthread_mutex_unlock(&mutex));
92 check_pthread_call(pthread_cond_signal(&cond));
97 #ifdef STXXL_BOOST_THREADS
98 boost::mutex::scoped_lock Lock(mutex);
103 check_pthread_call(pthread_mutex_lock(&mutex));
105 check_pthread_call(pthread_cond_wait(&cond, &mutex));
107 check_pthread_call(pthread_mutex_unlock(&mutex));
112 #ifdef STXXL_BOOST_THREADS
113 boost::mutex::scoped_lock Lock(mutex);
118 check_pthread_call(pthread_mutex_lock(&mutex));
120 check_pthread_call(pthread_cond_wait(&cond, &mutex));
122 check_pthread_call(pthread_mutex_unlock(&mutex));
127 #ifdef STXXL_BOOST_THREADS
128 boost::mutex::scoped_lock Lock(mutex);
132 check_pthread_call(pthread_mutex_lock(&mutex));
134 check_pthread_call(pthread_mutex_unlock(&mutex));
140 __STXXL_END_NAMESPACE
142 #endif // !STXXL_SWITCH_HEADER