* 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:
Christopher Faylor 2000-08-26 03:48:37 +00:00
parent 3c2c374555
commit fde520bf6c
4 changed files with 44 additions and 32 deletions

View File

@ -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.

View File

@ -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

View File

@ -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;}

View File

@ -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;