*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.70 2004/01/06 23:15:22 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.71 2004/01/11 03:49:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#endif
#endif /* NOFIXADE || NOPRINTADE */
+#if defined(WIN32)
+ {
+ WSADATA wsaData;
+ int err = WSAStartup(MAKEWORD(2,2), &wsaData);
+ if (err != 0)
+ {
+ fprintf(stderr, "%s: WSAStartup failed: %d\n",
+ argv[0], err);
+ exit(1);
+ }
+ }
+#endif
+
#ifdef __BEOS__
/* BeOS-specific actions on startup */
beos_startup(argc, argv);
*
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.52 2004/01/09 04:58:09 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.53 2004/01/11 03:49:31 momjian Exp $
* ----------
*/
#include "postgres.h"
#include "utils/ps_status.h"
#include "utils/syscache.h"
+#ifdef WIN32
+extern pid_t win32_forkexec(const char* path, char *argv[]);
+#endif
/* ----------
* GUC parameters
Assert(ac <= lengthof(av));
/* Fire off execv in child */
+#ifdef WIN32
+ pid = win32_forkexec(pg_pathname,av);
+#else
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
/* FIXME: [fork/exec] suggestions for what to do here? Can't call elog... */
abort();
-
+#endif
return pid; /* Parent returns pid */
}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.357 2004/01/09 23:27:20 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.358 2004/01/11 03:49:31 momjian Exp $
*
* NOTES
*
__attribute__((format(printf, 1, 2)));
#ifdef EXEC_BACKEND
+#ifdef WIN32
+pid_t win32_forkexec(const char* path, char *argv[]);
+#endif
+
static pid_t Backend_forkexec(Port *port);
static unsigned long tmpBackendFileNum = 0;
getitimer(ITIMER_PROF, &prof_itimer);
#endif
+#ifdef WIN32
+ /* FIXME: [fork/exec] to be implemented? */
+ abort();
+#else
pid = fork();
+#endif
if (pid == (pid_t) -1)
{
postmaster_error("could not fork background process: %s",
av[ac++] = NULL;
Assert(ac <= lengthof(av));
+#ifdef WIN32
+ pid = win32_forkexec(pg_pathname,av); /* logs on error */
+#else
/* Fire off execv in child */
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
/*
* Probably OK to issue error (unlike pgstat case)
*/
abort();
-
+#endif
return pid; /* Parent returns pid */
}
#ifdef EXEC_BACKEND
/* EXEC_BACKEND case; fork/exec here */
+#ifdef WIN32
+ pid = win32_forkexec(pg_pathname,av); /* logs on error */
+#else
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
{
/* in child */
elog(ERROR,"unable to execv in SSDataBase: %m");
exit(0);
}
+#endif
#else
BootstrapMain(ac, av);
ExitPostmaster(0);
}
#endif
+
+#ifdef WIN32
+
+pid_t win32_forkexec(const char* path, char *argv[])
+{
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ char *p;
+ int i;
+ char cmdLine[MAXPGPATH];
+
+ /* Format the cmd line */
+ snprintf(cmdLine,sizeof(cmdLine),"%s",path);
+ i = 0;
+ while (argv[++i] != NULL)
+ {
+ /* FIXME: [fork/exec] some strlen checks might be prudent here */
+ strcat(cmdLine," ");
+ strcat(cmdLine,argv[i]);
+ }
+
+ /*
+ * The following snippet can disappear when we consistently
+ * use forward slashes.
+ */
+ p = cmdLine;
+ while (*(p++) != '\0')
+ if (*p == '/') *p = '\\';
+
+ memset(&pi,0,sizeof(pi));
+ memset(&si,0,sizeof(si));
+ si.cb = sizeof(si);
+ if (!CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
+ {
+ elog(ERROR,"CreateProcess call failed (%d): %m",GetLastError());
+ return -1;
+ }
+
+ /*
+ FIXME: [fork/exec] we might need to keep the following handle/s,
+ depending on how we implement signalling.
+ */
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+
+ return pi.dwProcessId;
+}
+
+#endif
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.28 2003/12/20 17:31:21 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.29 2004/01/11 03:49:31 momjian Exp $
*
*
* NOTES:
(errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("insufficient shared memory for free space map")));
if (!found)
- MemSet(FreeSpaceMap, 0, sizeof(FSMHeader));
+ MemSet(FreeSpaceMap, 0, sizeof(FSMHeader));
/* Create hashtable for FSMRelations */
info.keysize = sizeof(RelFileNode);
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.7 2003/12/20 17:31:21 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.8 2004/01/11 03:49:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
ShmemInitStruct("PMSignalFlags",NUM_PMSIGNALS * sizeof(sig_atomic_t),&found);
if (!found)
- MemSet(PMSignalFlags, 0, NUM_PMSIGNALS * sizeof(sig_atomic_t));
+ MemSet(PMSignalFlags, 0, NUM_PMSIGNALS * sizeof(sig_atomic_t));
}
/*
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/ipc/shmem.c,v 1.77 2003/12/30 00:03:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/ipc/shmem.c,v 1.78 2004/01/11 03:49:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
SpinLockInit(ShmemLock);
SpinLockInit(ShmemIndexLock);
-
+
/* ShmemIndex can't be set up yet (need LWLocks first) */
ShmemIndex = (HTAB *) NULL;
-
+
/*
* Initialize ShmemVariableCache for transaction manager.
*/
{
MemSet(item.key, 0, SHMEM_INDEX_KEYSIZE);
strncpy(item.key, "ShmemIndex", SHMEM_INDEX_KEYSIZE);
-
+
result = (ShmemIndexEnt *)
hash_search(ShmemIndex, (void *) &item, HASH_ENTER, &found);
if (!result)
ereport(FATAL,
(errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("out of shared memory")));
-
+
Assert(ShmemBootstrap && !found);
-
+
result->location = MAKE_OFFSET(ShmemIndex->hctl);
result->size = SHMEM_INDEX_SIZE;
-
+
ShmemBootstrap = false;
}