CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_1/src/EventFilter/ResourceBroker/src/FUResourceBroker.cc

Go to the documentation of this file.
00001 
00002 //
00003 // FUResourceBroker
00004 // ----------------
00005 //
00006 //            10/20/2006 Philipp Schieferdecker <philipp.schieferdecker@cern.ch>
00007 //            20/01/2012 Andrei Spataru <aspataru@cern.ch>
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 // construction/destruction
00054 
00055 //______________________________________________________________________________
00056 FUResourceBroker::FUResourceBroker(xdaq::ApplicationStub *s) :
00057         xdaq::Application(s),
00058                         res_(new SharedResources(/*this, */getApplicationLogger())) {
00059 
00060         bindStateMachineCallbacks();
00061 
00062         res_->gui_ = new IndependentWebGUI(this);
00063         res_->gui_->setVersionString("Changeset: 3.05.2012-V1.055");
00064 
00065         // create state machine with shared resources
00066         fsm_.reset(new RBStateMachine(this, res_));
00067 
00068         // initialise state machine
00069         fsm_->initiate();
00070 
00071         // start the event scheduler
00072         eventScheduler_ = new SMEventScheduler(fsm_, res_->commands_);
00073 
00074         // set url, class, instance, and sourceId (=class_instance)
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         // bind i2o callbacks
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         // bind HyperDAQ web pages
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         // allocate i2o memory pool
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         // publish all parameters to app info space
00120         exportParameters();
00121 
00122         // findRcmsStateListener
00123         fsm_->findRcmsStateListener(this);
00124 
00125         // set application icon for hyperdaq
00126         getApplicationDescriptor()->setAttribute("icon", "/evf/images/rbicon.jpg");
00127         //FUResource::useEvmBoard_ = useEvmBoard_;
00128 
00129 }
00130 
00131 //______________________________________________________________________________
00132 FUResourceBroker::~FUResourceBroker() {
00133         delete eventScheduler_;
00134 }
00135 
00137 // implementation of member functions
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 // State Machine call back functions //
00173 //______________________________________________________________________________
00174 xoap::MessageReference FUResourceBroker::handleFSMSoapMessage(
00175                 xoap::MessageReference msg) throw (xoap::exception::Exception) {
00176 
00177         string errorMsg;
00178         xoap::MessageReference returnMsg;
00179 
00180         // register the state of the FSM before processing SOAP command
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                         // send fail event to FSM
00218                         EventPtr stMachEvent(new Fail());
00219                         res_->commands_.enqEvent(stMachEvent);
00220                 }
00221 
00222                 errorMsg = "Failed to create FSM SOAP reply message: ";
00223 
00224                 // wait until 'initialState' is changed
00225                 // the SOAP response will be issued only when the state has changed
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                         // send fail event to FSM
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                 /*bool success = */
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                 /*bool success = */
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                 //gui_->monInfoSpace()->lock();
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                         // UPDATED
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                 //gui_->monInfoSpace()->unlock();
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         // UPDATED
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 // XDAQ instantiator implementation macro
00690 
00691 XDAQ_INSTANTIATOR_IMPL(FUResourceBroker)