int GWEN_Process_ModuleFini(void) { GWEN_PROCESS *pr, *prnext; pr=GWEN_Process_ProcessList; while(pr) { prnext=pr->next; pr->usage=1; GWEN_Process_free(pr); pr=prnext; } /* while */ return 0; }
void GWEN_Process_SignalHandler(int s) { int status; pid_t pid; switch (s) { case SIGCHLD: /* try to get the status */ pid=waitpid(0, &status, WNOHANG); if (pid==-1) { DBG_DEBUG(GWEN_LOGDOMAIN, "waitdpid(%d): %s", 0, strerror(errno)); } else if (pid==0) { /* process still running ?! */ DBG_DEBUG(GWEN_LOGDOMAIN, "Got a SIGCHLD but no child terminated ??"); } else { GWEN_PROCESS *pr; /* som process terminated */ pr=GWEN_Process_FindProcess(pid); if (!pr) { DBG_NOTICE(GWEN_LOGDOMAIN, "No infomation about process \"%d\" available", (int)pid); } else { GWEN_Process_MakeState(pr, status); /* remove from list. If this process data is not used by the * aplication it will now be freed, otherwise only the usage * counter is decremented */ GWEN_Process_free(pr); } } break; default: DBG_ERROR(GWEN_LOGDOMAIN, "Got unhandled signal \"%d\"", s); break; } /* switch */ }