aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-05-30 03:50:15 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-05-30 03:50:15 +0000
commitc6719a2784e998d47713de78d284eec5ba8fd976 (patch)
tree83e2c6efafc183f89f7731b705b494ab8c97ab1e
parent076a055acf3c55314de267c62b03191586d79cf6 (diff)
downloadpostgresql-c6719a2784e998d47713de78d284eec5ba8fd976.tar.gz
postgresql-c6719a2784e998d47713de78d284eec5ba8fd976.zip
Implement new PostmasterIsAlive() check for WIN32, per Claudio Natoli.
In passing, align a few error messages with the style guide.
-rw-r--r--src/backend/postmaster/postmaster.c51
-rw-r--r--src/backend/storage/ipc/pmsignal.c8
-rw-r--r--src/include/postmaster/postmaster.h6
3 files changed, 45 insertions, 20 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index e7186c01b39..6a0cfbf052b 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -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;
diff --git a/src/backend/storage/ipc/pmsignal.c b/src/backend/storage/ipc/pmsignal.c
index 4efa4adac6f..c8eaa63c114 100644
--- a/src/backend/storage/ipc/pmsignal.c
+++ b/src/backend/storage/ipc/pmsignal.c
@@ -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 */
}
diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h
index d349018f4b5..301f7652ffe 100644
--- a/src/include/postmaster/postmaster.h
+++ b/src/include/postmaster/postmaster.h
@@ -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);