diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2007-03-06 19:48:45 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2007-03-06 19:48:45 +0000 |
| commit | 4102380d65cc4ce718d40707dba68f613c344e55 (patch) | |
| tree | e403af2de938eb936918c5cef53a2bebcac949f5 /src/Fl_lock.cxx | |
| parent | c4ad147d5f84dbe198e9afc13bf8e7e4f9b77435 (diff) | |
Some improvements as discussed. Not a final feature! May be removed without notice!
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@5732 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_lock.cxx')
| -rw-r--r-- | src/Fl_lock.cxx | 65 |
1 files changed, 50 insertions, 15 deletions
diff --git a/src/Fl_lock.cxx b/src/Fl_lock.cxx index 187b3b492..88b93c87e 100644 --- a/src/Fl_lock.cxx +++ b/src/Fl_lock.cxx @@ -77,10 +77,14 @@ int Fl::awake_ring_head_; int Fl::awake_ring_tail_; const int AWAKE_RING_SIZE = 1024; +static void lock_ring(); +static void unlock_ring(); + + int Fl::add_awake_handler_(Fl_Awake_Handler func, void *data) { int ret = 0; - Fl::lock(); + lock_ring(); if (!awake_ring_) { awake_ring_size_ = AWAKE_RING_SIZE; awake_ring_ = (Fl_Awake_Handler*)malloc(awake_ring_size_*sizeof(Fl_Awake_Handler)); @@ -96,24 +100,25 @@ int Fl::add_awake_handler_(Fl_Awake_Handler func, void *data) if (awake_ring_head_ == awake_ring_size_) awake_ring_head_ = 0; } - Fl::unlock(); + unlock_ring(); return ret; } int Fl::get_awake_handler_(Fl_Awake_Handler &func, void *&data) { - // this function must only be called from within the event - // loop which is locked, so don't bother creating any locks - if (!awake_ring_) - return -1; - if (awake_ring_head_ == awake_ring_tail_) - return -1; - func = awake_ring_[awake_ring_tail_]; - data = awake_data_[awake_ring_tail_]; - ++awake_ring_tail_; - if (awake_ring_tail_ == awake_ring_size_) - awake_ring_tail_ = 0; - return 0; + int ret = 0; + lock_ring(); + if (!awake_ring_ || awake_ring_head_ == awake_ring_tail_) { + ret = -1; + } else { + func = awake_ring_[awake_ring_tail_]; + data = awake_data_[awake_ring_tail_]; + ++awake_ring_tail_; + if (awake_ring_tail_ == awake_ring_size_) + awake_ring_tail_ = 0; + } + unlock_ring(); + return ret; } // @@ -142,6 +147,19 @@ static DWORD main_thread; // Microsoft's version of a MUTEX... CRITICAL_SECTION cs; +CRITICAL_SECTION *cs_ring; + +void unlock_ring() { + LeaveCriticalSection(cs_ring); +} + +void lock_ring() { + if (!cs_ring) { + cs_ring = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION)); + InitializeCriticalSection(cs_ring); + } + EnterCriticalSection(cs_ring); +} // // 'unlock_function()' - Release the lock. @@ -204,7 +222,7 @@ void Fl::awake(void* msg) { // Pipe for thread messaging via Fl::awake()... static int thread_filedes[2]; -// Mutux and state information for Fl::lock() and Fl::unlock()... +// Mutex and state information for Fl::lock() and Fl::unlock()... static pthread_mutex_t fltk_mutex; static pthread_t owner; static int counter; @@ -310,6 +328,23 @@ void Fl::lock() { void Fl::unlock() { fl_unlock_function(); } + +// Mutex code for the awake ring buffer +static pthread_mutex_t *ring_mutex; + +void unlock_ring() { + pthread_mutex_unlock(ring_mutex); +} + +void lock_ring() { + if (!ring_mutex) { + ring_mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(ring_mutex, NULL); + } + pthread_mutex_lock(ring_mutex); +} + + #endif // WIN32 // |
