* fork.cc (fork_parent): Return EAGAIN when can't record pid.

* pinfo.h (pinfo::remember): Return value of call to proc_subproc.
* sigproc.cc (proc_subproc): Return error if can't record pid.
This commit is contained in:
Christopher Faylor 2001-02-10 04:20:52 +00:00
parent 1e667f61b7
commit cde0c2fbca
4 changed files with 26 additions and 6 deletions

View File

@ -1,3 +1,9 @@
Fri Feb 9 23:19:01 2001 Christopher Faylor <cgf@cygnus.com>
* fork.cc (fork_parent): Return EAGAIN when can't record pid.
* pinfo.h (pinfo::remember): Return value of call to proc_subproc.
* sigproc.cc (proc_subproc): Return error if can't record pid.
Fri Feb 9 12:17:27 2001 Christopher Faylor <cgf@cygnus.com>
* syscalls.cc (mknod): Add valid parameters.

View File

@ -514,13 +514,24 @@ out:
be called in subproc handling. */
ProtectHandle1 (pi.hProcess, childhProc);
slow_pid_reuse (pi.hProcess);
/* Fill in fields in the child's process table entry. */
forked->hProcess = pi.hProcess;
forked->dwProcessId = pi.dwProcessId;
forked->copysigs(myself);
forked.remember ();
/* Hopefully, this will succeed. The alternative to doing things this
way is to reserve space prior to calling CreateProcess and then fill
it in afterwards. This requires more bookkeeping than I like, though,
so we'll just do it the easy way. So, terminate any child process if
we can't actually record the pid in the internal table. */
if (!forked.remember ())
{
TerminateProcess (pi.hProcess, 1);
set_errno (EAGAIN);
goto cleanup;
}
slow_pid_reuse (pi.hProcess);
/* Wait for subproc to initialize itself. */
if (!sync_with_child(pi, subproc_ready, TRUE, "waiting for longjmp"))

View File

@ -18,7 +18,7 @@ enum
__SIGOFFSET = 3
};
#define PSIZE 1024
#define PSIZE 63
#include <sys/resource.h>
#include "thread.h"
@ -152,7 +152,7 @@ public:
_pinfo *operator * () const {return procinfo;}
operator _pinfo * () const {return procinfo;}
// operator bool () const {return (int) h;}
void remember () {destroy = 0; proc_subproc (PROC_ADDCHILD, (DWORD) this);}
int remember () {destroy = 0; return proc_subproc (PROC_ADDCHILD, (DWORD) this);}
HANDLE shared_handle () {return h;}
};

View File

@ -246,7 +246,10 @@ proc_subproc (DWORD what, DWORD val)
*/
case PROC_ADDCHILD:
if (nchildren >= PSIZE - 1)
system_printf ("nchildren too large %d", nchildren);
{
rc = 0;
break;
}
pchildren[nchildren] = vchild;
hchildren[nchildren] = vchild->hProcess;
if (!DuplicateHandle (hMainProc, vchild->hProcess, hMainProc, &vchild->pid_handle,