50#if defined (BLOCXX_USE_PTHREAD)
52#if !defined (BLOCXX_NCR)
62 pthread_mutexattr_t attr;
63 int res = pthread_mutexattr_init(&attr);
70#if defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
71 res = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
75 pthread_mutexattr_destroy(&attr);
80 res = pthread_mutex_init(&handle.mutex, &attr);
81 pthread_mutexattr_destroy(&attr);
87#if !defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
88 res = pthread_cond_init(&handle.unlocked, PTHREAD_COND_ATTR_DEFAULT);
91 pthread_mutex_destroy(&handle.mutex);
95 handle.valid_id =
false;
106 pthread_mutexattr_t attr;
107 int res = pthread_mutexattr_create(&attr);
114#if defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
115 res = pthread_mutexattr_setkind_np(&attr, MUTEX_RECURSIVE_NP);
119 pthread_mutexattr_delete(&attr);
124 res = pthread_mutex_init(&handle.mutex, attr);
126 pthread_mutexattr_delete(&attr);
132#if !defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
133 res = pthread_cond_init(&handle.unlocked, PTHREAD_COND_ATTR_DEFAULT);
136 pthread_mutex_destroy(&handle.mutex);
140 handle.valid_id =
false;
160 switch (pthread_mutex_destroy(&handle.mutex))
171#if !defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
172 res = pthread_cond_destroy(&handle.unlocked);
189 int res = pthread_mutex_lock(&handle.mutex);
192#if !defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
193 pthread_t tid = pthread_self();
194 if (handle.valid_id && pthread_equal(handle.thread_id, tid))
200 while (handle.valid_id)
202 res = pthread_cond_wait(&handle.unlocked, &handle.mutex);
203 assert(res == 0 || res == EINTR);
212 pthread_mutex_unlock(&handle.mutex);
218 handle.thread_id = tid;
219 handle.valid_id =
true;
223 res = pthread_mutex_unlock(&handle.mutex);
238#if defined(BLOCXX_HAVE_PTHREAD_MUTEXATTR_SETTYPE)
239 int res = pthread_mutex_unlock(&handle.mutex);
244 res = pthread_mutex_lock(&handle.mutex);
247 pthread_t tid = pthread_self();
248 if (handle.valid_id && !pthread_equal(handle.thread_id, tid))
250 res = pthread_mutex_unlock(&handle.mutex);
255 if (--handle.count == 0)
257 assert(handle.valid_id);
258 handle.valid_id =
false;
260 res = pthread_cond_signal(&handle.unlocked);
264 res = pthread_mutex_unlock(&handle.mutex);
272#if defined(BLOCXX_WIN32)
277 handle =
new CRITICAL_SECTION;
279 InitializeCriticalSection(handle);
288 DeleteCriticalSection(handle);
298 EnterCriticalSection(handle);
305 LeaveCriticalSection(handle);