* pinfo.h (pinfo): Un-inline release.
* pinfo.cc (pinfo::release): Move here from pinfo.h. * sigproc.cc (proc_terminate): Remove bogus 'pinfo child' which caused strange destruction of random regions of memory when destructor was invoked.
This commit is contained in:
parent
3c2c374555
commit
fde520bf6c
|
@ -1,3 +1,11 @@
|
||||||
|
Fri Aug 25 23:44:48 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* pinfo.h (pinfo): Un-inline release.
|
||||||
|
* pinfo.cc (pinfo::release): Move here from pinfo.h.
|
||||||
|
* sigproc.cc (proc_terminate): Remove bogus 'pinfo child' which caused
|
||||||
|
strange destruction of random regions of memory when destructor was
|
||||||
|
invoked.
|
||||||
|
|
||||||
Fri Aug 25 21:25:32 2000 Christopher Faylor <cgf@cygnus.com>
|
Fri Aug 25 21:25:32 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* dcrt0.cc (dll_crt0_1): Move set_os_type.
|
* dcrt0.cc (dll_crt0_1): Move set_os_type.
|
||||||
|
|
|
@ -197,7 +197,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h)
|
||||||
{
|
{
|
||||||
if (n == myself->pid)
|
if (n == myself->pid)
|
||||||
{
|
{
|
||||||
child = myself;
|
procinfo = myself;
|
||||||
destroy = 0;
|
destroy = 0;
|
||||||
h = NULL;
|
h = NULL;
|
||||||
return;
|
return;
|
||||||
|
@ -235,16 +235,16 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h)
|
||||||
{
|
{
|
||||||
if (create)
|
if (create)
|
||||||
__seterrno ();
|
__seterrno ();
|
||||||
child = NULL;
|
procinfo = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProtectHandle1 (h, pinfo_shared_handle);
|
ProtectHandle1 (h, pinfo_shared_handle);
|
||||||
child = (_pinfo *) MapViewOfFile (h, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
|
procinfo = (_pinfo *) MapViewOfFile (h, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
|
||||||
|
|
||||||
if (child->process_state & PID_EXECED)
|
if (procinfo->process_state & PID_EXECED)
|
||||||
{
|
{
|
||||||
pid_t realpid = child->pid;
|
pid_t realpid = procinfo->pid;
|
||||||
debug_printf ("execed process windows pid %d, cygwin pid %d", n, realpid);
|
debug_printf ("execed process windows pid %d, cygwin pid %d", n, realpid);
|
||||||
release ();
|
release ();
|
||||||
if (realpid == n)
|
if (realpid == n)
|
||||||
|
@ -255,16 +255,29 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h)
|
||||||
if (created)
|
if (created)
|
||||||
{
|
{
|
||||||
if (!(create & PID_EXECED))
|
if (!(create & PID_EXECED))
|
||||||
child->pid = n;
|
procinfo->pid = n;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
child->pid = myself->pid;
|
procinfo->pid = myself->pid;
|
||||||
child->process_state |= PID_IN_USE | PID_EXECED;
|
procinfo->process_state |= PID_IN_USE | PID_EXECED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy = 1;
|
destroy = 1;
|
||||||
}
|
}
|
||||||
|
void
|
||||||
|
pinfo::release ()
|
||||||
|
{
|
||||||
|
if (h)
|
||||||
|
{
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
if (((DWORD) procinfo & 0x77000000) == 0x61000000) try_to_debug ();
|
||||||
|
#endif
|
||||||
|
UnmapViewOfFile (procinfo);
|
||||||
|
ForceCloseHandle1 (h, pinfo_shared_handle);
|
||||||
|
h = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* DOCTOOL-START
|
/* DOCTOOL-START
|
||||||
|
|
||||||
|
|
|
@ -114,37 +114,29 @@ public:
|
||||||
class pinfo
|
class pinfo
|
||||||
{
|
{
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
_pinfo *child;
|
_pinfo *procinfo;
|
||||||
int destroy;
|
int destroy;
|
||||||
public:
|
public:
|
||||||
void init (pid_t n, DWORD create = 0, HANDLE h = NULL);
|
void init (pid_t n, DWORD create = 0, HANDLE h = NULL);
|
||||||
pinfo () {}
|
pinfo (): h (NULL), procinfo (0), destroy (0) {}
|
||||||
pinfo (_pinfo *x): child (x) {}
|
pinfo (_pinfo *x): procinfo (x) {}
|
||||||
pinfo (pid_t n) {init (n);}
|
pinfo (pid_t n) {init (n);}
|
||||||
pinfo (pid_t n, int create) {init (n, create);}
|
pinfo (pid_t n, int create) {init (n, create);}
|
||||||
void release ()
|
void release ();
|
||||||
{
|
|
||||||
if (h)
|
|
||||||
{
|
|
||||||
UnmapViewOfFile (child);
|
|
||||||
ForceCloseHandle1 (h, pinfo_shared_handle);
|
|
||||||
h = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
~pinfo ()
|
~pinfo ()
|
||||||
{
|
{
|
||||||
if (destroy && child)
|
if (destroy && procinfo)
|
||||||
release ();
|
release ();
|
||||||
}
|
}
|
||||||
|
|
||||||
_pinfo *operator -> () const {return child;}
|
_pinfo *operator -> () const {return procinfo;}
|
||||||
int operator == (pinfo *x) const {return x->child == child;}
|
int operator == (pinfo *x) const {return x->procinfo == procinfo;}
|
||||||
int operator == (pinfo &x) const {return x.child == child;}
|
int operator == (pinfo &x) const {return x.procinfo == procinfo;}
|
||||||
int operator == (void *x) const {return child == x;}
|
int operator == (void *x) const {return procinfo == x;}
|
||||||
int operator == (int x) const {return (int) child == (int) x;}
|
int operator == (int x) const {return (int) procinfo == (int) x;}
|
||||||
int operator == (char *x) const {return (char *) child == x;}
|
int operator == (char *x) const {return (char *) procinfo == x;}
|
||||||
_pinfo *operator * () const {return child;}
|
_pinfo *operator * () const {return procinfo;}
|
||||||
operator _pinfo * () const {return child;}
|
operator _pinfo * () const {return procinfo;}
|
||||||
// operator bool () const {return (int) h;}
|
// operator bool () const {return (int) h;}
|
||||||
void remember () {destroy = 0; proc_subproc (PROC_ADDCHILD, (DWORD) this);}
|
void remember () {destroy = 0; proc_subproc (PROC_ADDCHILD, (DWORD) this);}
|
||||||
HANDLE shared_handle () {return h;}
|
HANDLE shared_handle () {return h;}
|
||||||
|
|
|
@ -499,13 +499,12 @@ proc_terminate (void)
|
||||||
zombies[i]->hProcess = NULL;
|
zombies[i]->hProcess = NULL;
|
||||||
}
|
}
|
||||||
zombies[i]->process_state = PID_NOT_IN_USE; /* CGF FIXME - still needed? */
|
zombies[i]->process_state = PID_NOT_IN_USE; /* CGF FIXME - still needed? */
|
||||||
// zombies[i].release(); // FIXME: this breaks older gccs for some reason
|
zombies[i].release(); // FIXME: this breaks older gccs for some reason
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disassociate my subprocesses */
|
/* Disassociate my subprocesses */
|
||||||
for (i = 0; i < nchildren; i++)
|
for (i = 0; i < nchildren; i++)
|
||||||
{
|
{
|
||||||
pinfo child; /* CGF FIXME */
|
|
||||||
if (pchildren[i]->process_state == PID_NOT_IN_USE)
|
if (pchildren[i]->process_state == PID_NOT_IN_USE)
|
||||||
continue; // Should never happen
|
continue; // Should never happen
|
||||||
if (!pchildren[i]->hProcess)
|
if (!pchildren[i]->hProcess)
|
||||||
|
@ -530,7 +529,7 @@ proc_terminate (void)
|
||||||
pchildren[i]->process_state |= PID_ORPHANED;
|
pchildren[i]->process_state |= PID_ORPHANED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// pchildren[i].release (); // FIXME: this breaks older gccs for some reason
|
pchildren[i].release (); // FIXME: this breaks older gccs for some reason
|
||||||
}
|
}
|
||||||
nchildren = nzombies = 0;
|
nchildren = nzombies = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue