10
10
*
11
11
*
12
12
* IDENTIFICATION
13
- * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.94 1998/08/25 21:04:36 scrappy Exp $
13
+ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.95 1998/08/25 21:33:59 scrappy Exp $
14
14
*
15
15
* NOTES
16
16
*
92
92
#include "port-protos.h" /* For gethostname() */
93
93
#endif
94
94
#include "storage/fd.h"
95
+ #include "utils/trace.h"
95
96
96
97
#if !defined(MAXINT )
97
98
#define MAXINT INT_MAX
@@ -116,6 +117,8 @@ typedef struct bkend
116
117
long cancel_key ; /* cancel key for cancels for this backend */
117
118
} Backend ;
118
119
120
+ Port * MyBackendPort = NULL ;
121
+
119
122
/* list of active backends. For garbage collection only now. */
120
123
121
124
static Dllist * BackendList ;
@@ -232,6 +235,7 @@ static int processCancelRequest(Port *port, PacketLen len, void *pkt);
232
235
static int initMasks (fd_set * rmask , fd_set * wmask );
233
236
static long PostmasterRandom (void );
234
237
static void RandomSalt (char * salt );
238
+ static void SignalChildren (SIGNAL_ARGS );
235
239
236
240
#ifdef CYR_RECODE
237
241
void GetCharSetByHost (char * , int , char * );
@@ -314,16 +318,16 @@ PostmasterMain(int argc, char *argv[])
314
318
* We need three params so we can display status. If we don't
315
319
* get them from the user, let's make them ourselves.
316
320
*/
317
- if (argc < 4 )
321
+ if (argc < 5 )
318
322
{
319
323
int i ;
320
- char * new_argv [5 ];
324
+ char * new_argv [6 ];
321
325
322
326
for (i = 0 ; i < argc ; i ++ )
323
327
new_argv [i ] = argv [i ];
324
- for (; i < 4 ; i ++ )
328
+ for (; i < 5 ; i ++ )
325
329
new_argv [i ] = "" ;
326
- new_argv [4 ] = NULL ;
330
+ new_argv [5 ] = NULL ;
327
331
328
332
if (!Execfile [0 ] && FindExec (Execfile , argv [0 ], "postmaster" ) < 0 )
329
333
{
@@ -363,6 +367,7 @@ PostmasterMain(int argc, char *argv[])
363
367
hostName = hostbuf ;
364
368
}
365
369
370
+ MyProcPid = getpid ();
366
371
DataDir = getenv ("PGDATA" ); /* default value */
367
372
368
373
opterr = 0 ;
@@ -424,6 +429,7 @@ PostmasterMain(int argc, char *argv[])
424
429
}
425
430
else
426
431
DebugLvl = 1 ;
432
+ pg_options [TRACE_VERBOSE ] = DebugLvl ;
427
433
break ;
428
434
case 'i' :
429
435
NetServer = true;
@@ -535,14 +541,17 @@ PostmasterMain(int argc, char *argv[])
535
541
* Set up signal handlers for the postmaster process.
536
542
*/
537
543
538
- pqsignal (SIGINT , pmdie );
539
- pqsignal (SIGCHLD , reaper );
540
- pqsignal (SIGTTIN , SIG_IGN );
541
- pqsignal (SIGTTOU , SIG_IGN );
542
- pqsignal (SIGHUP , pmdie );
543
- pqsignal (SIGTERM , pmdie );
544
- pqsignal (SIGCONT , dumpstatus );
545
- pqsignal (SIGPIPE , SIG_IGN );
544
+ pqsignal (SIGHUP , pmdie ); /* send SIGHUP, don't die */
545
+ pqsignal (SIGINT , pmdie ); /* die */
546
+ pqsignal (SIGQUIT , pmdie ); /* send SIGTERM and die */
547
+ pqsignal (SIGTERM , pmdie ); /* send SIGTERM,SIGKILL and die */
548
+ pqsignal (SIGPIPE , SIG_IGN ); /* ignored */
549
+ pqsignal (SIGUSR1 , pmdie ); /* send SIGUSR1 and die */
550
+ pqsignal (SIGUSR2 , pmdie ); /* send SIGUSR2, don't die */
551
+ pqsignal (SIGCHLD , reaper ); /* handle child termination */
552
+ pqsignal (SIGTTIN , SIG_IGN ); /* ignored */
553
+ pqsignal (SIGTTOU , SIG_IGN ); /* ignored */
554
+ pqsignal (SIGWINCH , dumpstatus ); /* dump port status */
546
555
547
556
status = ServerLoop ();
548
557
@@ -980,6 +989,52 @@ reset_shared(short port)
980
989
static void
981
990
pmdie (SIGNAL_ARGS )
982
991
{
992
+ int i ;
993
+
994
+ TPRINTF (TRACE_VERBOSE , "pmdie %d" , postgres_signal_arg );
995
+
996
+ /*
997
+ * Kill self and/or children processes depending on signal number.
998
+ */
999
+ switch (postgres_signal_arg ) {
1000
+ case SIGHUP :
1001
+ /* Send SIGHUP to all children (update options flags) */
1002
+ SignalChildren (SIGHUP );
1003
+ /* Don't die */
1004
+ return ;
1005
+ case SIGINT :
1006
+ /* Die without killing children */
1007
+ break ;
1008
+ case SIGQUIT :
1009
+ /* Shutdown all children with SIGTERM */
1010
+ SignalChildren (SIGTERM );
1011
+ /* Don't die */
1012
+ return ;
1013
+ case SIGTERM :
1014
+ /* Shutdown all children with SIGTERM and SIGKILL, then die */
1015
+ SignalChildren (SIGTERM );
1016
+ for (i = 0 ; i < 10 ; i ++ ) {
1017
+ if (!DLGetHead (BackendList )) {
1018
+ break ;
1019
+ }
1020
+ sleep (1 );
1021
+ }
1022
+ if (DLGetHead (BackendList )) {
1023
+ SignalChildren (SIGKILL );
1024
+ }
1025
+ break ;
1026
+ case SIGUSR1 :
1027
+ /* Quick die all children with SIGUSR1 and die */
1028
+ SignalChildren (SIGUSR1 );
1029
+ break ;
1030
+ case SIGUSR2 :
1031
+ /* Send SIGUSR2 to all children (AsyncNotifyHandler) */
1032
+ SignalChildren (SIGUSR2 );
1033
+ /* Don't die */
1034
+ return ;
1035
+ }
1036
+
1037
+ /* exit postmaster */
983
1038
proc_exit (0 );
984
1039
}
985
1040
@@ -1122,6 +1177,35 @@ CleanupProc(int pid,
1122
1177
}
1123
1178
}
1124
1179
1180
+ /*
1181
+ * Send a signal to all chidren processes.
1182
+ */
1183
+ static void
1184
+ SignalChildren (int signal )
1185
+ {
1186
+ Dlelem * curr ,
1187
+ * next ;
1188
+ Backend * bp ;
1189
+ int mypid = getpid ();
1190
+
1191
+ curr = DLGetHead (BackendList );
1192
+ while (curr )
1193
+ {
1194
+ next = DLGetSucc (curr );
1195
+ bp = (Backend * ) DLE_VAL (curr );
1196
+
1197
+ if (bp -> pid != mypid )
1198
+ {
1199
+ TPRINTF (TRACE_VERBOSE ,
1200
+ "SignalChildren: sending signal %d to process %d" ,
1201
+ signal , bp -> pid );
1202
+ kill (bp -> pid , signal );
1203
+ }
1204
+
1205
+ curr = next ;
1206
+ }
1207
+ }
1208
+
1125
1209
/*
1126
1210
* BackendStartup -- start backend process
1127
1211
*
@@ -1342,6 +1426,9 @@ DoBackend(Port *port)
1342
1426
StreamClose (ServerSock_INET );
1343
1427
StreamClose (ServerSock_UNIX );
1344
1428
1429
+ /* Save port for ps status */
1430
+ MyProcPort = port ;
1431
+
1345
1432
/*
1346
1433
* Don't want backend to be able to see the postmaster random number
1347
1434
* generator state. We have to clobber the static random_seed *and*
@@ -1368,7 +1455,13 @@ DoBackend(Port *port)
1368
1455
* a big win.
1369
1456
*/
1370
1457
1458
+ #ifndef linux
1459
+ /*
1460
+ * This doesn't work on linux and overwrites the only valid
1461
+ * pointer to the argv buffer. See PS_INIT_STATUS macro.
1462
+ */
1371
1463
real_argv [0 ] = Execfile ;
1464
+ #endif
1372
1465
1373
1466
/* Tell the backend it is being called from the postmaster */
1374
1467
av [ac ++ ] = "-p" ;
@@ -1386,8 +1479,6 @@ DoBackend(Port *port)
1386
1479
sprintf (debugbuf , "-d%d" , DebugLvl );
1387
1480
av [ac ++ ] = debugbuf ;
1388
1481
}
1389
- else
1390
- av [ac ++ ] = "-Q" ;
1391
1482
1392
1483
/* Pass the requested debugging output file */
1393
1484
if (port -> tty [0 ])
0 commit comments