OS2-Proc

 view release on metacpan or  search on metacpan

Proc.xs  view on Meta::CPAN

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

Proc.xs  view on Meta::CPAN

    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 )