Go to the documentation of this file.00001
00002
00003
00004
00005
00007
00008
00009 #include "EventFilter/ResourceBroker/interface/BUProxy.h"
00010
00011 #include "toolbox/mem/Reference.h"
00012 #include "toolbox/mem/MemoryPoolFactory.h"
00013 #include "toolbox/mem/exception/Exception.h"
00014
00015 #include "i2o/Method.h"
00016 #include "i2o/utils/AddressMap.h"
00017
00018 #include "xcept/tools.h"
00019
00020 #include "interface/evb/i2oEVBMsgs.h"
00021 #include "interface/shared/i2oXFunctionCodes.h"
00022
00023 #include <iostream>
00024
00025 using namespace std;
00026 using namespace evf;
00027
00029
00031
00032
00033 BUProxy::BUProxy(xdaq::ApplicationDescriptor *fuAppDesc,
00034 xdaq::ApplicationDescriptor *buAppDesc,
00035 xdaq::ApplicationContext *fuAppContext, toolbox::mem::Pool *i2oPool) :
00036 fuAppDesc_(fuAppDesc), buAppDesc_(buAppDesc), fuAppContext_(fuAppContext),
00037 i2oPool_(i2oPool) {
00038
00039 }
00040
00041
00042 BUProxy::~BUProxy() {
00043
00044 }
00045
00047
00049
00050
00051 void BUProxy::sendAllocate(const UIntVec_t& fuResourceIds)
00052 throw (evf::Exception) {
00053 Logger log = fuAppContext_->getLogger();
00054
00055 try {
00056 size_t msgSize = sizeof(I2O_BU_ALLOCATE_MESSAGE_FRAME)
00057 + sizeof(BU_ALLOCATE) * (fuResourceIds.size() - 1);
00058
00059 toolbox::mem::Reference *bufRef =
00060 toolbox::mem::getMemoryPoolFactory()->getFrame(i2oPool_,
00061 msgSize);
00062
00063 I2O_MESSAGE_FRAME *stdMsg;
00064 I2O_PRIVATE_MESSAGE_FRAME *pvtMsg;
00065 I2O_BU_ALLOCATE_MESSAGE_FRAME *msg;
00066
00067 stdMsg = (I2O_MESSAGE_FRAME*) bufRef->getDataLocation();
00068 pvtMsg = (I2O_PRIVATE_MESSAGE_FRAME*) stdMsg;
00069 msg = (I2O_BU_ALLOCATE_MESSAGE_FRAME*) stdMsg;
00070
00071 stdMsg->MessageSize = msgSize >> 2;
00072 stdMsg->InitiatorAddress = i2o::utils::getAddressMap()->getTid(
00073 fuAppDesc_);
00074 stdMsg->TargetAddress = i2o::utils::getAddressMap()->getTid(buAppDesc_);
00075 stdMsg->Function = I2O_PRIVATE_MESSAGE;
00076 stdMsg->VersionOffset = 0;
00077 stdMsg->MsgFlags = 0;
00078
00079 pvtMsg->XFunctionCode = I2O_BU_ALLOCATE;
00080 pvtMsg->OrganizationID = XDAQ_ORGANIZATION_ID;
00081
00082 msg->n = fuResourceIds.size();
00083
00084 for (UInt_t i = 0; i < fuResourceIds.size(); i++) {
00085 msg->allocate[i].fuTransactionId = fuResourceIds[i];
00086 msg->allocate[i].fset = 1;
00087 }
00088
00089 bufRef->setDataSize(msgSize);
00090
00091 fuAppContext_->postFrame(bufRef, fuAppDesc_, buAppDesc_);
00092 } catch (toolbox::mem::exception::Exception& e) {
00093 string errmsg = "Failed to allocate buffer reference.";
00094 LOG4CPLUS_ERROR(log, errmsg);
00095 XCEPT_RETHROW(evf::Exception, errmsg, e);
00096 } catch (xdaq::exception::ApplicationDescriptorNotFound& e) {
00097 string errmsg = "Failed to get tid.";
00098 LOG4CPLUS_ERROR(log, errmsg);
00099 XCEPT_RETHROW(evf::Exception, errmsg, e);
00100 } catch (xdaq::exception::Exception& e) {
00101 string errmsg = "Failed to post 'Allocate' message.";
00102 LOG4CPLUS_ERROR(log, errmsg);
00103 XCEPT_RETHROW(evf::Exception, errmsg, e);
00104 }
00105 }
00106
00107
00108 void BUProxy::sendDiscard(UInt_t buResourceId) throw (evf::Exception) {
00109 Logger log = fuAppContext_->getLogger();
00110
00111 try {
00112 size_t msgSize = sizeof(I2O_BU_DISCARD_MESSAGE_FRAME);
00113
00114 toolbox::mem::Reference *bufRef =
00115 toolbox::mem::getMemoryPoolFactory()->getFrame(i2oPool_,
00116 msgSize);
00117
00118 I2O_MESSAGE_FRAME *stdMsg =
00119 (I2O_MESSAGE_FRAME*) bufRef->getDataLocation();
00120 I2O_PRIVATE_MESSAGE_FRAME *pvtMsg = (I2O_PRIVATE_MESSAGE_FRAME*) stdMsg;
00121 I2O_BU_DISCARD_MESSAGE_FRAME *msg =
00122 (I2O_BU_DISCARD_MESSAGE_FRAME*) stdMsg;
00123
00124 stdMsg->MessageSize = msgSize >> 2;
00125 stdMsg->InitiatorAddress = i2o::utils::getAddressMap()->getTid(
00126 fuAppDesc_);
00127 stdMsg->TargetAddress = i2o::utils::getAddressMap()->getTid(buAppDesc_);
00128 stdMsg->Function = I2O_PRIVATE_MESSAGE;
00129 stdMsg->VersionOffset = 0;
00130 stdMsg->MsgFlags = 0;
00131
00132 pvtMsg->XFunctionCode = I2O_BU_DISCARD;
00133 pvtMsg->OrganizationID = XDAQ_ORGANIZATION_ID;
00134
00135 msg->n = 1;
00136 msg->buResourceId[0] = buResourceId;
00137
00138 bufRef->setDataSize(msgSize);
00139
00140 fuAppContext_->postFrame(bufRef, fuAppDesc_, buAppDesc_);
00141 } catch (toolbox::mem::exception::Exception& e) {
00142 string errmsg = "Failed to allocate buffer reference.";
00143 LOG4CPLUS_ERROR(log, errmsg);
00144 XCEPT_RETHROW(evf::Exception, errmsg, e);
00145 } catch (xdaq::exception::ApplicationDescriptorNotFound& e) {
00146 string errmsg = "Failed to get tid.";
00147 LOG4CPLUS_ERROR(log, errmsg);
00148 XCEPT_RETHROW(evf::Exception, errmsg, e);
00149 } catch (xdaq::exception::Exception &e) {
00150 string errmsg = "Failed to post 'Discard' message.";
00151 LOG4CPLUS_ERROR(log, errmsg);
00152 XCEPT_RETHROW(evf::Exception, errmsg, e);
00153 }
00154
00155 }