![]() |
![]() |
00001 #include "SubProcess.h" 00002 #include "FileDescriptorHandler.h" 00003 00004 #include "EventFilter/Utilities/interface/TriggerReportDef.h" 00005 00006 namespace evf{ 00007 00008 SubProcess &SubProcess::operator=(const SubProcess &b) 00009 { 00010 ind_=b.ind_; 00011 pid_=b.pid_; 00012 alive_=b.alive_; 00013 mqm_=b.mqm_; 00014 mqs_=b.mqs_; 00015 save_nbp_ = b.save_nbp_; 00016 save_nba_ = b.save_nba_; 00017 save_ndqm_ = b.save_ndqm_; 00018 save_scalers_ = b.save_scalers_; 00019 restart_countdown_=b.restart_countdown_; 00020 reported_inconsistent_=b.reported_inconsistent_; 00021 postponed_trigger_updates_ = b.postponed_trigger_updates_; 00022 return *this; 00023 } 00024 00025 void SubProcess::disconnect() 00026 { 00027 mqm_->drain(); 00028 mqs_->drain(); 00029 mqs_->disconnect(); 00030 mqm_->disconnect(); 00031 save_nbp_ = 0; 00032 save_nba_ = 0; 00033 save_ndqm_ = 0; 00034 save_scalers_ = 0; 00035 } 00036 00037 void SubProcess::setStatus(int st){ 00038 alive_ = st; 00039 if(alive_ != 1) //i.e. process is no longer alive 00040 { 00041 //save counters after last update 00042 save_nbp_ = prg_.nbp; 00043 save_nba_ = prg_.nba; 00044 save_ndqm_ = prg_.dqm; 00045 save_scalers_ = prg_.trp; 00046 } 00047 } 00048 00049 void SubProcess::setParams(struct prg *p) 00050 { 00051 prg_.ls = p->ls; 00052 prg_.eols = p->eols; 00053 prg_.ps = p->ps; 00054 prg_.nbp = p->nbp + save_nbp_; 00055 prg_.nba = p->nba + save_nba_; 00056 prg_.Ms = p->Ms; 00057 prg_.ms = p->ms; 00058 prg_.dqm = p->dqm + save_ndqm_; 00059 prg_.trp = p->trp + save_scalers_; 00060 } 00061 00062 int SubProcess::forkNew() 00063 { 00064 mqm_->drain(); 00065 mqs_->drain(); 00066 pid_t retval = -1; 00067 retval = fork(); 00068 reported_inconsistent_ = false; 00069 nfound_invalid_ = 0; 00070 postponed_trigger_updates_.clear(); 00071 if(retval>0) 00072 { 00073 pid_ = retval; 00074 alive_=1; 00075 } 00076 if(retval==0) 00077 { 00078 // freopen(filename,"w",stdout); // send all console output from children to /dev/null 00079 freopen("/dev/null","w",stderr); 00080 FileDescriptorHandler a; //handle socket file descriptors left open at fork 00081 sqm_ = new SlaveQueue(monitor_queue_offset_+ind_); 00082 sqs_ = new SlaveQueue(ind_); 00083 } 00084 return retval; 00085 } 00086 void SubProcess::add_postponed_trigger_update(MsgBuf &b) 00087 { 00088 postponed_trigger_updates_.push_back(b); 00089 } 00090 bool SubProcess::check_postponed_trigger_update(MsgBuf &b, unsigned int ls) 00091 { 00092 for(std::vector<MsgBuf>::iterator i = postponed_trigger_updates_.begin(); i != postponed_trigger_updates_.end(); i++) 00093 { 00094 TriggerReportStatic *trp = (TriggerReportStatic *)((*i)->mtext); 00095 if(trp->lumiSection == ls){ 00096 b = (*i); 00097 postponed_trigger_updates_.erase(i); 00098 return true; 00099 } 00100 } 00101 return false; 00102 } 00103 00104 00105 }