mirror of https://github.com/postgres/postgres
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.REL8_1_STABLE
parent
e829f82223
commit
164adc4d39
@ -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; |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
#ifndef FORK_PROCESS_H |
||||||
|
#define FORK_PROCESS_H |
||||||
|
|
||||||
|
#include "postgres.h" |
||||||
|
|
||||||
|
extern pid_t fork_process(void); |
||||||
|
|
||||||
|
#endif /* ! FORK_PROCESS_H */ |
Loading…
Reference in new issue