]> granicus.if.org Git - postgresql/commitdiff
Implement new PostmasterIsAlive() check for WIN32, per Claudio Natoli.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 30 May 2004 03:50:15 +0000 (03:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 30 May 2004 03:50:15 +0000 (03:50 +0000)
In passing, align a few error messages with the style guide.

src/backend/postmaster/postmaster.c
src/backend/storage/ipc/pmsignal.c
src/include/postmaster/postmaster.h

index e7186c01b39b5f575189a463e5564bbee7ad4dd0..6a0cfbf052b5386fe5d7303d55776755a5ead5c6 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.400 2004/05/29 22:48:19 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.401 2004/05/30 03:50:11 tgl Exp $
  *
  * NOTES
  *
@@ -276,6 +276,8 @@ static DWORD WINAPI win32_sigchld_waiter(LPVOID param);
 static pid_t *win32_childPIDArray;
 static HANDLE *win32_childHNDArray;
 static unsigned long win32_numChildren = 0;
+
+HANDLE PostmasterHandle;
 #endif
 
 static pid_t backend_forkexec(Port *port);
@@ -748,6 +750,21 @@ PostmasterMain(int argc, char *argv[])
                ereport(FATAL,
                                (errcode(ERRCODE_OUT_OF_MEMORY),
                                 errmsg("out of memory")));
+
+       /*
+        * Set up a handle that child processes can use to check whether the
+        * postmaster is still running.
+        */
+       if (DuplicateHandle(GetCurrentProcess(),
+                                               GetCurrentProcess(),
+                                               GetCurrentProcess(),
+                                               &PostmasterHandle,
+                                               0,
+                                               TRUE,
+                                               DUPLICATE_SAME_ACCESS) == 0)
+               ereport(FATAL,
+                               (errmsg_internal("could not duplicate postmaster handle: %d",
+                                                                (int) GetLastError())));
 #endif
 
        /*
@@ -3221,6 +3238,9 @@ write_backend_variables(char *filename, Port *port)
 
        write_var(debug_flag, fp);
        write_var(PostmasterPid, fp);
+#ifdef WIN32
+       write_var(PostmasterHandle, fp);
+#endif
 
        StrNCpy(str_buf, my_exec_path, MAXPGPATH);
        write_array_var(str_buf, fp);
@@ -3289,6 +3309,9 @@ read_backend_variables(char *filename, Port *port)
 
        read_var(debug_flag, fp);
        read_var(PostmasterPid, fp);
+#ifdef WIN32
+       read_var(PostmasterHandle, fp);
+#endif
 
        read_array_var(str_buf, fp);
        StrNCpy(my_exec_path, str_buf, MAXPGPATH);
@@ -3360,7 +3383,7 @@ ShmemBackendArrayRemove(pid_t pid)
        }
 
        ereport(WARNING,
-                       (errmsg_internal("unable to find backend entry with pid %d",
+                       (errmsg_internal("could not find backend entry with pid %d",
                                                         (int) pid)));
 }
 
@@ -3411,22 +3434,22 @@ win32_forkexec(const char *path, char *argv[])
                win32_AddChild(pi.dwProcessId, pi.hProcess);
        }
 
-       if (!DuplicateHandle(GetCurrentProcess(),
-                                                pi.hProcess,
-                                                GetCurrentProcess(),
-                                                &childHandleCopy,
-                                                0,
-                                                FALSE,
-                                                DUPLICATE_SAME_ACCESS))
+       if (DuplicateHandle(GetCurrentProcess(),
+                                               pi.hProcess,
+                                               GetCurrentProcess(),
+                                               &childHandleCopy,
+                                               0,
+                                               FALSE,
+                                               DUPLICATE_SAME_ACCESS) == 0)
                ereport(FATAL,
-                               (errmsg_internal("failed to duplicate child handle: %d",
+                               (errmsg_internal("could not duplicate child handle: %d",
                                                                 (int) GetLastError())));
 
        waiterThread = CreateThread(NULL, 64 * 1024, win32_sigchld_waiter,
                                                                (LPVOID) childHandleCopy, 0, NULL);
        if (!waiterThread)
                ereport(FATAL,
-                               (errmsg_internal("failed to create sigchld waiter thread: %d",
+                               (errmsg_internal("could not create sigchld waiter thread: %d",
                                                                 (int) GetLastError())));
        CloseHandle(waiterThread);
 
@@ -3460,7 +3483,7 @@ win32_AddChild(pid_t pid, HANDLE handle)
        }
        else
                ereport(FATAL,
-                               (errmsg_internal("unable to add child entry with pid %lu",
+                               (errmsg_internal("no room for child entry with pid %lu",
                                                                 (unsigned long) pid)));
 }
 
@@ -3486,7 +3509,7 @@ win32_RemoveChild(pid_t pid)
        }
 
        ereport(WARNING,
-                       (errmsg_internal("unable to find child entry with pid %lu",
+                       (errmsg_internal("could not find child entry with pid %lu",
                                                         (unsigned long) pid)));
 }
 
@@ -3562,7 +3585,7 @@ win32_sigchld_waiter(LPVOID param)
        if (r == WAIT_OBJECT_0)
                pg_queue_signal(SIGCHLD);
        else
-               fprintf(stderr, "ERROR: Failed to wait on child process handle: %i\n",
+               fprintf(stderr, "ERROR: failed to wait on child process handle: %d\n",
                                (int) GetLastError());
        CloseHandle(procHandle);
        return 0;
index 4efa4adac6f80ec6d474eac77e924208f1028a75..c8eaa63c1145fbaf0846746d546d486d1422cb10 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.14 2004/05/29 22:48:20 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.15 2004/05/30 03:50:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -18,6 +18,7 @@
 #include <unistd.h>
 
 #include "miscadmin.h"
+#include "postmaster/postmaster.h"
 #include "storage/pmsignal.h"
 #include "storage/shmem.h"
 
@@ -115,9 +116,6 @@ PostmasterIsAlive(bool amDirectChild)
                return (kill(PostmasterPid, 0) == 0);
        }
 #else /* WIN32 */
-       /*
-        * XXX needs to be implemented by somebody
-        */
-       return true;
+       return (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT);
 #endif /* WIN32 */
 }
index d349018f4b5ecf0e56a3843c93756328cb0a3bcb..301f7652ffefc70e5b398a0f295dadbb69403679 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/postmaster/postmaster.h,v 1.1 2004/05/29 22:48:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/postmaster/postmaster.h,v 1.2 2004/05/30 03:50:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,6 +30,10 @@ extern bool Log_connections;
 extern bool log_hostname;
 extern char *rendezvous_name;
 
+#ifdef WIN32
+extern HANDLE PostmasterHandle;
+#endif
+
 
 extern int     PostmasterMain(int argc, char *argv[]);
 extern void ClosePostmasterPorts(void);