1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#include "libMRML/include/CReaperDistributor.h"
#include "libMRML/include/CReaper.h"
CReaperDistributor& getReaperDistributor();
void reaper(int){
getReaperDistributor().reap();
signal(SIGCHLD, reaper);
}
bool CReaperDistributor::addReaper(CReaper* inReaper){
if(inReaper){
mReapers[inReaper->getPID()]=inReaper;
return 1;
}else{
return 0;
}
}
CReaperDistributor::CReaperDistributor(){
signal(SIGCHLD, reaper);
}
CReaperDistributor::~CReaperDistributor(){
for(CReaperMap::iterator i=mReapers.begin();
i!=mReapers.end();
i++){
delete i->second;
}
signal(SIGCHLD, SIG_DFL);
}
void CReaperDistributor::reap(){
int lChildTask;
int lStatus;
while ((lChildTask = waitpid(-1,&lStatus,WNOHANG))>0) {
cout << "R" << endl;
CReaperMap::iterator lFound=mReapers.find(lChildTask);
if(lFound!=mReapers.end())
cout << "reap" << flush;
lFound->second->reap();
}
}
CReaperDistributor* gReaperDistributor(0);
CReaperDistributor& getReaperDistributor(){
if(gReaperDistributor){
return *gReaperDistributor;
}else{
return *(gReaperDistributor=new CReaperDistributor());
}
}
|