update boost
This commit is contained in:
@@ -21,10 +21,11 @@
|
||||
|
||||
#include <boost/interprocess/detail/config_begin.hpp>
|
||||
#include <boost/interprocess/detail/workaround.hpp>
|
||||
|
||||
#include <boost/interprocess/sync/cv_status.hpp>
|
||||
#include <boost/interprocess/creation_tags.hpp>
|
||||
#include <boost/interprocess/permissions.hpp>
|
||||
#include <boost/interprocess/detail/interprocess_tester.hpp>
|
||||
#include <boost/interprocess/detail/posix_time_types_wrk.hpp>
|
||||
#include <boost/interprocess/sync/windows/named_sync.hpp>
|
||||
#include <boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>
|
||||
#include <boost/interprocess/sync/detail/condition_algorithm_8a.hpp>
|
||||
@@ -33,41 +34,103 @@ namespace boost {
|
||||
namespace interprocess {
|
||||
namespace ipcdetail {
|
||||
|
||||
class windows_named_condition_any
|
||||
template<class CharT>
|
||||
struct named_cond_callbacks_str;
|
||||
|
||||
template<>
|
||||
struct named_cond_callbacks_str<char>
|
||||
{
|
||||
static const char* ipc_cond()
|
||||
{ return "Global\\bipc.cond."; }
|
||||
|
||||
static const char* bq()
|
||||
{ return "_bq"; }
|
||||
|
||||
static const char* bl()
|
||||
{ return "_bl"; }
|
||||
|
||||
static const char* ul()
|
||||
{ return "_ul"; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct named_cond_callbacks_str<wchar_t>
|
||||
{
|
||||
static const wchar_t* ipc_cond()
|
||||
{ return L"Global\\bipc.cond."; }
|
||||
|
||||
static const wchar_t* bq()
|
||||
{ return L"_bq"; }
|
||||
|
||||
static const wchar_t* bl()
|
||||
{ return L"_bl"; }
|
||||
|
||||
static const wchar_t* ul()
|
||||
{ return L"_ul"; }
|
||||
};
|
||||
|
||||
class winapi_named_condition_any
|
||||
{
|
||||
#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
|
||||
|
||||
//Non-copyable
|
||||
windows_named_condition_any();
|
||||
windows_named_condition_any(const windows_named_condition_any &);
|
||||
windows_named_condition_any &operator=(const windows_named_condition_any &);
|
||||
winapi_named_condition_any();
|
||||
winapi_named_condition_any(const winapi_named_condition_any &);
|
||||
winapi_named_condition_any &operator=(const winapi_named_condition_any &);
|
||||
#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
|
||||
|
||||
public:
|
||||
windows_named_condition_any
|
||||
(create_only_t, const char *name, const permissions &perm)
|
||||
winapi_named_condition_any
|
||||
(create_only_t, const char *name, const permissions &perm = permissions())
|
||||
: m_condition_data()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
|
||||
}
|
||||
|
||||
windows_named_condition_any
|
||||
(open_or_create_t, const char *name, const permissions &perm)
|
||||
winapi_named_condition_any
|
||||
(open_or_create_t, const char *name, const permissions &perm = permissions())
|
||||
: m_condition_data()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
|
||||
}
|
||||
|
||||
windows_named_condition_any(open_only_t, const char *name)
|
||||
winapi_named_condition_any(open_only_t, const char *name)
|
||||
: m_condition_data()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
|
||||
}
|
||||
|
||||
~windows_named_condition_any()
|
||||
#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
|
||||
|
||||
winapi_named_condition_any
|
||||
(create_only_t, const wchar_t *name, const permissions &perm = permissions())
|
||||
: m_condition_data()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
|
||||
}
|
||||
|
||||
winapi_named_condition_any
|
||||
(open_or_create_t, const wchar_t *name, const permissions &perm = permissions())
|
||||
: m_condition_data()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
|
||||
}
|
||||
|
||||
winapi_named_condition_any(open_only_t, const wchar_t *name)
|
||||
: m_condition_data()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
|
||||
}
|
||||
|
||||
#endif //defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
|
||||
|
||||
~winapi_named_condition_any()
|
||||
{
|
||||
named_cond_callbacks callbacks(m_condition_data.get_members());
|
||||
m_named_sync.close(callbacks);
|
||||
@@ -79,12 +142,12 @@ class windows_named_condition_any
|
||||
void notify_all()
|
||||
{ m_condition_data.notify_all(); }
|
||||
|
||||
template <typename L>
|
||||
bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time)
|
||||
template <typename L, typename TimePoint>
|
||||
bool timed_wait(L& lock, const TimePoint &abs_time)
|
||||
{ return m_condition_data.timed_wait(lock, abs_time); }
|
||||
|
||||
template <typename L, typename Pr>
|
||||
bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
|
||||
template <typename L, typename TimePoint, typename Pr>
|
||||
bool timed_wait(L& lock, const TimePoint &abs_time, Pr pred)
|
||||
{ return m_condition_data.timed_wait(lock, abs_time, pred); }
|
||||
|
||||
template <typename L>
|
||||
@@ -95,9 +158,28 @@ class windows_named_condition_any
|
||||
void wait(L& lock, Pr pred)
|
||||
{ m_condition_data.wait(lock, pred); }
|
||||
|
||||
template <typename L, class TimePoint>
|
||||
cv_status wait_until(L& lock, const TimePoint &abs_time)
|
||||
{ return this->timed_wait(lock, abs_time) ? cv_status::no_timeout : cv_status::timeout; }
|
||||
|
||||
template <typename L, class TimePoint, typename Pr>
|
||||
bool wait_until(L& lock, const TimePoint &abs_time, Pr pred)
|
||||
{ return this->timed_wait(lock, abs_time, pred); }
|
||||
|
||||
template <typename L, class Duration>
|
||||
cv_status wait_for(L& lock, const Duration &dur)
|
||||
{ return this->wait_until(lock, ipcdetail::duration_to_ustime(dur)); }
|
||||
|
||||
template <typename L, class Duration, typename Pr>
|
||||
bool wait_for(L& lock, const Duration &dur, Pr pred)
|
||||
{ return this->wait_until(lock, ipcdetail::duration_to_ustime(dur), pred); }
|
||||
|
||||
static bool remove(const char *name)
|
||||
{ return windows_named_sync::remove(name); }
|
||||
|
||||
static bool remove(const wchar_t *name)
|
||||
{ return windows_named_sync::remove(name); }
|
||||
|
||||
#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
|
||||
private:
|
||||
|
||||
@@ -138,6 +220,7 @@ class windows_named_condition_any
|
||||
winapi_mutex_wrapper m_mtx_unblock_lock;
|
||||
};
|
||||
|
||||
|
||||
class named_cond_callbacks : public windows_named_sync_interface
|
||||
{
|
||||
typedef __int64 sem_count_t;
|
||||
@@ -148,28 +231,51 @@ class windows_named_condition_any
|
||||
: m_condition_data(cond_data)
|
||||
{}
|
||||
|
||||
virtual std::size_t get_data_size() const
|
||||
virtual std::size_t get_data_size() const BOOST_OVERRIDE
|
||||
{ return sizeof(sem_counts); }
|
||||
|
||||
virtual const void *buffer_with_final_data_to_file()
|
||||
virtual const void *buffer_with_final_data_to_file() BOOST_OVERRIDE
|
||||
{
|
||||
sem_counts[0] = m_condition_data.m_sem_block_queue.value();
|
||||
sem_counts[1] = m_condition_data.m_sem_block_lock.value();
|
||||
return &sem_counts;
|
||||
}
|
||||
|
||||
virtual const void *buffer_with_init_data_to_file()
|
||||
virtual const void *buffer_with_init_data_to_file() BOOST_OVERRIDE
|
||||
{
|
||||
sem_counts[0] = 0;
|
||||
sem_counts[1] = 1;
|
||||
return &sem_counts;
|
||||
}
|
||||
|
||||
virtual void *buffer_to_store_init_data_from_file()
|
||||
virtual void *buffer_to_store_init_data_from_file() BOOST_OVERRIDE
|
||||
{ return &sem_counts; }
|
||||
|
||||
virtual bool open(create_enum_t, const char *id_name)
|
||||
virtual bool open(create_enum_t op, const char *id_name) BOOST_OVERRIDE
|
||||
{ return this->open_impl(op, id_name); }
|
||||
|
||||
virtual bool open(create_enum_t op, const wchar_t *id_name) BOOST_OVERRIDE
|
||||
{ return this->open_impl(op, id_name); }
|
||||
|
||||
virtual void close() BOOST_OVERRIDE
|
||||
{
|
||||
m_condition_data.m_sem_block_queue.close();
|
||||
m_condition_data.m_sem_block_lock.close();
|
||||
m_condition_data.m_mtx_unblock_lock.close();
|
||||
m_condition_data.m_nwaiters_blocked = 0;
|
||||
m_condition_data.m_nwaiters_gone = 0;
|
||||
m_condition_data.m_nwaiters_to_unblock = 0;
|
||||
}
|
||||
|
||||
virtual ~named_cond_callbacks() BOOST_OVERRIDE
|
||||
{}
|
||||
|
||||
private:
|
||||
|
||||
template<class CharT>
|
||||
bool open_impl(create_enum_t, const CharT *id_name)
|
||||
{
|
||||
typedef named_cond_callbacks_str<CharT> str_t;
|
||||
m_condition_data.m_nwaiters_blocked = 0;
|
||||
m_condition_data.m_nwaiters_gone = 0;
|
||||
m_condition_data.m_nwaiters_to_unblock = 0;
|
||||
@@ -179,29 +285,29 @@ class windows_named_condition_any
|
||||
//initialization and cleanup in case any opening fails
|
||||
permissions perm;
|
||||
perm.set_unrestricted();
|
||||
std::string aux_str = "Global\\bipc.cond.";
|
||||
std::basic_string<CharT> aux_str = str_t::ipc_cond();
|
||||
aux_str += id_name;
|
||||
std::size_t pos = aux_str.size();
|
||||
|
||||
//sem_block_queue
|
||||
aux_str += "_bq";
|
||||
aux_str += str_t::bq();
|
||||
winapi_semaphore_wrapper sem_block_queue;
|
||||
bool created;
|
||||
if(!sem_block_queue.open_or_create
|
||||
(aux_str.c_str(), sem_counts[0], winapi_semaphore_wrapper::MaxCount, perm, created))
|
||||
(aux_str.c_str(), static_cast<long>(sem_counts[0]), winapi_semaphore_wrapper::MaxCount, perm, created))
|
||||
return false;
|
||||
aux_str.erase(pos);
|
||||
|
||||
//sem_block_lock
|
||||
aux_str += "_bl";
|
||||
aux_str += str_t::bl();
|
||||
winapi_semaphore_wrapper sem_block_lock;
|
||||
if(!sem_block_lock.open_or_create
|
||||
(aux_str.c_str(), sem_counts[1], winapi_semaphore_wrapper::MaxCount, perm, created))
|
||||
(aux_str.c_str(), static_cast<long>(sem_counts[1]), winapi_semaphore_wrapper::MaxCount, perm, created))
|
||||
return false;
|
||||
aux_str.erase(pos);
|
||||
|
||||
//mtx_unblock_lock
|
||||
aux_str += "_ul";
|
||||
aux_str += str_t::ul();
|
||||
winapi_mutex_wrapper mtx_unblock_lock;
|
||||
if(!mtx_unblock_lock.open_or_create(aux_str.c_str(), perm))
|
||||
return false;
|
||||
@@ -213,20 +319,6 @@ class windows_named_condition_any
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void close()
|
||||
{
|
||||
m_condition_data.m_sem_block_queue.close();
|
||||
m_condition_data.m_sem_block_lock.close();
|
||||
m_condition_data.m_mtx_unblock_lock.close();
|
||||
m_condition_data.m_nwaiters_blocked = 0;
|
||||
m_condition_data.m_nwaiters_gone = 0;
|
||||
m_condition_data.m_nwaiters_to_unblock = 0;
|
||||
}
|
||||
|
||||
virtual ~named_cond_callbacks()
|
||||
{}
|
||||
|
||||
private:
|
||||
condition_data &m_condition_data;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user