From 48cf9c8a42e365c38b6bec53b5e488915234795a Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 17 Dec 2002 09:38:32 +0000 Subject: [PATCH] =?utf8?q?=09Added=20CriticalSection=20implementation=20of?= =?utf8?q?=20SilcMutext.=20=20A=20patch=20by=20=09Mikko=20L=E4hteenm=E4ki.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- CHANGES | 4 ++++ lib/silcutil/win32/silcwin32mutex.c | 23 ++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index c4c9e7b3..b3f05dd3 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Tue Dec 17 10:05:00 CET 2002 Pekka Riikonen file is lib/silcutil/silcfileutil.c. A patch by Matthew Aldous . + * Added better implementation using CriticalSection of + SilcMutex on WIN32. A patch by Mikko Lähteenmäki + . + Mon Dec 16 19:33:05 EET 2002 Pekka Riikonen * Fixed double free in async host lookup code. Affected file diff --git a/lib/silcutil/win32/silcwin32mutex.c b/lib/silcutil/win32/silcwin32mutex.c index 95a6e265..11c03c9c 100644 --- a/lib/silcutil/win32/silcwin32mutex.c +++ b/lib/silcutil/win32/silcwin32mutex.c @@ -22,9 +22,10 @@ #include "silcincludes.h" /* SILC Mutex structure */ -struct SilcMutexStruct { +struct SilcMutexStruct { #ifdef SILC_THREADS - HANDLE mutex; + CRITICAL_SECTION mutex; + BOOL locked; #else void *tmp; #endif /* SILC_THREADS */ @@ -33,12 +34,8 @@ struct SilcMutexStruct { bool silc_mutex_alloc(SilcMutex *mutex) { #ifdef SILC_THREADS - *mutex = silc_calloc(1, sizeof(**mutex)); - (*mutex)->mutex = CreateMutex(NULL, FALSE, NULL); - if (!(*mutex)->mutex) { - silc_free(*mutex); - return FALSE; - } + *mutex = silc_calloc(1, sizeof(**mutex)); + InitializeCriticalSection(&((*mutex)->mutex)); #endif /* SILC_THREADS */ return TRUE; } @@ -46,7 +43,7 @@ bool silc_mutex_alloc(SilcMutex *mutex) void silc_mutex_free(SilcMutex mutex) { #ifdef SILC_THREADS - CloseHandle(mutex->mutex); + DeleteCriticalSection(&mutex->mutex); silc_free(mutex); #endif /* SILC_THREADS */ } @@ -54,13 +51,17 @@ void silc_mutex_free(SilcMutex mutex) void silc_mutex_lock(SilcMutex mutex) { #ifdef SILC_THREADS - WaitForSingleObject(mutex->mutex, INFINITE); + EnterCriticalSection(&mutex->mutex); + assert(mutex->locked == FALSE); + mutex->locked = TRUE; #endif /* SILC_THREADS */ } void silc_mutex_unlock(SilcMutex mutex) { #ifdef SILC_THREADS - ReleaseMutex(mutex->mutex); + assert(mutex->locked == TRUE); + mutex->locked = FALSE; + LeaveCriticalSection(&mutex->mutex); #endif /* SILC_THREADS */ } -- 2.24.0