From 00d1465d13980fc3acf650f182ee0723fbda0e06 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Mon, 19 Jul 2010 14:05:18 -0700 Subject: Added a message passing system based on lock free queues for inter-thread communication. Channels now buffer on the sending side, and no longer require blocking when sending. Lots of other refactoring and bug fixes. --- src/rt/sync/condition_variable.cpp | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/rt/sync/condition_variable.cpp (limited to 'src/rt/sync/condition_variable.cpp') diff --git a/src/rt/sync/condition_variable.cpp b/src/rt/sync/condition_variable.cpp new file mode 100644 index 00000000..d4032572 --- /dev/null +++ b/src/rt/sync/condition_variable.cpp @@ -0,0 +1,66 @@ +#include "../globals.h" + +/* + * Conditional variable. Implemented using pthreads condition variables, and + * using events on windows. + */ + +#include "condition_variable.h" + +// #define TRACE + +condition_variable::condition_variable() { +#if defined(__WIN32__) + _event = CreateEvent(NULL, FALSE, FALSE, NULL); +#else + pthread_cond_init(&_cond, NULL); + pthread_mutex_init(&_mutex, NULL); +#endif +} + +condition_variable::~condition_variable() { +#if defined(__WIN32__) + CloseHandle(_event); +#else + pthread_cond_destroy(&_cond); + pthread_mutex_destroy(&_mutex); +#endif +} + +/** + * Wait indefinitely until condition is signaled. + */ +void condition_variable::wait() { +#ifdef TRACE + printf("waiting on condition_variable: 0x%" PRIxPTR "\n", + (uintptr_t)this); +#endif +#if defined(__WIN32__) + WaitForSingleObject(_event, INFINITE); +#else + pthread_mutex_lock(&_mutex); + pthread_cond_wait(&_cond, &_mutex); + pthread_mutex_unlock(&_mutex); +#endif +#ifdef TRACE + printf("resumed on condition_variable: 0x%" PRIxPTR "\n", + (uintptr_t)this); +#endif +} + +/** + * Signal condition, and resume the waiting thread. + */ +void condition_variable::signal() { +#if defined(__WIN32__) + SetEvent(_event); +#else + pthread_mutex_lock(&_mutex); + pthread_cond_signal(&_cond); + pthread_mutex_unlock(&_mutex); +#endif +#ifdef TRACE + printf("signal condition_variable: 0x%" PRIxPTR "\n", + (uintptr_t)this); +#endif +} -- cgit v1.2.3