* fork.cc (vfork): Store complete stack frame in vfork_save structure for later

recovery.
* spawn.cc (spawn_guts): Reorganize slightly to consolidate handling when there
is a CreateProcess error.
(_spawnve): Only longjmp back to vfork handling when a process has been
successfuly started.
* winsup.h (vfork_save): Extend to include frame info.  Remove obsolete cpplus
conditionals.
This commit is contained in:
Christopher Faylor 2000-08-03 03:02:41 +00:00
parent 6a2ef32105
commit 47026c0785
4 changed files with 33 additions and 22 deletions

View File

@ -1,3 +1,14 @@
Wed Aug 2 22:58:07 2000 Christopher Faylor <cgf@cygnus.com>
* fork.cc (vfork): Store complete stack frame in vfork_save structure
for later recovery.
* spawn.cc (spawn_guts): Reorganize slightly to consolidate handling
when there is a CreateProcess error.
(_spawnve): Only longjmp back to vfork handling when a process has been
successfuly started.
* winsup.h (vfork_save): Extend to include frame info. Remove obsolete
cpplus conditionals.
Wed Aug 2 15:14:51 2000 Christopher Faylor <cgf@cygnus.com> Wed Aug 2 15:14:51 2000 Christopher Faylor <cgf@cygnus.com>
* strace.cc (strace::prntf): Make second argument the function name, * strace.cc (strace::prntf): Make second argument the function name,

View File

@ -639,6 +639,7 @@ vfork ()
return fork (); return fork ();
#else #else
vfork_save *vf = get_vfork_val (); vfork_save *vf = get_vfork_val ();
char **esp, **pp;
if (vf == NULL) if (vf == NULL)
vf = vfork_storage.create (); vf = vfork_storage.create ();
@ -646,9 +647,11 @@ vfork ()
if (!setjmp (vf->j)) if (!setjmp (vf->j))
{ {
vf->pid = -1; vf->pid = -1;
__asm__ volatile ("movl %%esp,%0": "=r" (vf->vfork_esp):);
__asm__ volatile ("movl %%ebp,%0": "=r" (vf->vfork_ebp):); __asm__ volatile ("movl %%ebp,%0": "=r" (vf->vfork_ebp):);
__asm__ volatile ("movl (%%ebp),%0": "=r" (vf->caller_ebp):); for (pp = (char **)vf->frame, esp = vf->vfork_esp;
__asm__ volatile ("movl 4(%%ebp),%0": "=r" (vf->retaddr):); esp <= vf->vfork_ebp + 1; pp++, esp++)
*pp = *esp;
return dtable.vfork_child_dup () ? 0 : -1; return dtable.vfork_child_dup () ? 0 : -1;
} }
@ -662,8 +665,11 @@ vfork ()
exit (exitval); exit (exitval);
} }
vf->vfork_ebp[0] = vf->caller_ebp; __asm__ volatile ("movl %%esp,%0": "=r" (esp):);
vf->vfork_ebp[1] = vf->retaddr; for (pp = (char **)vf->frame, esp = vf->vfork_esp;
esp <= vf->vfork_ebp + 1; pp++, esp++)
*esp = *pp;
return vf->pid; return vf->pid;
#endif #endif
} }

View File

@ -607,7 +607,15 @@ skip_arg_parsing:
final debugging message [this is a general rule for debugging final debugging message [this is a general rule for debugging
messages]. */ messages]. */
if (!rc) if (!rc)
if (!rc)
{
if (spr)
ForceCloseHandle (spr);
__seterrno (); __seterrno ();
syscall_printf ("CreateProcess failed, %E");
return -1;
}
if (mode == _P_OVERLAY) if (mode == _P_OVERLAY)
cygpid = myself->pid; cygpid = myself->pid;
@ -619,13 +627,6 @@ skip_arg_parsing:
rc ? cygpid : (unsigned int) -1, rc ? cygpid : (unsigned int) -1,
prog_arg, one_line.buf); prog_arg, one_line.buf);
if (!rc)
{
if (spr)
ForceCloseHandle (spr);
return -1;
}
MALLOC_CHECK; MALLOC_CHECK;
/* Name the handle similarly to proc_subproc. */ /* Name the handle similarly to proc_subproc. */
ProtectHandle1 (pi.hProcess, childhProc); ProtectHandle1 (pi.hProcess, childhProc);
@ -884,7 +885,7 @@ _spawnve (HANDLE hToken, int mode, const char *path, const char *const *argv,
case _P_DETACH: case _P_DETACH:
subproc_init (); subproc_init ();
ret = spawn_guts (hToken, path, argv, envp, mode); ret = spawn_guts (hToken, path, argv, envp, mode);
if (vf) if (vf && ret > 0)
{ {
vf->pid = ret; vf->pid = ret;
longjmp (vf->j, 1); longjmp (vf->j, 1);

View File

@ -224,9 +224,9 @@ struct vfork_save
{ {
int pid; int pid;
jmp_buf j; jmp_buf j;
DWORD frame[100];
char **vfork_ebp; char **vfork_ebp;
char *caller_ebp; char **vfork_esp;
char *retaddr;
int is_active () { return pid < 0; } int is_active () { return pid < 0; }
}; };
@ -460,9 +460,6 @@ extern void (*__DTOR_LIST__) (void);
/* Initial and increment values for cygwin's fd table */ /* Initial and increment values for cygwin's fd table */
#define NOFILE_INCR 32 #define NOFILE_INCR 32
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/reent.h> #include <sys/reent.h>
#define STD_RBITS (S_IRUSR | S_IRGRP | S_IROTH) #define STD_RBITS (S_IRUSR | S_IRGRP | S_IROTH)
@ -472,10 +469,6 @@ extern "C" {
#define O_NOSYMLINK 0x080000 #define O_NOSYMLINK 0x080000
#define O_DIROPEN 0x100000 #define O_DIROPEN 0x100000
#ifdef __cplusplus
}
#endif
/*************************** Environment ******************************/ /*************************** Environment ******************************/
/* The structure below is used to control conversion to/from posix-style /* The structure below is used to control conversion to/from posix-style