typedef CRITICAL_SECTION Eina_Lock;
typedef struct _Eina_Condition Eina_Condition;
+typedef struct _Eina_RWLock Eina_RWLock;
+typedef DWORD Eina_TLS;
+typedef HANDLE Eina_Semaphore;
#if _WIN32_WINNT >= 0x0600
struct _Eina_Condition
CRITICAL_SECTION *mutex;
CONDITION_VARIABLE condition;
};
+
+struct _Eina_RWLock
+{
+ SRWLOCK mutex;
+
+ Eina_Bool is_read_mode : 1;
+};
#else
struct _Eina_Condition
{
HANDLE waiters_done;
Eina_Bool was_broadcast;
};
-#endif
-
-typedef struct _Eina_Win32_RWLock Eina_RWLock;
-struct _Eina_Win32_RWLock
+struct _Eina_RWLock
{
- LONG readers_count;
- LONG writers_count;
- int readers;
- int writers;
+ LONG readers_count;
+ LONG writers_count;
+ int readers;
+ int writers;
Eina_Lock mutex;
Eina_Condition cond_read;
Eina_Condition cond_write;
};
+#endif
-typedef DWORD Eina_TLS;
-
-typedef HANDLE Eina_Semaphore;
EAPI extern Eina_Bool _eina_threads_activated;
+
static inline Eina_Bool
eina_lock_new(Eina_Lock *mutex)
{
CloseHandle(cond->semaphore);
return EINA_FALSE;
}
+#endif
return EINA_TRUE;
-#endif
}
static inline void
{
#if _WIN32_WINNT >= 0x0600
/* Nothing to do */
+ (void)cond;
#else
CloseHandle(cond->waiters_done);
DeleteCriticalSection(&cond->waiters_count_lock);
if (!ReleaseSemaphore(cond->semaphore, 1, 0))
return EINA_FALSE;
}
+#endif
return EINA_TRUE;
-#endif
}
static inline Eina_Bool
eina_rwlock_new(Eina_RWLock *mutex)
{
+#if _WIN32_WINNT >= 0x0600
+ InitializeSRWLock(mutex->mutex);
+ return EINA_TRUE;
+#else
if (!eina_lock_new(&(mutex->mutex))) return EINA_FALSE;
if (!eina_condition_new(&(mutex->cond_read), &(mutex->mutex)))
goto on_error1;
on_error1:
eina_lock_free(&(mutex->mutex));
return EINA_FALSE;
+#endif
}
static inline void
eina_rwlock_free(Eina_RWLock *mutex)
{
+#if _WIN32_WINNT >= 0x0600
+ (void)mutex;
+#else
eina_condition_free(&(mutex->cond_read));
eina_condition_free(&(mutex->cond_write));
eina_lock_free(&(mutex->mutex));
+#endif
}
static inline Eina_Lock_Result
eina_rwlock_take_read(Eina_RWLock *mutex)
{
+#if _WIN32_WINNT >= 0x0600
+ AcquireSRWLockShared(mutex->mutex);
+ mutex->is_read_mode = EINA_TRUE;
+#else
DWORD res;
if (eina_lock_take(&(mutex->mutex)) == EINA_LOCK_FAIL)
if (res == 0)
mutex->readers++;
eina_lock_release(&(mutex->mutex));
+#endif
return EINA_LOCK_SUCCEED;
}
static inline Eina_Lock_Result
eina_rwlock_take_write(Eina_RWLock *mutex)
{
+#if _WIN32_WINNT >= 0x0600
+ AcquireSRWLockExclusive(mutex->mutex);
+ mutex->is_read_mode = EINA_FALSE;
+#else
DWORD res;
if (eina_lock_take(&(mutex->mutex)) == EINA_LOCK_FAIL)
}
if (res == 0) mutex->writers_count = 1;
eina_lock_release(&(mutex->mutex));
+#endif
return EINA_LOCK_SUCCEED;
}
static inline Eina_Lock_Result
eina_rwlock_release(Eina_RWLock *mutex)
{
+#if _WIN32_WINNT >= 0x0600
+ if (mutex->is_read_mode)
+ ReleaseSRWLockShared(mutex->mutex);
+ else
+ ReleaseSRWLockExclusive(mutex->mutex);
+#else
if (eina_lock_take(&(mutex->mutex)) == EINA_LOCK_FAIL)
return EINA_LOCK_FAIL;
}
}
eina_lock_release(&(mutex->mutex));
+#endif
return EINA_LOCK_SUCCEED;
}