refactoring fork() and EXEC_BACKEND
От | Neil Conway |
---|---|
Тема | refactoring fork() and EXEC_BACKEND |
Дата | |
Msg-id | 4227F258.9040709@samurai.com обсуждение исходный текст |
Список | pgsql-hackers |
While going through the usual motions needed to fork a child process of the postmaster, it occurred to me that there's a fair bit of duplicated code involved. There are also #ifdef for various situations (BeOS, LINUX_PROFILE, and EXEC_BACKEND), which makes the code yet more ugly. I think we could make this a lot cleaner. I'd like to define an API like so: pid_t fork_process(int proc_type); pid_t fork_backend(Port *port); If the process needs to add a lot of private information to the argv in the case of EXEC_BACKEND, they could invoke a third variant: #ifdef EXEC_BACKEND pid_t forkexec_process(int proc_type, int argc, char **argv); #endif (Or possibly using varargs, if that is cleaner for most call-sites). Hopefully most call sites could just use fork_process(). These functions would then take care of all the necessary platform-specific judo: - flush stdout, stderr - invoke BeOS hooks as necessary - save and restore profiling timer, if necessary - if EXEC_BACKEND, use proc_type to lay out the argv for the new process and then invoke internal_forkexec() - otherwise, just invoke fork() - return result to client So, most call sites would be quite nice: pid_t result = fork_process(PROC_TYPE_FOO); if (result == -1) { /* fork failed, in parent */ } else if (result == 0) { /* in child */ } else { /* in parent, `result' is pid of child */ } I'd also like to move the implementation of fork_process() and friends, as well as internal_forkexec(), into a separate file -- I'd rather not clutter up postmaster.c with it. Comments? -Neil
В списке pgsql-hackers по дате отправления: