OS2-Proc
view release on metacpan or search on metacpan
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
SV *
proc_info_int(int pid, int flags)
{
PQTOPLEVEL top;
PQPROCESS procdata;
PQTHREAD threads;
PQMODULE moddata;
SV *sv;
AV *top_av, *procs_av, *mods_av;
ULONG rc;
/* It is not safe to get an info about a non-existing PID until
circa W3fp18. This call is available starting from Warp3. */
if (pid && CheckOSError(DosVerifyPidTid(pid,1)))
return Nullsv;
mods_av = newAV();
sv = newRV((SV*)top_av);
SvREFCNT_dec(top_av); /* Ouch! */
av_push(top_av, newRV((SV*)procs_av));
SvREFCNT_dec(procs_av); /* Ouch! */
av_push(top_av, newRV((SV*)mods_av));
SvREFCNT_dec(mods_av); /* Ouch! */
procdata = top->procdata;
while (procdata && procdata->rectype == 0x01) {
AV *proc_av = newAV();
AV *threads_av = newAV();
AV *dlls_av = newAV();
int dll_c = 0;
av_push(procs_av, newRV_noinc((SV*)proc_av));
av_push(proc_av, newRV_noinc((SV*)threads_av));
av_push(proc_av, newSViv(procdata->pid));
av_push(proc_av, newSViv(procdata->ppid));
av_push(proc_av, newSViv(procdata->type));
av_push(proc_av, newSViv(procdata->state));
av_push(proc_av, newSViv(procdata->sessid));
av_push(proc_av, newSViv(procdata->hndmod));
av_push(proc_av, newSViv(procdata->threadcnt));
av_push(proc_av, newSViv(procdata->privsem32cnt));
av_push(proc_av, newSViv(procdata->sem16cnt));
av_push(proc_av, newSViv(procdata->dllcnt));
av_push(proc_av, newSViv(procdata->shrmemcnt));
av_push(proc_av, newSViv(procdata->fdscnt));
av_push(proc_av, newRV_noinc((SV*)dlls_av));
while (dll_c < procdata->dllcnt) {
av_push(dlls_av, newSViv(procdata->dlls[dll_c++]));
}
threads = procdata->threads;
while (threads && threads->rectype == 0x100) { /* Thread block. */
AV *thread_av = newAV();
av_push(threads_av, newRV_noinc((SV*)thread_av));
av_push(thread_av, newSViv(threads->threadid));
av_push(thread_av, newSViv(threads->slotid));
av_push(thread_av, newSViv(threads->sleepid));
av_push(thread_av, newSViv(threads->priority));
av_push(thread_av, newSViv(threads->systime));
av_push(thread_av, newSViv(threads->usertime));
av_push(thread_av, newSViv(threads->state));
threads++;
}
procdata = (PQPROCESS) threads; /* Next process data. */
}
/*
if (procdata)
warn("After: procdata->rectype = 0x%x", procdata->rectype);
*/
moddata = top->moddata;
while (moddata) {
AV *mod_av = newAV();
int handles = moddata->refcnt;
av_push(mods_av, newRV((SV*)mod_av));
SvREFCNT_dec(mod_av); /* Ouch! */
av_push(mod_av, newSViv(moddata->hndmod));
( run in 0.245 second using v1.01-cache-2.11-cpan-454fe037f31 )