Use CRITICAL_SECTION instead of Mutexes for thread-locking in libpq on
authorMagnus Hagander <magnus@hagander.net>
Wed, 21 May 2008 14:20:48 +0000 (14:20 +0000)
committerMagnus Hagander <magnus@hagander.net>
Wed, 21 May 2008 14:20:48 +0000 (14:20 +0000)
Windows, for better performance.

Per suggestion from Andrew Chernow, but not his patch since the underlying
code was changed to deal with return values.

src/interfaces/libpq/pthread-win32.c
src/port/pthread-win32.h

index 08629ca9578dd4dd7e5928f753d8cbfd7ab563ec..0133b8c92db4e9f48230023e1c4e3d46edc4b531 100644 (file)
@@ -35,24 +35,27 @@ pthread_getspecific(pthread_key_t key)
 int
 pthread_mutex_init(pthread_mutex_t *mp, void *attr)
 {
-       *mp = CreateMutex(0, 0, 0);
-       if (*mp == NULL)
+       *mp = (CRITICAL_SECTION *)malloc(sizeof(CRITICAL_SECTION));
+       if (!*mp)
                return 1;
+       InitializeCriticalSection(*mp);
        return 0;
 }
 
 int
 pthread_mutex_lock(pthread_mutex_t *mp)
 {
-       if (WaitForSingleObject(*mp, INFINITE) != WAIT_OBJECT_0)
+       if (!*mp)
                return 1;
+       EnterCriticalSection(*mp);
        return 0;
 }
 
 int
 pthread_mutex_unlock(pthread_mutex_t *mp)
 {
-       if (!ReleaseMutex(*mp))
+       if (!*mp)
                return 1;
+       LeaveCriticalSection(*mp);
        return 0;
 }
index 71574e2a51a339d58d770e1dc54c6d4eeb1e0bb4..dbbbebf5c21a57adce6a9b6050fbeb446783ba4d 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * $PostgreSQL:
+ * $PostgreSQL$ 
  */
 #ifndef __PTHREAD_H
 #define __PTHREAD_H
 
 typedef ULONG pthread_key_t;
-typedef HANDLE pthread_mutex_t;
+typedef CRITICAL_SECTION *pthread_mutex_t;
 typedef int pthread_once_t;
 
 DWORD          pthread_self(void);