#ifndef BOOST_THREAD_PTHREAD_CONDITION_VARIABLE_FWD_HPP | |
#define BOOST_THREAD_PTHREAD_CONDITION_VARIABLE_FWD_HPP | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
// (C) Copyright 2007-8 Anthony Williams | |
#include <boost/assert.hpp> | |
#include <boost/throw_exception.hpp> | |
#include <pthread.h> | |
#include <boost/thread/mutex.hpp> | |
#include <boost/thread/locks.hpp> | |
#include <boost/thread/thread_time.hpp> | |
#include <boost/thread/xtime.hpp> | |
#include <boost/config/abi_prefix.hpp> | |
namespace boost | |
{ | |
class condition_variable | |
{ | |
private: | |
pthread_mutex_t internal_mutex; | |
pthread_cond_t cond; | |
condition_variable(condition_variable&); | |
condition_variable& operator=(condition_variable&); | |
public: | |
condition_variable() | |
{ | |
int const res=pthread_mutex_init(&internal_mutex,NULL); | |
if(res) | |
{ | |
boost::throw_exception(thread_resource_error()); | |
} | |
int const res2=pthread_cond_init(&cond,NULL); | |
if(res2) | |
{ | |
BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex)); | |
boost::throw_exception(thread_resource_error()); | |
} | |
} | |
~condition_variable() | |
{ | |
BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex)); | |
BOOST_VERIFY(!pthread_cond_destroy(&cond)); | |
} | |
void wait(unique_lock<mutex>& m); | |
template<typename predicate_type> | |
void wait(unique_lock<mutex>& m,predicate_type pred) | |
{ | |
while(!pred()) wait(m); | |
} | |
inline bool timed_wait(unique_lock<mutex>& m, | |
boost::system_time const& wait_until); | |
bool timed_wait(unique_lock<mutex>& m,xtime const& wait_until) | |
{ | |
return timed_wait(m,system_time(wait_until)); | |
} | |
template<typename duration_type> | |
bool timed_wait(unique_lock<mutex>& m,duration_type const& wait_duration) | |
{ | |
return timed_wait(m,get_system_time()+wait_duration); | |
} | |
template<typename predicate_type> | |
bool timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until,predicate_type pred) | |
{ | |
while (!pred()) | |
{ | |
if(!timed_wait(m, wait_until)) | |
return pred(); | |
} | |
return true; | |
} | |
template<typename predicate_type> | |
bool timed_wait(unique_lock<mutex>& m,xtime const& wait_until,predicate_type pred) | |
{ | |
return timed_wait(m,system_time(wait_until),pred); | |
} | |
template<typename duration_type,typename predicate_type> | |
bool timed_wait(unique_lock<mutex>& m,duration_type const& wait_duration,predicate_type pred) | |
{ | |
return timed_wait(m,get_system_time()+wait_duration,pred); | |
} | |
typedef pthread_cond_t* native_handle_type; | |
native_handle_type native_handle() | |
{ | |
return &cond; | |
} | |
void notify_one(); | |
void notify_all(); | |
}; | |
} | |
#include <boost/config/abi_suffix.hpp> | |
#endif |