#if _WIN32_WINNT >= 0x0600
struct _Eina_Condition
{
- CRITICAL_SECTION mutex;
+ CRITICAL_SECTION *mutex;
CONDITION_VARIABLE condition;
};
#else
struct _Eina_Condition
{
- int waiters_count;
- CRITICAL_SECTION waiters_count_lock;
- CRITICAL_SECTION mutex;
- HANDLE semaphore;
- HANDLE waiters_done;
- Eina_Bool was_broadcast;
+ int waiters_count;
+ CRITICAL_SECTION waiters_count_lock;
+ CRITICAL_SECTION *mutex;
+ HANDLE semaphore;
+ HANDLE waiters_done;
+ Eina_Bool was_broadcast;
};
#endif
static inline Eina_Bool
eina_lock_new(Eina_Lock *mutex)
{
+ printf(" mutex init: %p\n", mutex);
InitializeCriticalSection(mutex);
return EINA_TRUE;
static inline void
eina_lock_free(Eina_Lock *mutex)
{
+ printf(" mutex free: %p\n", mutex);
DeleteCriticalSection(mutex);
}
if (!_eina_threads_activated) return EINA_LOCK_SUCCEED;
#endif
+ printf(" mutex take: %p\n", mutex);
EnterCriticalSection(mutex);
return EINA_LOCK_SUCCEED;
if (!_eina_threads_activated) return EINA_LOCK_SUCCEED;
#endif
+ printf(" mutex release: %p\n", mutex);
LeaveCriticalSection(mutex);
return EINA_LOCK_SUCCEED;
static inline Eina_Bool
eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex)
{
- cond->mutex = *mutex;
+ cond->mutex = mutex;
#if _WIN32_WINNT >= 0x0600
InitializeConditionVariable(&cond->condition);
#else
return EINA_FALSE;
InitializeCriticalSection(&cond->waiters_count_lock);
- InitializeCriticalSection(&cond->mutex);
cond->waiters_done = CreateEvent(NULL, // no security
FALSE, // auto-reset
eina_condition_free(Eina_Condition *cond)
{
#if _WIN32_WINNT >= 0x0600
- DeleteCriticalSection(&cond->mutex);
+ /* Nothing to do */
#else
CloseHandle(cond->waiters_done);
DeleteCriticalSection(&cond->waiters_count_lock);
eina_condition_wait(Eina_Condition *cond)
{
#if _WIN32_WINNT >= 0x0600
- SleepConditionVariableCS(&cond->condition, &cond->mutex, INFINITE);
+ SleepConditionVariableCS(&cond->condition, cond->mutex, INFINITE);
#else
DWORD ret;
Eina_Bool last_waiter;
* semaphore until <pthread_cond_signal> or <pthread_cond_broadcast>
* are called by another thread.
*/
- ret = SignalObjectAndWait(&cond->mutex, cond->semaphore, INFINITE, FALSE);
+ ret = SignalObjectAndWait(cond->mutex, cond->semaphore, INFINITE, FALSE);
if (ret == WAIT_FAILED)
return EINA_FALSE;
* This call atomically signals the <waiters_done_> event and waits until
* it can acquire the <external_mutex>. This is required to ensure fairness.
*/
- ret = SignalObjectAndWait(cond->waiters_done, &cond->mutex, INFINITE, FALSE);
+ ret = SignalObjectAndWait(cond->waiters_done, cond->mutex, INFINITE, FALSE);
if (ret == WAIT_FAILED)
return EINA_FALSE;
}
* Always regain the external mutex since that's the guarantee we
* give to our callers.
*/
- ret = WaitForSingleObject(&cond->mutex, INFINITE);
+ ret = WaitForSingleObject(cond->mutex, INFINITE);
if (ret == WAIT_FAILED)
return EINA_FALSE;
}