mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Refactor fork()-related code. We need to do various housekeeping tasks
before we can invoke fork() -- flush stdio buffers, save and restore the profiling timer on Linux with LINUX_PROFILE, and handle BeOS stuff. This patch moves that code into a single function, fork_process(), instead of duplicating it at the various callsites of fork(). This patch doesn't address the EXEC_BACKEND case; there is room for further cleanup there.
This commit is contained in:
80
src/backend/postmaster/fork_process.c
Normal file
80
src/backend/postmaster/fork_process.c
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* fork_process.c
|
||||
* A simple wrapper on top of fork(). This does not handle the
|
||||
* EXEC_BACKEND case; it might be extended to do so, but it would be
|
||||
* considerably more complex.
|
||||
*
|
||||
* Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/fork_process.c,v 1.1 2005/03/10 07:14:03 neilc Exp $
|
||||
*/
|
||||
#include "postgres.h"
|
||||
#include "postmaster/fork_process.h"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* Wrapper for fork(). Return values are the same as those for fork():
|
||||
* -1 if the fork failed, 0 in the child process, and the PID of the
|
||||
* child in the parent process.
|
||||
*/
|
||||
pid_t
|
||||
fork_process(void)
|
||||
{
|
||||
pid_t result;
|
||||
#ifdef LINUX_PROFILE
|
||||
struct itimerval prof_itimer;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Flush stdio channels just before fork, to avoid double-output
|
||||
* problems. Ideally we'd use fflush(NULL) here, but there are still a
|
||||
* few non-ANSI stdio libraries out there (like SunOS 4.1.x) that
|
||||
* coredump if we do. Presently stdout and stderr are the only stdio
|
||||
* output channels used by the postmaster, so fflush'ing them should
|
||||
* be sufficient.
|
||||
*/
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
#ifdef LINUX_PROFILE
|
||||
/*
|
||||
* Linux's fork() resets the profiling timer in the child process. If
|
||||
* we want to profile child processes then we need to save and restore
|
||||
* the timer setting. This is a waste of time if not profiling,
|
||||
* however, so only do it if commanded by specific -DLINUX_PROFILE
|
||||
* switch.
|
||||
*/
|
||||
getitimer(ITIMER_PROF, &prof_itimer);
|
||||
#endif
|
||||
|
||||
#ifdef __BEOS__
|
||||
/* Specific beos actions before backend startup */
|
||||
beos_before_backend_startup();
|
||||
#endif
|
||||
|
||||
result = fork();
|
||||
if (result == (pid_t) -1)
|
||||
{
|
||||
/* fork failed */
|
||||
#ifdef __BEOS__
|
||||
/* Specific beos backend startup actions */
|
||||
beos_backend_startup_failed();
|
||||
#endif
|
||||
}
|
||||
else if (result == 0)
|
||||
{
|
||||
/* fork succeeded, in child */
|
||||
#ifdef LINUX_PROFILE
|
||||
setitimer(ITIMER_PROF, &prof_itimer, NULL);
|
||||
#endif
|
||||
|
||||
#ifdef __BEOS__
|
||||
/* Specific beos backend startup actions */
|
||||
beos_backend_startup();
|
||||
#endif
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Reference in New Issue
Block a user