/* getprocs.c - Grab all available processes and return them to you in a * simple exec list. The list is made up of nodes--the "name" * fields pointing to the process structure. * * Phillip Lindsay (c) 1987 Commodore-Amiga Inc. * You may use this source as long as the copyright notice is left intact. */ #include #include #include #include #include #include #include #include #include #ifdef MANX #include #include #else #include #endif /* getnode() will allocate a node structure for you. And initialize the node * structure with the given values. */ struct Node *getnode(name,type,pri) char *name; UBYTE type,pri; { register struct Node *mynode; mynode = (struct Node *) AllocMem((ULONG)sizeof(*mynode),MEMF_PUBLIC | MEMF_CLEAR); if(!mynode) return((struct Node *)NULL); mynode->ln_Name = name; mynode->ln_Type = type; mynode->ln_Pri = pri; return(mynode); } /* freenode() frees a given Exec node. * Make sure you remove node from any list. */ void freenode(mynode) struct Node *mynode; { FreeMem(mynode,(ULONG)sizeof(*mynode)); } /* getprocs() will grab all processes in the system task's list and * append an exec node to a given list. The node name field filled * with a pointer to the process strcuture. * WARNING: This isn't a casual subroutine. The returned list is valid as * long as a process is not ended or added after this subroutine is * called. To be real safe you should probably check to see if the * process is still around before trying to look at the data structure. */ void getprocs(plist) struct List *plist; /* passed a pointer to a initialized exec list */ { extern struct ExecBase *SysBase; register struct ExecBase *execbase=SysBase; register struct List *proclist; register struct Node *aproc,*bproc; register USHORT count=0; /* I haven't clocked this code, but you shouldn't as a rule stay disabled for * no more than 250ms. I'm have no doubt I'm illegal, but you can't be * too safe when dealing with something that changes with a blink of a * interrupt. */ Disable(); /* first we deal with ourselves... */ if(execbase->ThisTask->tc_Node.ln_Type == NT_PROCESS) { if((bproc=getnode(execbase->ThisTask,0,0))) { AddTail(plist,bproc); } } /* hopefully the added braces make the flow clear */ for(;count <= 1;count++) { if(!count) proclist = &execbase->TaskReady; else proclist = &execbase->TaskWait; if(proclist->lh_TailPred != proclist) { for(aproc = proclist->lh_Head;aproc->ln_Succ;aproc=aproc->ln_Succ) { if(aproc->ln_Type == NT_PROCESS) { if((bproc=getnode(aproc,0,0))) { AddTail(plist,bproc); } } } } } Enable(); } /* end of getprocs() */ /* freeprocs() will free all nodes in a given list. Function assumes nodes where * initialized with getnode(). */ void freeprocs(plist) struct List *plist; { register struct Node *proc; while((proc=RemTail(plist))) freenode(proc); } /* main() { struct List procs; struct Node *proc; NewList(&procs); ** Initialize list header ** getprocs(&procs); ** Fill list ** ** print any processess in list.... if any ** if(procs.lh_TailPred != &procs) for(proc = procs.lh_Head;proc->ln_Succ;proc=proc->ln_Succ) puts( ((struct Process *)proc->ln_Name)->pr_Task.tc_Node.ln_Name ); freeprocs(&procs); } */