* perthread.h (vfork_save): Add ctty, sid, pgid, exitval fields.
(vfork_save::restore_pid): New method. (vfork_save::restore_exit): New method. * fork.cc (vfork): Save ctty, sid, pgid and restore them when returning to "parent". Use exitval field if exiting but never created a new process. * syscalls.cc (setsid): Detect when in "vfork" and force an actual fork so that pid will be allocated (UGLY!). (getsid): New function. * dcrt0.cc (do_exit): Use vfork_save::restore_exit method for returning from a vfork. * spawn.cc (spawnve): Use vfork_save::{restore_pid,restore_exit} methods for returning from vfork. * cygwin.din: Export getsid. * include/cygwin/version.h: Bump api minor number. * malloc.cc: #ifdef sYSTRIm for when MORECORE_CANNOT_TRIM is true.
This commit is contained in:
@ -48,14 +48,30 @@ public:
|
||||
};
|
||||
|
||||
#if defined (NEED_VFORK)
|
||||
struct vfork_save
|
||||
class vfork_save
|
||||
{
|
||||
int pid;
|
||||
jmp_buf j;
|
||||
int exitval;
|
||||
public:
|
||||
int pid;
|
||||
DWORD frame[100];
|
||||
char **vfork_ebp;
|
||||
char **vfork_esp;
|
||||
int ctty;
|
||||
pid_t sid;
|
||||
pid_t pgid;
|
||||
int is_active () { return pid < 0; }
|
||||
void restore_pid (int val)
|
||||
{
|
||||
pid = val;
|
||||
longjmp (j, 1);
|
||||
}
|
||||
void restore_exit (int val)
|
||||
{
|
||||
exitval = val;
|
||||
longjmp (j, 1);
|
||||
}
|
||||
friend int vfork ();
|
||||
};
|
||||
|
||||
class per_thread_vfork : public per_thread
|
||||
|
Reference in New Issue
Block a user