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
---------------------------(end of broadcast)--------------------------- TIP 8: explain analyze is your friend