* autoload.cc: Autoload ToolHelp functions.
+Mon Jun 11 13:55:04 2001 Christopher Faylor <cgf@cygnus.com>
+
+ * pinfo.cc: Use autoloaded ToolHelp functions throughout for Win9x.
+ * autoload.cc: Autoload ToolHelp functions.
+
Mon Jun 11 11:18:56 2001 Christopher Faylor <cgf@cygnus.com>
* path.cc (chdir): Fix call to path_conv constructor so that it REALLY
LoadDLLfuncEx (SignalObjectAndWait, 16, kernel32, 1)
LoadDLLfuncEx (CancelIo, 4, kernel32, 1)
+LoadDLLfuncEx (Process32First, 8, kernel32, 1)
+LoadDLLfuncEx (Process32Next, 8, kernel32, 1)
+LoadDLLfuncEx (CreateToolhelp32Snapshot, 8, kernel32, 1)
LoadDLLfuncEx (waveOutGetNumDevs, 0, winmm, 1)
LoadDLLfuncEx (waveOutOpen, 24, winmm, 1)
#include <tlhelp32.h>
-typedef HANDLE (WINAPI * CREATESNAPSHOT) (DWORD, DWORD);
-typedef BOOL (WINAPI * PROCESSWALK) (HANDLE, LPPROCESSENTRY32);
-typedef BOOL (WINAPI * CLOSESNAPSHOT) (HANDLE);
-
-static NO_COPY CREATESNAPSHOT myCreateToolhelp32Snapshot = NULL;
-static NO_COPY PROCESSWALK myProcess32First = NULL;
-static NO_COPY PROCESSWALK myProcess32Next = NULL;
-
#define slop_pidlist 200
#define size_pidlist(i) (sizeof (pidlist[0]) * ((i) + 1))
#define size_pinfolist(i) (sizeof (pinfolist[0]) * ((i) + 1))
{
DWORD nelem = 0;
- HANDLE h = myCreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
+ HANDLE h = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
if (!h)
{
system_printf ("Couldn't create process snapshot, %E");
PROCESSENTRY32 proc;
proc.dwSize = sizeof (proc);
- if (myProcess32First (h, &proc))
+ if (Process32First (h, &proc))
do
{
if (proc.th32ProcessID)
add (nelem, winpid, proc.th32ProcessID);
}
- while (myProcess32Next (h, &proc));
+ while (Process32Next (h, &proc));
CloseHandle (h);
return nelem;
DWORD
winpids::enum_init (bool winpid)
{
- HINSTANCE h;
if (os_being_run == winNT)
enum_processes = &winpids::enumNT;
else
- {
- h = GetModuleHandle ("kernel32.dll");
- myCreateToolhelp32Snapshot = (CREATESNAPSHOT)
- GetProcAddress(h, "CreateToolhelp32Snapshot");
- myProcess32First = (PROCESSWALK)
- GetProcAddress (h, "Process32First");
- myProcess32Next = (PROCESSWALK)
- GetProcAddress (h, "Process32Next");
- if (!myCreateToolhelp32Snapshot || !myProcess32First || !myProcess32Next)
- {
- system_printf ("Couldn't find toolhelp processes, %E");
- return 0;
- }
-
- enum_processes = &winpids::enum9x;
- }
+ enum_processes = &winpids::enum9x;
return (this->*enum_processes) (winpid);
}
#define no_signals_available() (!hwait_sig || !sig_loop_wait)
-#define ZOMBIEMAX ((int) (sizeof (zombies) / sizeof (zombies[0])))
+#define ZOMBIEMAX ((int) (sizeof (zombies) / sizeof (zombies[0])) - 1)
/*
* Global variables
sigproc_printf ("pid %d[%d] terminated, handle %p, nchildren %d, nzombies %d",
pchildren[val]->pid, val, hchildren[val], nchildren, nzombies);
- if (nzombies >= ZOMBIEMAX)
- sigproc_printf ("Hit zombie maximum %d", nzombies);
- else
- {
- zombies[nzombies] = pchildren[val]; // Add to zombie array
- zombies[nzombies++]->process_state = PID_ZOMBIE;// Walking dead
- }
+
+ int thiszombie;
+ thiszombie = nzombies;
+ zombies[nzombies] = pchildren[val]; // Add to zombie array
+ zombies[nzombies++]->process_state = PID_ZOMBIE;// Walking dead
+
sigproc_printf ("removing [%d], pid %d, handle %p, nchildren %d",
val, pchildren[val]->pid, hchildren[val], nchildren);
if ((int) val < --nchildren)
hchildren[val] = hchildren[nchildren];
pchildren[val] = pchildren[nchildren];
}
+
+ /* See if we should care about the this terminated process. If we've
+ filled up our table or if we're ignoring SIGCHLD, then we immediately
+ remove the process and move on. Otherwise, this process becomes a zombie
+ which must be reaped by a wait() call. */
+ if (nzombies >= ZOMBIEMAX
+ || myself->getsig (SIGCHLD).sa_handler == (void *) SIG_IGN)
+ {
+ sigproc_printf ("automatically removing zombie %d", thiszombie);
+ remove_zombie (thiszombie);
+ }
+
/* Don't scan the wait queue yet. Caller will send SIGCHLD to this process.
This will cause an eventual scan of waiters. */
break;