1313 *
1414 *Copyright (c) 2001-2003, PostgreSQL Global Development Group
1515 *
16- *$PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.58 2004/02/02 16:37:46 momjian Exp $
16+ *$PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.59 2004/03/09 05:11:52 momjian Exp $
1717 * ----------
1818 */
1919#include "postgres.h"
5151#include "utils/ps_status.h"
5252#include "utils/syscache.h"
5353
54+ #ifdef EXEC_BACKEND
55+ #include "utils/guc.h"
56+ #endif
57+
5458#ifdef WIN32
5559extern pid_t win32_forkexec (const char * path ,char * argv []);
5660#endif
@@ -158,6 +162,17 @@ extern int pgpipe(int handles[2]); /* pgpipe() is in /src/port */
158162 * ------------------------------------------------------------
159163 */
160164
165+ #ifdef EXEC_BACKEND
166+
167+ void
168+ pgstat_init_forkexec_backend (void )
169+ {
170+ Assert (DataDir != NULL );
171+ snprintf (pgStat_fname ,MAXPGPATH ,
172+ PGSTAT_STAT_FILENAME ,DataDir );
173+ }
174+
175+ #endif
161176
162177/* ----------
163178 * pgstat_init() -
@@ -364,9 +379,9 @@ static pid_t
364379pgstat_forkexec (STATS_PROCESS_TYPE procType )
365380{
366381pid_t pid ;
367- char * av [11 ];
382+ char * av [13 ];
368383int ac = 0 ,bufc = 0 ,i ;
369- char pgstatBuf [8 ][MAXPGPATH ];
384+ char pgstatBuf [10 ][MAXPGPATH ];
370385
371386av [ac ++ ]= "postgres" ;
372387switch (procType )
@@ -391,11 +406,15 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
391406snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%d" ,pgStatPipe [0 ]);
392407snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%d" ,pgStatPipe [1 ]);
393408
409+ /* + misc */
410+ snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%d" ,MaxBackends );
411+
394412/* + the pstat file names, and postgres pathname */
395413/* FIXME: [fork/exec] whitespaces in directories? */
396414snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%s" ,pgStat_tmpfname );
397415snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%s" ,pgStat_fname );
398416snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%s" ,pg_pathname );
417+ snprintf (pgstatBuf [bufc ++ ],MAXPGPATH ,"%s" ,DataDir );
399418
400419/* Add to the arg list */
401420Assert (bufc <=lengthof (pgstatBuf ));
@@ -427,16 +446,20 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
427446static void
428447pgstat_parseArgs (PGSTAT_FORK_ARGS )
429448{
430- Assert (argc == 8 );
449+ Assert (argc == 10 );
431450argc = 0 ;
432451pgStatSock = atoi (argv [argc ++ ]);
433452pgStatPmPipe [0 ]= atoi (argv [argc ++ ]);
434453pgStatPmPipe [1 ]= atoi (argv [argc ++ ]);
435454pgStatPipe [0 ]= atoi (argv [argc ++ ]);
436455pgStatPipe [1 ]= atoi (argv [argc ++ ]);
456+ MaxBackends = atoi (argv [argc ++ ]);
437457strncpy (pgStat_tmpfname ,argv [argc ++ ],MAXPGPATH );
438458strncpy (pgStat_fname ,argv [argc ++ ],MAXPGPATH );
439459strncpy (pg_pathname ,argv [argc ++ ],MAXPGPATH );
460+ DataDir = strdup (argv [argc ++ ]);
461+
462+ read_nondefault_variables ();
440463}
441464
442465#endif
@@ -504,7 +527,7 @@ pgstat_start(void)
504527#endif
505528
506529#ifdef EXEC_BACKEND
507- switch ((pgStatSock = (int )pgstat_forkexec (STAT_PROC_BUFFER )))
530+ switch ((pgStatPid = (int )pgstat_forkexec (STAT_PROC_BUFFER )))
508531#else
509532switch ((pgStatPid = (int )fork ()))
510533#endif
@@ -1344,6 +1367,10 @@ pgstat_mainInit(void)
13441367/* In EXEC case we will not have inherited these settings */
13451368IsPostmasterEnvironment = true;
13461369whereToSendOutput = None ;
1370+
1371+ /* Setup global context */
1372+ MemoryContextInit ();/* before any elog'ing can occur */
1373+ InitializeGUCOptions ();
13471374#endif
13481375
13491376MyProcPid = getpid ();/* reset MyProcPid */
@@ -1382,7 +1409,6 @@ NON_EXEC_STATIC void
13821409pgstat_main (PGSTAT_FORK_ARGS )
13831410{
13841411pgstat_mainInit ();/* Note: for *both* EXEC_BACKEND and regular cases */
1385-
13861412#ifdef EXEC_BACKEND
13871413pgstat_parseArgs (argc ,argv );
13881414#endif
@@ -1458,9 +1484,7 @@ pgstat_mainChild(PGSTAT_FORK_ARGS)
14581484HASHCTL hash_ctl ;
14591485
14601486#ifdef EXEC_BACKEND
1461- MemoryContextInit ();/* before any elog'ing can occur */
1462-
1463- pgstat_mainInit ();
1487+ pgstat_mainInit ();/* Note: only in EXEC_BACKEND case */
14641488pgstat_parseArgs (argc ,argv );
14651489#else
14661490MyProcPid = getpid ();/* reset MyProcPid */