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