OSDN Git Service

Update copyright to 2004.
[pg-rex/syncrep.git] / src / backend / port / win32 / sema.c
index bb2e68b..43f1187 100644 (file)
@@ -3,7 +3,10 @@
  * sema.c
  *       Microsoft Windows Win32 Semaphores Emulation
  *
- * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ *       $PostgreSQL: pgsql/src/backend/port/win32/sema.c,v 1.7 2004/08/29 04:12:46 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -225,11 +228,12 @@ semop(int semId, struct sembuf * sops, int nsops)
        if (sops[0].sem_op == -1)
        {
                DWORD           ret;
+               HANDLE      wh[2];
 
-               if (sops[0].sem_flg & IPC_NOWAIT)
-                       ret = WaitForSingleObject(cur_handle, 0);
-               else
-                       ret = WaitForSingleObject(cur_handle, INFINITE);
+               wh[0] = cur_handle;
+               wh[1] = pgwin32_signal_event;
+
+               ret = WaitForMultipleObjects(2, wh, FALSE, (sops[0].sem_flg & IPC_NOWAIT)?0:INFINITE);
 
                if (ret == WAIT_OBJECT_0)
                {
@@ -237,6 +241,12 @@ semop(int semId, struct sembuf * sops, int nsops)
                        sem_counts[sops[0].sem_num]--;
                        return 0;
                }
+               else if (ret == WAIT_OBJECT_0+1)
+               {
+                       /* Signal event is set - we have a signal to deliver */
+                       pgwin32_dispatch_queued_signals();
+                       errno = EINTR;
+               }
                else if (ret == WAIT_TIMEOUT)
                        /* Couldn't get it */
                        errno = EAGAIN;