Thread (24 messages) flat view 24 messages, 4 authors, 2016-06-15

Re: [PATCH 1/5] MSVC: Windows-native implementation for subset of Pthreads API

From: Erik Faye-Lund <hidden>
Date: 2016-06-15 22:47:59

On Fri, Jan 8, 2010 at 4:32 AM, Dmitry Potapov [off-list ref] wrote:
On Thu, Jan 07, 2010 at 10:54:57PM +0100, Johannes Sixt wrote:
quoted
+
+int pthread_cond_wait(pthread_cond_t *cond, CRITICAL_SECTION *mutex)
+{
+     /* serialize access to waiters count */
+     EnterCriticalSection(&cond->waiters_lock);
+     ++cond->waiters;
+     LeaveCriticalSection(&cond->waiters_lock);
InterlockedIncrement(&cond->waiters);
quoted
+
+     /*
+      * Unlock external mutex and wait for signal.
+      * NOTE: we've held mutex locked long enough to increment
+      * waiters count above, so there's no problem with
+      * leaving mutex unlocked before we wait on semaphore.
+      */
+     LeaveCriticalSection(mutex);
+
+     /* let's wait - ignore return value */
+     WaitForSingleObject(cond->sema, INFINITE);
+
+     /* we're done waiting, so make sure we decrease waiters count */
+     EnterCriticalSection(&cond->waiters_lock);
+     --cond->waiters;
+     LeaveCriticalSection(&cond->waiters_lock);
InterlockedDecrement(&cond->waiters);
Nice.
quoted
+
+     /* lock external mutex again */
+     EnterCriticalSection(mutex);
+
+     return 0;
+}
+
+int pthread_cond_signal(pthread_cond_t *cond)
+{
+     int have_waiters;
+
+     /* serialize access to waiters count */
+     EnterCriticalSection(&cond->waiters_lock);
+     have_waiters = cond->waiters > 0;
+     LeaveCriticalSection(&cond->waiters_lock);
AFAIK, Win32 API assumes that reading LONG is always atomic, so
the critical section is not really necesary here, but you need
to declare 'waiters' as 'volatile':
"Simple reads and writes to properly-aligned 32-bit variables are
atomic operations."
http://msdn.microsoft.com/en-us/library/ms684122(VS.85).aspx

In other words: Yes, you are right.
quoted
+
+int pthread_cond_init(pthread_cond_t *cond, const void *unused)
+{
+     cond->waiters = 0;
+
+     InitializeCriticalSection(&cond->waiters_lock);
Is waiters_lock really necessary?
(Yeah, I moved this one to the end)

No, I think you've proven that it isn't.

-- 
Erik "kusma" Faye-Lund
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help