00001
00002
00003
00004
00005
00006
00007
00009
00010 #include "EventFilter/ResourceBroker/interface/FUResourceBroker.h"
00011 #include "EventFilter/ResourceBroker/interface/SMEventScheduler.h"
00012
00013 #include "EventFilter/ResourceBroker/interface/FUResource.h"
00014 #include "EventFilter/ResourceBroker/interface/BUProxy.h"
00015 #include "EventFilter/ResourceBroker/interface/SMProxy.h"
00016 #include "EventFilter/ResourceBroker/interface/SoapUtils.h"
00017
00018 #include "i2o/Method.h"
00019 #include "interface/shared/i2oXFunctionCodes.h"
00020 #include "xcept/tools.h"
00021
00022 #include "toolbox/mem/HeapAllocator.h"
00023 #include "toolbox/mem/Reference.h"
00024 #include "toolbox/mem/MemoryPoolFactory.h"
00025 #include "toolbox/mem/exception/Exception.h"
00026
00027 #include "xoap/MessageReference.h"
00028 #include "xoap/MessageFactory.h"
00029 #include "xoap/SOAPEnvelope.h"
00030 #include "xoap/SOAPBody.h"
00031 #include "xoap/domutils.h"
00032 #include "xoap/Method.h"
00033
00034 #include "cgicc/CgiDefs.h"
00035 #include "cgicc/Cgicc.h"
00036 #include "cgicc/FormEntry.h"
00037 #include "cgicc/HTMLClasses.h"
00038
00039 #include <signal.h>
00040 #include <iostream>
00041 #include <sstream>
00042
00043 using std::string;
00044 using std::cout;
00045 using std::endl;
00046 using std::stringstream;
00047 using std::vector;
00048 using namespace evf;
00049 using namespace evf::rb_statemachine;
00050
00052
00054
00055
00056 FUResourceBroker::FUResourceBroker(xdaq::ApplicationStub *s) :
00057 xdaq::Application(s),
00058 res_(new SharedResources(getApplicationLogger())) {
00059
00060 bindStateMachineCallbacks();
00061
00062 res_->gui_ = new IndependentWebGUI(this);
00063 res_->gui_->setVersionString("Changeset: 3.05.2012-V1.055");
00064
00065
00066 fsm_.reset(new RBStateMachine(this, res_));
00067
00068
00069 fsm_->initiate();
00070
00071
00072 eventScheduler_ = new SMEventScheduler(fsm_, res_->commands_);
00073
00074
00075 url_ = getApplicationDescriptor()->getContextDescriptor()->getURL() + "/"
00076 + getApplicationDescriptor()->getURN();
00077 class_ = getApplicationDescriptor()->getClassName();
00078 instance_ = getApplicationDescriptor()->getInstance();
00079 res_->sourceId_ = class_.toString() + "_" + instance_.toString();
00080
00081
00082 i2o::bind(this, &FUResourceBroker::I2O_FU_TAKE_Callback, I2O_FU_TAKE,
00083 XDAQ_ORGANIZATION_ID);
00084 i2o::bind(this, &FUResourceBroker::I2O_FU_DATA_DISCARD_Callback,
00085 I2O_FU_DATA_DISCARD, XDAQ_ORGANIZATION_ID);
00086 i2o::bind(this, &FUResourceBroker::I2O_FU_DQM_DISCARD_Callback,
00087 I2O_FU_DQM_DISCARD, XDAQ_ORGANIZATION_ID);
00088 i2o::bind(this, &FUResourceBroker::I2O_EVM_LUMISECTION_Callback,
00089 I2O_EVM_LUMISECTION, XDAQ_ORGANIZATION_ID);
00090
00091
00092 xgi::bind(this, &evf::FUResourceBroker::webPageRequest, "Default");
00093
00094 vector<toolbox::lang::Method*> methods = res_->gui_->getMethods();
00095 vector<toolbox::lang::Method*>::iterator it;
00096 for (it = methods.begin(); it != methods.end(); ++it) {
00097 if ((*it)->type() == "cgi") {
00098 string name = static_cast<xgi::MethodSignature*> (*it)->name();
00099 xgi::bind(this, &evf::FUResourceBroker::webPageRequest, name);
00100 }
00101 }
00102 xgi::bind(this, &evf::FUResourceBroker::customWebPage, "customWebPage");
00103
00104
00105 string i2oPoolName = res_->sourceId_ + "_i2oPool";
00106 try {
00107 toolbox::mem::HeapAllocator *allocator =
00108 new toolbox::mem::HeapAllocator();
00109 toolbox::net::URN urn("toolbox-mem-pool", i2oPoolName);
00110 toolbox::mem::MemoryPoolFactory* poolFactory =
00111 toolbox::mem::getMemoryPoolFactory();
00112 res_->i2oPool_ = poolFactory->createPool(urn, allocator);
00113 } catch (toolbox::mem::exception::Exception& e) {
00114 string s = "Failed to create pool: " + i2oPoolName;
00115 LOG4CPLUS_FATAL(res_->log_, s);
00116 XCEPT_RETHROW(xcept::Exception, s, e);
00117 }
00118
00119
00120 exportParameters();
00121
00122
00123 fsm_->findRcmsStateListener(this);
00124
00125
00126 getApplicationDescriptor()->setAttribute("icon", "/evf/images/rbicon.jpg");
00127
00128
00129 }
00130
00131
00132 FUResourceBroker::~FUResourceBroker() {
00133 delete eventScheduler_;
00134 }
00135
00137
00139
00140
00141 void FUResourceBroker::bindStateMachineCallbacks() {
00142 xoap::bind(this, &FUResourceBroker::handleFSMSoapMessage, "Configure",
00143 XDAQ_NS_URI);
00144 xoap::bind(this, &FUResourceBroker::handleFSMSoapMessage, "Enable",
00145 XDAQ_NS_URI);
00146 xoap::bind(this, &FUResourceBroker::handleFSMSoapMessage, "Stop",
00147 XDAQ_NS_URI);
00148 xoap::bind(this, &FUResourceBroker::handleFSMSoapMessage, "Halt",
00149 XDAQ_NS_URI);
00150 }
00151
00152
00153 bool FUResourceBroker::waitForStateChange(string initialState,
00154 int timeoutMicroSec) {
00155 timeval start;
00156 timeval now;
00157
00158 gettimeofday(&start, 0);
00159
00160 while (fsm_->getExternallyVisibleState().compare(initialState) == 0) {
00161 gettimeofday(&now, 0);
00162 if (now.tv_usec <= start.tv_usec + timeoutMicroSec)
00163 ::usleep(50000);
00164 else
00165 return false;
00166 }
00167 return true;
00168 }
00169
00171
00173
00174 xoap::MessageReference FUResourceBroker::handleFSMSoapMessage(
00175 xoap::MessageReference msg) throw (xoap::exception::Exception) {
00176
00177 string errorMsg;
00178 xoap::MessageReference returnMsg;
00179
00180
00181 string initialState = fsm_->getExternallyVisibleState();
00182
00183 try {
00184 errorMsg
00185 = "Failed to extract FSM event and parameters from SOAP message: ";
00186 string command = soaputils::extractParameters(msg, this);
00187
00188 errorMsg = "Failed to put a '" + command
00189 + "' state machine event into command queue: ";
00190
00191 if (command == "Configure") {
00192
00193 EventPtr stMachEvent(new Configure());
00194 res_->commands_.enqEvent(stMachEvent);
00195
00196 } else if (command == "Enable") {
00197
00198 EventPtr stMachEvent(new Enable());
00199 res_->commands_.enqEvent(stMachEvent);
00200
00201 } else if (command == "Stop") {
00202
00203 EventPtr stMachEvent(new Stop());
00204 res_->commands_.enqEvent(stMachEvent);
00205
00206 } else if (command == "Halt") {
00207
00208 EventPtr stMachEvent(new Halt());
00209 res_->commands_.enqEvent(stMachEvent);
00210 }
00211
00212 else {
00213 XCEPT_RAISE(
00214 xcept::Exception,
00215 "Received an unknown state machine event '" + command
00216 + "'.");
00217
00218 EventPtr stMachEvent(new Fail());
00219 res_->commands_.enqEvent(stMachEvent);
00220 }
00221
00222 errorMsg = "Failed to create FSM SOAP reply message: ";
00223
00224
00225
00226 if (waitForStateChange(initialState, 2000000)) {
00227 returnMsg = soaputils::createFsmSoapResponseMsg(command,
00228 fsm_->getExternallyVisibleState());
00229 } else {
00230 XCEPT_RAISE(xcept::Exception,
00231 "FAILED TO REACH TARGET STATE FROM SOAP COMMAND WITHIN TIMEOUT!");
00232
00233 EventPtr stMachEvent(new Fail());
00234 res_->commands_.enqEvent(stMachEvent);
00235 }
00236
00237 } catch (xcept::Exception& e) {
00238 string s = "Exception on FSM Callback!";
00239 LOG4CPLUS_FATAL(res_->log_, s);
00240 XCEPT_RETHROW(xcept::Exception, s, e);
00241 }
00242
00243 return returnMsg;
00244 }
00245
00246
00247 void FUResourceBroker::I2O_FU_TAKE_Callback(toolbox::mem::Reference* bufRef) {
00248
00249 fsm_->transitionReadLock();
00250 const BaseState& currentState = fsm_->getCurrentState();
00251 fsm_->transitionUnlock();
00252
00253 bool success = currentState.take(bufRef);
00254
00255 if (!success) {
00256 stringstream details;
00257 details << " More details -> allocated events: "
00258 << res_->nbAllocatedEvents_ << ", pending requests to BU: "
00259 << res_->nbPendingRequests_ << ", received events: "
00260 << res_->nbReceivedEvents_;
00261 LOG4CPLUS_ERROR(
00262 res_->log_,
00263 "TAKE i2o frame received in state "
00264 << fsm_->getExternallyVisibleState()
00265 << " is being lost! THIS MEANS LOST EVENT DATA!"
00266 << details.str());
00267
00268 bufRef->release();
00269 }
00270 res_->nbTakeReceived_.value_++;
00271 }
00272
00273
00274 void FUResourceBroker::I2O_EVM_LUMISECTION_Callback(
00275 toolbox::mem::Reference* bufRef) {
00276
00277 fsm_->transitionReadLock();
00278 const BaseState& currentState = fsm_->getCurrentState();
00279 fsm_->transitionUnlock();
00280
00281 bool success = currentState.evmLumisection(bufRef);
00282
00283 if (!success) {
00284 LOG4CPLUS_ERROR(
00285 res_->log_,
00286 "EOL i2o frame received in state "
00287 << fsm_->getExternallyVisibleState()
00288 << " is being lost");
00289
00290 }
00291 bufRef->release();
00292 }
00293
00294
00295 void FUResourceBroker::I2O_FU_DATA_DISCARD_Callback(
00296 toolbox::mem::Reference* bufRef) {
00297
00298 fsm_->transitionReadLock();
00299 const BaseState& currentState = fsm_->getCurrentState();
00300 fsm_->transitionUnlock();
00301
00302 res_->lockRSAccess();
00303 if (res_->allowAccessToResourceStructure_)
00304
00305 currentState.discardDataEvent(bufRef);
00306 else {
00307 LOG4CPLUS_WARN(
00308 res_->log_,
00309 "Data Discard I2O message received from SM is being ignored! ShmBuffer was reinitialized!");
00310 bufRef->release();
00311 }
00312 res_->unlockRSAccess();
00313
00314 res_->nbDataDiscardReceived_.value_++;
00315 }
00316
00317
00318 void FUResourceBroker::I2O_FU_DQM_DISCARD_Callback(
00319 toolbox::mem::Reference* bufRef) {
00320
00321 fsm_->transitionReadLock();
00322 const BaseState& currentState = fsm_->getCurrentState();
00323 fsm_->transitionUnlock();
00324
00325 res_->lockRSAccess();
00326 if (res_->allowAccessToResourceStructure_)
00327
00328 currentState.discardDqmEvent(bufRef);
00329 else {
00330 LOG4CPLUS_WARN(
00331 res_->log_,
00332 "DQM Discard I2O message received from SM is being ignored! ShmBuffer was reinitialized!");
00333 bufRef->release();
00334 }
00335 res_->unlockRSAccess();
00336
00337 res_->nbDqmDiscardReceived_.value_++;
00338 }
00339
00340
00341 void FUResourceBroker::webPageRequest(xgi::Input *in, xgi::Output *out)
00342 throw (xgi::exception::Exception) {
00343 string name = in->getenv("PATH_INFO");
00344 if (name.empty())
00345 name = "defaultWebPage";
00346 static_cast<xgi::MethodSignature*> (res_->gui_->getMethod(name))->invoke(
00347 in, out);
00348 }
00349
00350
00351 void FUResourceBroker::actionPerformed(xdata::Event& e) {
00352 res_->lock();
00353
00354 if (0 != res_->resourceStructure_) {
00355
00356
00357
00358 if (e.type() == "urn:xdata-event:ItemGroupRetrieveEvent") {
00359 res_->nbClients_ = res_->resourceStructure_->nbClients();
00360 res_->clientPrcIds_
00361 = res_->resourceStructure_->clientPrcIdsAsString();
00362 res_->nbAllocatedEvents_ = res_->resourceStructure_->nbAllocated();
00363 res_->nbPendingRequests_ = res_->resourceStructure_->nbPending();
00364 res_->nbReceivedEvents_ = res_->resourceStructure_->nbCompleted();
00365 res_->nbSentEvents_ = res_->resourceStructure_->nbSent();
00366 res_->nbSentDqmEvents_ = res_->resourceStructure_->nbSentDqm();
00367 res_->nbSentErrorEvents_ = res_->resourceStructure_->nbSentError();
00368 res_->nbPendingSMDiscards_
00369 = res_->resourceStructure_->nbPendingSMDiscards();
00370 res_->nbPendingSMDqmDiscards_
00371 = res_->resourceStructure_->nbPendingSMDqmDiscards();
00372 res_->nbDiscardedEvents_ = res_->resourceStructure_->nbDiscarded();
00373 res_->nbLostEvents_ = res_->resourceStructure_->nbLost();
00374
00375 res_->nbEolPosted_ = res_->resourceStructure_->nbEolPosted();
00376 res_->nbEolDiscarded_ = res_->resourceStructure_->nbEolDiscarded();
00377 res_->nbDataErrors_ = res_->resourceStructure_->nbErrors();
00378 res_->nbCrcErrors_ = res_->resourceStructure_->nbCrcErrors();
00379 res_->nbAllocateSent_ = res_->resourceStructure_->nbAllocSent();
00380 res_->dataErrorFlag_.value_ = (res_->nbCrcErrors_.value_ != 0u
00381 + ((res_->nbDataErrors_.value_ != 0u) << 1)
00382 + ((res_->nbLostEvents_.value_ != 0u) << 2)
00383 + ((res_->nbTimeoutsWithEvent_.value_ != 0u) << 3)
00384 + ((res_->nbTimeoutsWithoutEvent_.value_ != 0u) << 4)
00385 + ((res_->nbSentErrorEvents_.value_ != 0u) << 5));
00386
00387 } else if (e.type() == "ItemChangedEvent") {
00388
00389 string item = dynamic_cast<xdata::ItemChangedEvent&> (e).itemName();
00390
00391 if (item == "doFedIdCheck")
00392 FUResource::doFedIdCheck(res_->doFedIdCheck_);
00393 if (item == "useEvmBoard")
00394 FUResource::useEvmBoard(res_->useEvmBoard_);
00395 if (item == "doCrcCheck")
00396 res_->resourceStructure_->setDoCrcCheck(res_->doCrcCheck_);
00397 if (item == "doDumpEvents")
00398 res_->resourceStructure_->setDoDumpEvents(res_->doDumpEvents_);
00399 }
00400
00401
00402 } else {
00403 res_->nbClients_ = 0;
00404 res_->clientPrcIds_ = "";
00405 res_->nbAllocatedEvents_ = 0;
00406 res_->nbPendingRequests_ = 0;
00407 res_->nbReceivedEvents_ = 0;
00408 res_->nbSentEvents_ = 0;
00409 res_->nbSentDqmEvents_ = 0;
00410 res_->nbSentErrorEvents_ = 0;
00411 res_->nbPendingSMDiscards_ = 0;
00412 res_->nbPendingSMDqmDiscards_ = 0;
00413 res_->nbDiscardedEvents_ = 0;
00414 res_->nbLostEvents_ = 0;
00415 res_->nbDataErrors_ = 0;
00416 res_->nbCrcErrors_ = 0;
00417 res_->nbAllocateSent_ = 0;
00418 }
00419 res_->unlock();
00420 }
00421
00422
00423 void FUResourceBroker::exportParameters() {
00424 assert(0 != res_->gui_);
00425
00426 res_->gui_->addMonitorParam("url", &url_);
00427 res_->gui_->addMonitorParam("class", &class_);
00428 res_->gui_->addMonitorParam("instance", &instance_);
00429 res_->gui_->addMonitorParam("runNumber", &res_->runNumber_);
00430 res_->gui_->addMonitorParam("stateName",
00431 fsm_->getExternallyVisibleStatePtr());
00432
00433 res_->gui_->addMonitorParam("deltaT", &res_->deltaT_);
00434 res_->gui_->addMonitorParam("deltaN", &res_->deltaN_);
00435 res_->gui_->addMonitorParam("deltaSumOfSquares", &res_->deltaSumOfSquares_);
00436 res_->gui_->addMonitorParam("deltaSumOfSizes", &res_->deltaSumOfSizes_);
00437
00438 res_->gui_->addMonitorParam("throughput", &res_->throughput_);
00439 res_->gui_->addMonitorParam("rate", &res_->rate_);
00440 res_->gui_->addMonitorParam("average", &res_->average_);
00441 res_->gui_->addMonitorParam("rms", &res_->rms_);
00442 res_->gui_->addMonitorParam("dataErrorFlag", &res_->dataErrorFlag_);
00443
00444 res_->gui_->addMonitorCounter("nbAllocatedEvents",
00445 &res_->nbAllocatedEvents_);
00446 res_->gui_->addMonitorCounter("nbPendingRequests",
00447 &res_->nbPendingRequests_);
00448 res_->gui_->addMonitorCounter("nbReceivedEvents", &res_->nbReceivedEvents_);
00449 res_->gui_->addMonitorCounter("nbSentEvents", &res_->nbSentEvents_);
00450 res_->gui_->addMonitorCounter("nbSentErrorEvents",
00451 &res_->nbSentErrorEvents_);
00452 res_->gui_->addMonitorCounter("nbDiscardedEvents",
00453 &res_->nbDiscardedEvents_);
00454
00455 res_->gui_->addMonitorCounter("nbReceivedEol", &res_->nbReceivedEol_);
00456 res_->gui_->addMonitorCounter("highestEolReceived",
00457 &res_->highestEolReceived_);
00458 res_->gui_->addMonitorCounter("nbEolPosted", &res_->nbEolPosted_);
00459 res_->gui_->addMonitorCounter("nbEolDiscarded", &res_->nbEolDiscarded_);
00460
00461 res_->gui_->addMonitorCounter("nbPendingSMDiscards",
00462 &res_->nbPendingSMDiscards_);
00463
00464 res_->gui_->addMonitorCounter("nbSentDqmEvents", &res_->nbSentDqmEvents_);
00465 res_->gui_->addMonitorCounter("nbDqmDiscardReceived",
00466 &res_->nbDqmDiscardReceived_);
00467 res_->gui_->addMonitorCounter("nbPendingSMDqmDiscards",
00468 &res_->nbPendingSMDqmDiscards_);
00469
00470 res_->gui_->addMonitorCounter("nbLostEvents", &res_->nbLostEvents_);
00471 res_->gui_->addMonitorCounter("nbDataErrors", &res_->nbDataErrors_);
00472 res_->gui_->addMonitorCounter("nbCrcErrors", &res_->nbCrcErrors_);
00473 res_->gui_->addMonitorCounter("nbTimeoutsWithEvent",
00474 &res_->nbTimeoutsWithEvent_);
00475 res_->gui_->addMonitorCounter("nbTimeoutsWithoutEvent",
00476 &res_->nbTimeoutsWithoutEvent_);
00477
00478 res_->gui_->addStandardParam("segmentationMode", &res_->segmentationMode_);
00479 res_->gui_->addStandardParam("useMessageQueueIPC",
00480 &res_->useMessageQueueIPC_);
00481 res_->gui_->addStandardParam("nbClients", &res_->nbClients_);
00482 res_->gui_->addStandardParam("clientPrcIds", &res_->clientPrcIds_);
00483 res_->gui_->addStandardParam("nbRawCells", &res_->nbRawCells_);
00484 res_->gui_->addStandardParam("nbRecoCells", &res_->nbRecoCells_);
00485 res_->gui_->addStandardParam("nbDqmCells", &res_->nbDqmCells_);
00486 res_->gui_->addStandardParam("rawCellSize", &res_->rawCellSize_);
00487 res_->gui_->addStandardParam("recoCellSize", &res_->recoCellSize_);
00488 res_->gui_->addStandardParam("dqmCellSize", &res_->dqmCellSize_);
00489 res_->gui_->addStandardParam("nbFreeResRequiredForAllocate",
00490 &res_->freeResRequiredForAllocate_);
00491
00492 res_->gui_->addStandardParam("doDropEvents", &res_->doDropEvents_);
00493 res_->gui_->addStandardParam("doFedIdCheck", &res_->doFedIdCheck_);
00494 res_->gui_->addStandardParam("doCrcCheck", &res_->doCrcCheck_);
00495 res_->gui_->addStandardParam("doDumpEvents", &res_->doDumpEvents_);
00496 res_->gui_->addStandardParam("buClassName", &res_->buClassName_);
00497 res_->gui_->addStandardParam("buInstance", &res_->buInstance_);
00498 res_->gui_->addStandardParam("smClassName", &res_->smClassName_);
00499 res_->gui_->addStandardParam("smInstance", &res_->smInstance_);
00500 res_->gui_->addStandardParam("resourceStructureTimeout_",
00501 &res_->resourceStructureTimeout_);
00502 res_->gui_->addStandardParam("monSleepSec", &res_->monSleepSec_);
00503 res_->gui_->addStandardParam("watchSleepSec", &res_->watchSleepSec_);
00504 res_->gui_->addStandardParam("timeOutSec", &res_->timeOutSec_);
00505 res_->gui_->addStandardParam("processKillerEnabled",
00506 &res_->processKillerEnabled_);
00507 res_->gui_->addStandardParam("useEvmBoard", &res_->useEvmBoard_);
00508 res_->gui_->addStandardParam("rcmsStateListener", fsm_->rcmsStateListener());
00509
00510 res_->gui_->addStandardParam("foundRcmsStateListener",
00511 fsm_->foundRcmsStateListener());
00512
00513 res_->gui_->addStandardParam("reasonForFailed", &res_->reasonForFailed_);
00514
00515 res_->gui_->addDebugCounter("nbAllocateSent", &res_->nbAllocateSent_);
00516 res_->gui_->addDebugCounter("nbTakeReceived", &res_->nbTakeReceived_);
00517 res_->gui_->addDebugCounter("nbDataDiscardReceived",
00518 &res_->nbDataDiscardReceived_);
00519
00520 res_->gui_->exportParameters();
00521
00522 res_->gui_->addItemChangedListener("doFedIdCheck", this);
00523 res_->gui_->addItemChangedListener("useEvmBoard", this);
00524 res_->gui_->addItemChangedListener("doCrcCheck", this);
00525 res_->gui_->addItemChangedListener("doDumpEvents", this);
00526
00527 }
00528
00529
00530 void FUResourceBroker::customWebPage(xgi::Input*in, xgi::Output*out)
00531 throw (xgi::exception::Exception) {
00532 using namespace cgicc;
00533 Cgicc cgi(in);
00534 std::vector<FormEntry> els = cgi.getElements();
00535 for (std::vector<FormEntry>::iterator it = els.begin(); it != els.end(); it++)
00536 cout << "form entry " << (*it).getValue() << endl;
00537
00538 std::vector<FormEntry> el1;
00539 cgi.getElement("crcError", el1);
00540 *out << "<html>" << endl;
00541 res_->gui_->htmlHead(in, out, res_->sourceId_);
00542 *out << "<body>" << endl;
00543 res_->gui_->htmlHeadline(in, out);
00544
00545 res_->lock();
00546
00547 if (0 != res_->resourceStructure_) {
00548 if (el1.size() != 0) {
00549 res_->resourceStructure_->injectCRCError();
00550 }
00551 *out << "<form method=\"GET\" action=\"customWebPage\" >";
00552 *out
00553 << "<button name=\"crcError\" type=\"submit\" value=\"injCRC\">Inject CRC</button>"
00554 << endl;
00555 *out << "</form>" << endl;
00556 *out << "<hr/>" << endl;
00557 vector<pid_t> client_prc_ids = res_->resourceStructure_->clientPrcIds();
00558 *out << table().set("frame", "void").set("rules", "rows") .set("class",
00559 "modules").set("width", "250") << endl << tr() << th(
00560 "Client Processes").set("colspan", "3") << tr() << endl << tr()
00561 << th("client").set("align", "left") << th("process id").set(
00562 "align", "center") << th("status").set("align", "center")
00563 << tr() << endl;
00564 for (UInt_t i = 0; i < client_prc_ids.size(); i++) {
00565
00566 pid_t pid = client_prc_ids[i];
00567 int status = kill(pid, 0);
00568
00569 stringstream ssi;
00570 ssi << i + 1;
00571 stringstream sspid;
00572 sspid << pid;
00573 stringstream ssstatus;
00574 ssstatus << status;
00575
00576 string bg_status = (status == 0) ? "#00ff00" : "ff0000";
00577 *out << tr() << td(ssi.str()).set("align", "left") << td(
00578 sspid.str()).set("align", "center")
00579 << td(ssstatus.str()).set("align", "center").set("bgcolor",
00580 bg_status) << tr() << endl;
00581 }
00582 *out << table() << endl;
00583 *out << "<br><br>" << endl;
00584
00585 vector<string> states = res_->resourceStructure_->cellStates();
00586 vector<UInt_t> evt_numbers = res_->resourceStructure_->cellEvtNumbers();
00587 vector<pid_t> prc_ids = res_->resourceStructure_->cellPrcIds();
00588 vector<time_t> time_stamps = res_->resourceStructure_->cellTimeStamps();
00589
00590 *out << table().set("frame", "void").set("rules", "rows") .set("class",
00591 "modules").set("width", "500") << endl << tr() << th(
00592 "Shared Memory Cells").set("colspan", "6") << tr() << endl
00593 << tr() << th("cell").set("align", "left") << th("state").set(
00594 "align", "center") << th("event").set("align", "center") << th(
00595 "process id").set("align", "center") << th("timestamp").set(
00596 "align", "center") << th("time").set("align", "center") << tr()
00597 << endl;
00598 for (UInt_t i = 0; i < states.size(); i++) {
00599 string state = states[i];
00600 UInt_t evt = evt_numbers[i];
00601 pid_t pid = prc_ids[i];
00602 time_t tstamp = time_stamps[i];
00603 double tdiff = difftime(time(0), tstamp);
00604
00605 stringstream ssi;
00606 ssi << i;
00607 stringstream ssevt;
00608 if (evt != 0xffffffff)
00609 ssevt << evt;
00610 else
00611 ssevt << " - ";
00612 stringstream sspid;
00613 if (pid != 0)
00614 sspid << pid;
00615 else
00616 sspid << " - ";
00617 stringstream sststamp;
00618 if (tstamp != 0)
00619 sststamp << tstamp;
00620 else
00621 sststamp << " - ";
00622 stringstream sstdiff;
00623 if (tstamp != 0)
00624 sstdiff << tdiff;
00625 else
00626 sstdiff << " - ";
00627
00628 string bg_state = "#ffffff";
00629 if (state == "RAWWRITING" || state == "RAWWRITTEN" || state
00630 == "RAWREADING" || state == "RAWREAD")
00631 bg_state = "#99CCff";
00632 else if (state == "PROCESSING")
00633 bg_state = "#ff0000";
00634 else if (state == "PROCESSED" || state == "RECOWRITING" || state
00635 == "RECOWRITTEN")
00636 bg_state = "#CCff99";
00637 else if (state == "SENDING")
00638 bg_state = "#00FF33";
00639 else if (state == "SENT")
00640 bg_state = "#006633";
00641 else if (state == "DISCARDING")
00642 bg_state = "#FFFF00";
00643 else if (state == "LUMISECTION")
00644 bg_state = "#0000FF";
00645
00646 *out << tr() << td(ssi.str()).set("align", "left")
00647 << td(state).set("align", "center").set("bgcolor", bg_state)
00648 << td(ssevt.str()).set("align", "center")
00649 << td(sspid.str()).set("align", "center") << td(
00650 sststamp.str()).set("align", "center")
00651 << td(sstdiff.str()).set("align", "center") << tr() << endl;
00652 }
00653 *out << table() << endl;
00654 *out << "<br><br>" << endl;
00655
00656 vector<string> dqmstates = res_->resourceStructure_->dqmCellStates();
00657
00658 *out << table().set("frame", "void").set("rules", "rows") .set("class",
00659 "modules").set("width", "500") << endl << tr() << th(
00660 "Shared Memory DQM Cells").set("colspan", "6") << tr() << endl
00661 << tr() << th("cell").set("align", "left") << th("state").set(
00662 "align", "center") << tr() << endl;
00663 for (UInt_t i = 0; i < dqmstates.size(); i++) {
00664 string state = dqmstates[i];
00665
00666 string bg_state = "#ffffff";
00667 if (state == "WRITING" || state == "WRITTEN")
00668 bg_state = "#99CCff";
00669 else if (state == "SENDING")
00670 bg_state = "#00FF33";
00671 else if (state == "SENT")
00672 bg_state = "#006633";
00673 else if (state == "DISCARDING")
00674 bg_state = "#FFFF00";
00675
00676 *out << tr() << "<td>" << i << "</td>" << td(state).set("align",
00677 "center").set("bgcolor", bg_state) << tr() << endl;
00678 }
00679 *out << table() << endl;
00680
00681 }
00682 *out << "</body>" << endl << "</html>" << endl;
00683
00684 res_->unlock();
00685 }
00686
00688
00690
00691 XDAQ_INSTANTIATOR_IMPL(FUResourceBroker)