]> granicus.if.org Git - postgresql/commitdiff
> win32 doesn't support a static initializer for mutexes, thus the first
authorBruce Momjian <bruce@momjian.us>
Mon, 12 Jul 2004 14:23:28 +0000 (14:23 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 12 Jul 2004 14:23:28 +0000 (14:23 +0000)
> user must initialize the lock. The problem are concurrent "first" users
> - the pthread_mutex_t initialization must be synchronized.
> The current implementation is broken, the attached patches fixes that:
> mutex_initlock is a spinlock. If the pthread_mutex_t mutex is not
> initialized, then the spinlock is acquired, if the pthread_mutex_t is
> initialized if it's not yet initialized and then the spinlock is dropped.

Manfred Spraul

src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-secure.c

index 89130a0f17bf80d6093a6a901a412e70254367ba..ef50381122844112267a28a8427cca2cb50a48b5 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.277 2004/07/12 14:16:28 momjian Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.278 2004/07/12 14:23:28 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3193,10 +3193,16 @@ default_threadlock(int acquire)
 #ifndef WIN32
        static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER;
 #else
-       static pthread_mutex_t singlethread_lock;
-        static long mutex_initialized = 0;
-        if (!InterlockedExchange(&mutex_initialized, 1L))
-                pthread_mutex_init(&singlethread_lock, NULL);
+       static pthread_mutex_t singlethread_lock = NULL;
+       static long mutex_initlock = 0;
+
+       if (singlethread_lock == NULL) {
+               while(InterlockedExchange(&mutex_initlock, 1) == 1)
+                       /* loop, another thread own the lock */ ;
+               if (singlethread_lock == NULL)
+                       pthread_mutex_init(&singlethread_lock, NULL);
+               InterlockedExchange(&mutex_initlock,0);
+       }
 #endif
        if (acquire)
                pthread_mutex_lock(&singlethread_lock);
index a60f34875d969c8c60658a39f155a28a93e4011e..6e76e9674c4b9239ddfedab001f25536a56faba2 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.44 2004/07/12 14:16:28 momjian Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.45 2004/07/12 14:23:28 momjian Exp $
  *
  * NOTES
  *       The client *requires* a valid server certificate.  Since
@@ -867,10 +867,16 @@ init_ssl_system(PGconn *conn)
 #ifndef WIN32
         static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
 #else
-        static pthread_mutex_t init_mutex;
-        static long mutex_initialized = 0L;
-        if (!InterlockedExchange(&mutex_initialized, 1L))
-                pthread_mutex_init(&init_mutex, NULL);
+       static pthread_mutex_t init_mutex = NULL;
+       static long mutex_initlock = 0;
+
+       if (init_mutex == NULL) {
+               while(InterlockedExchange(&mutex_initlock, 1) == 1)
+                       /* loop, another thread own the lock */ ;
+               if (init_mutex == NULL)
+                       pthread_mutex_init(&init_mutex, NULL);
+               InterlockedExchange(&mutex_initlock,0);
+       }
 #endif
        pthread_mutex_lock(&init_mutex);