conduitConnectionHandlerArgs.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CONDUITCONNECTIONHANDLERARGS_H
00009 #define CONDUITCONNECTIONHANDLERARGS_H
00010
00011 #include <cstdio>
00012 #include <conduit.h>
00013 #include <statusCodes.h>
00014
00019 struct change_connectionHandlerArgs
00020 {
00021 #define __METHOD__ "change_connectionHandlerArgs"
00022 change_connectionHandlerArgs (const struct connection_handler_args & new_connectionHandlerArgs):
00023 new_connectionHandlerArgs(new_connectionHandlerArgs){}
00024
00025 void operator() (Conduit& c) {
00026
00027 chtype nativeDataType = ca_field_type(new_connectionHandlerArgs.chid);
00028
00029 c.channelRegalia.connectionState=new_connectionHandlerArgs.op;
00030
00031
00032
00033
00034
00035
00036 if (new_connectionHandlerArgs.op == CA_OP_CONN_UP){
00037
00038
00039
00040 c.channelRegalia.nelem = ca_element_count(new_connectionHandlerArgs.chid);
00041 c.channelRegalia.connectFlag = true;
00042 c.channelRegalia.hostName = (const char *) ca_host_name (new_connectionHandlerArgs.chid);
00043
00044 if (c.channelRegalia.channelID != new_connectionHandlerArgs.chid) {
00045 std::cout << __FILE__ << "//" << __LINE__ << "//" << __METHOD__ << std::endl;
00046 std::cout << "Internal CAFE WARNING for handle : " << c.handle << std::endl;
00047 std::cout << "Channel ID has changed from " << c.channelRegalia.channelID
00048 << " to " << new_connectionHandlerArgs.chid << " " << std::endl;
00049 std::cout << "This is a rare occurence and happens when the ca message buffer " << std::endl;
00050 std::cout << "is flushed ahead of schedule (does that when full) and this callback is " << std::endl;
00051 std::cout << "consequently activated before channel ID is written to the hash table " << std::endl;
00052 c.channelRegalia.channelID = new_connectionHandlerArgs.chid;
00053 }
00054
00055
00056
00057
00058
00059 c.channelRegalia.dataType = nativeDataType;
00060
00061
00062
00063
00064
00065
00066
00067 if (c.channelRegalia.cafeConnectionState == ICAFE_CS_NEVER_CONN ) {
00068 c.channelRequestMetaDataClient.channelID = new_connectionHandlerArgs.chid;
00069 c.channelRequestMetaDataClient.nelem = c.channelRegalia.nelem;
00070 c.channelRequestMetaDataClient.nelemCache = c.channelRegalia.nelem;
00071 c.channelRequestMetaDataClient.dataType = nativeDataType;
00072
00073
00074
00075 switch (c.channelRequestMetaDataClient.cafeDbrType)
00076 {
00077 case CAFENUM::DBR_TIME:
00078 c.channelRequestMetaDataClient.dbrDataType = dbf_type_to_DBR_TIME(nativeDataType);
00079 break;
00080 case CAFENUM::DBR_STS:
00081 c.channelRequestMetaDataClient.dbrDataType = dbf_type_to_DBR_STS(nativeDataType);
00082 break;
00083 case CAFENUM::DBR_PRIMITIVE:
00084 c.channelRequestMetaDataClient.dbrDataType = dbf_type_to_DBR(nativeDataType);
00085 break;
00086 default:
00087 c.channelRequestMetaDataClient.dbrDataType = dbf_type_to_DBR_TIME(nativeDataType);
00088 c.channelRequestMetaDataClient.cafeDbrType = CAFENUM::DBR_TIME;
00089 break;
00090 }
00091
00092
00093 c.channelRequestMetaDataClient.byteSize=dbr_size_n(
00094 c.channelRequestMetaDataClient.dbrDataType,
00095
00096 c.channelRequestMetaDataClient.nelem);
00097 }
00098
00099
00100 c.channelRequestMetaData.channelID = new_connectionHandlerArgs.chid;
00101 c.channelRequestMetaData.nelem = c.channelRegalia.nelem;
00102 c.channelRequestMetaData.nelemCache = c.channelRegalia.nelem;
00103 c.channelRequestMetaData.dataType = nativeDataType;
00104
00105
00106
00107 switch (c.channelRequestMetaData.cafeDbrType)
00108 {
00109 case CAFENUM::DBR_TIME:
00110 c.channelRequestMetaData.dbrDataType = dbf_type_to_DBR_TIME(nativeDataType);
00111 break;
00112 case CAFENUM::DBR_STS:
00113 c.channelRequestMetaData.dbrDataType = dbf_type_to_DBR_STS(nativeDataType);
00114 break;
00115 case CAFENUM::DBR_PRIMITIVE:
00116 c.channelRequestMetaData.dbrDataType = dbf_type_to_DBR(nativeDataType);
00117 break;
00118 default:
00119 c.channelRequestMetaData.dbrDataType = dbf_type_to_DBR_TIME(nativeDataType);
00120 c.channelRequestMetaData.cafeDbrType = CAFENUM::DBR_TIME;
00121 break;
00122 }
00123
00124
00125
00126
00127
00128
00129 unsigned int nelem_ctrl_buffer=1;
00130
00131 if ( c.channelRegalia.nelem > MAX_NELEM_FOR_CTRL_BUFFER) {
00132 nelem_ctrl_buffer = DEFAULT_NELEM_FOR_CTRL_BUFFER;
00133 }
00134 else {
00135 nelem_ctrl_buffer = c.channelRegalia.nelem;
00136 }
00137
00138
00139
00140 if (c.channelRegalia.cafeConnectionState == ICAFE_CS_NEVER_CONN ) {
00141 c.channelRequestMetaCtrlClient.channelID = new_connectionHandlerArgs.chid;
00142 c.channelRequestMetaCtrlClient.nelem = c.channelRegalia.nelem;
00143 c.channelRequestMetaCtrlClient.nelemCache = c.channelRegalia.nelem;
00144 c.channelRequestMetaCtrlClient.dataType = nativeDataType;
00145
00146
00147
00148 switch (c.channelRequestMetaCtrlClient.cafeDbrType)
00149 {
00150 case CAFENUM::DBR_CTRL:
00151 c.channelRequestMetaCtrlClient.dbrDataType = dbf_type_to_DBR_CTRL(nativeDataType);
00152 break;
00153 case CAFENUM::DBR_GR:
00154 c.channelRequestMetaCtrlClient.dbrDataType = dbf_type_to_DBR_GR (nativeDataType);
00155 break;
00156 default:
00157 c.channelRequestMetaCtrlClient.dbrDataType = dbf_type_to_DBR_CTRL(nativeDataType);
00158 c.channelRequestMetaCtrlClient.cafeDbrType = CAFENUM::DBR_CTRL;
00159 break;
00160 }
00161
00162 c.channelRequestMetaCtrlClient.byteSize=dbr_size_n(
00163 c.channelRequestMetaCtrlClient.dbrDataType,c.channelRequestMetaCtrlClient.nelem);
00164 }
00165
00166
00167 c.channelRequestMetaCtrl.channelID = new_connectionHandlerArgs.chid;
00168 c.channelRequestMetaCtrl.nelem = nelem_ctrl_buffer;
00169 c.channelRequestMetaCtrl.nelemCache = nelem_ctrl_buffer;
00170 c.channelRequestMetaCtrl.dataType = nativeDataType;
00171
00172
00173 switch (c.channelRequestMetaCtrl.cafeDbrType)
00174 {
00175 case CAFENUM::DBR_CTRL:
00176 c.channelRequestMetaCtrl.dbrDataType = dbf_type_to_DBR_CTRL(nativeDataType);
00177 break;
00178 case CAFENUM::DBR_GR:
00179 c.channelRequestMetaCtrl.dbrDataType = dbf_type_to_DBR_GR (nativeDataType);
00180 break;
00181 default:
00182 c.channelRequestMetaCtrl.dbrDataType = dbf_type_to_DBR_CTRL(nativeDataType);
00183 c.channelRequestMetaCtrl.cafeDbrType = CAFENUM::DBR_CTRL;
00184 break;
00185 }
00186
00187
00188
00189
00190 unsigned int nelem_stsack_buffer;
00191
00192 if ( c.channelRegalia.nelem > MAX_NELEM_FOR_STSACK_BUFFER) {
00193 nelem_stsack_buffer = DEFAULT_NELEM_FOR_STSACK_BUFFER;
00194 }
00195 else {
00196 nelem_stsack_buffer = c.channelRegalia.nelem;
00197 }
00198
00199
00200
00201 c.channelRequestMetaSTSACK.channelID = new_connectionHandlerArgs.chid;
00202 c.channelRequestMetaSTSACK.nelem = nelem_stsack_buffer;
00203 c.channelRequestMetaSTSACK.nelemCache = nelem_stsack_buffer;
00204 c.channelRequestMetaSTSACK.dataType = DBR_STRING;
00205 c.channelRequestMetaSTSACK.dbrDataType = DBR_STSACK_STRING;
00206 c.channelRequestMetaSTSACK.cafeDbrType = CAFENUM::DBR_STSACK;
00207
00208
00209
00210 c.channelRequestMetaPrimitive.channelID = new_connectionHandlerArgs.chid;
00211 c.channelRequestMetaPrimitive.nelem = c.channelRegalia.nelem;
00212 c.channelRequestMetaPrimitive.dataType = nativeDataType;;
00213 c.channelRequestMetaPrimitive.dbrDataType= dbf_type_to_DBR(nativeDataType);
00214 c.channelRequestMetaPrimitive.cafeDbrType= CAFENUM::DBR_PRIMITIVE;
00215
00217
00218
00219 if ( c.channelRegalia.nelem>1) {
00220 double tout= ((unsigned int) (c.channelRegalia.nelem*0.000001));
00221 c.channelRequestDataTypePolicy.setRequestKind(CAFENUM::LOWEST_DATATYPE);
00222 c.channelTimeoutPolicyGet.setTimeout(std::max(DEFAULT_TIMEOUT_PEND_IO_WF , tout));
00223 c.channelTimeoutPolicyPut.setTimeout(std::max(DEFAULT_TIMEOUT_PEND_IO_WF , tout));
00224 c.channelTimeoutPolicyGet.setDefaultTimeout(DEFAULT_TIMEOUT_PEND_IO_WF);
00225 c.channelTimeoutPolicyPut.setDefaultTimeout(DEFAULT_TIMEOUT_PEND_IO_WF);
00226 }
00227
00228 c.channelRegalia.cafeConnectionState = ICAFE_CS_CONN;
00229 c.status = ICAFE_CA_OP_CONN_UP;
00230 }
00231 else {
00232
00233
00234
00235
00236 c.channelRequestStatusGet.setCallbackKind(false, true);
00237 c.channelRequestStatusPut.setCallbackKind(false, true);
00238 c.channelRegalia.cafeConnectionState =ICAFE_CS_DISCONN;
00239 c.channelRegalia.connectFlag = false;
00240 c.status = ICAFE_CA_OP_CONN_DOWN;
00241
00242 }
00243
00244
00245 }
00246
00247 private:
00248 connection_handler_args new_connectionHandlerArgs;
00249 #undef __METHOD__
00250 };
00251
00252
00257 struct change_dataBufferSize_CTRL
00258 {
00259 #define __METHOD__ "change_dataBufferSize_CTRL"
00260 change_dataBufferSize_CTRL (const chtype & new_ctrlTypeBuffer): new_ctrlTypeBuffer(new_ctrlTypeBuffer){}
00261
00262 void operator() (Conduit& c) {
00263
00264
00265
00266
00267 bool allocateMemory=false ;
00268
00269 if(c.ctrlBuffer==NULL) {
00270 allocateMemory=true;
00271 }
00272
00273 else if ( dbr_size_n(new_ctrlTypeBuffer,c.channelRequestMetaCtrl.getNelem()) > c.channelRequestMetaCtrl.getByteSize() ) {
00274 std::cout << "ctrlBuffer already exists= " << c.ctrlBuffer << " for channel " << c.pv
00275 << " with handle " << c.handle << std::endl;
00276 std::cout << "Freeing and reallocating ctrlBuffer" << std::endl;
00277 free(c.ctrlBuffer);
00278 allocateMemory=true;
00279 }
00280
00281 if (allocateMemory) {
00282
00283 c.ctrlBuffer = (db_access_val *) malloc ( dbr_size_n(new_ctrlTypeBuffer,c.channelRequestMetaCtrl.getNelem()) );
00284 c.channelRequestMetaCtrl.byteSize=dbr_size_n(new_ctrlTypeBuffer,c.channelRequestMetaCtrl.getNelem());
00285 }
00286
00287
00288 if (c.ctrlBuffer==0){
00289 std::cout << __FILE__ << "/" << __LINE__ << "/" << __METHOD__ << std::endl;
00290 printf ("Virtual memory exhausted for channel %s ", ca_name(c.channelID));
00291 printf ("Exiting CAFE");
00292 }
00293
00294 }
00295
00296 private:
00297 chtype new_ctrlTypeBuffer;
00298 #undef __METHOD__
00299 };
00300
00301
00306 struct change_dataBufferSize_PRIMITIVE
00307 {
00308 #define __METHOD__ "change_dataBufferSize_PRIMITIVE"
00309 change_dataBufferSize_PRIMITIVE (const chtype & new_dataTypeBufferNative): new_dataTypeBufferNative(new_dataTypeBufferNative){}
00310
00311 void operator() (Conduit& c) {
00312
00313 bool allocateMemory=false ;
00314
00315 if(c.putBuffer==NULL) {
00316 allocateMemory=true;
00317 }
00318 else if ( dbr_size_n(c.channelRequestMetaPrimitive.getDbrDataType(),
00319 c.channelRequestMetaPrimitive.getNelem())
00320 > c.channelRequestMetaPrimitive.getByteSize() ) {
00321 std::cout << "putBuffer already exists= " << c.putBuffer << " for channel " << c.pv
00322 << " with handle " << c.handle << std::endl;
00323 std::cout << "Freeing and reallocating putBuffer" << std::endl;
00324 free(c.putBuffer);
00325 allocateMemory=true;
00326 }
00327
00328 if (allocateMemory) {
00329
00330
00331 c.putBuffer = (db_access_val *) malloc (dbr_size_n(c.channelRequestMetaPrimitive.getDbrDataType(),
00332 c.channelRequestMetaPrimitive.getNelem()));
00333
00334 c.channelRequestMetaPrimitive.byteSize
00335 =dbr_size_n(c.channelRequestMetaPrimitive.getDbrDataType(),
00336 c.channelRequestMetaPrimitive.getNelem());
00337 }
00338
00339 if (c.putBuffer==0){
00340 std::cout << __FILE__ << "/" << __LINE__ << "/" << __METHOD__ << std::endl;
00341 printf ("Virtual memory exhausted for channel %s ", ca_name(c.channelID));
00342 printf ("Exiting CAFE");
00343 exit(0);
00344 }
00345
00346 }
00347
00348 private:
00349 chtype new_dataTypeBufferNative;
00350 #undef __METHOD__
00351 };
00352
00353
00354
00359 struct change_dataBufferSize_STSACK
00360 {
00361 #define __METHOD__ "change_dataBufferSize_STSACK"
00362 change_dataBufferSize_STSACK (){}
00363
00364 void operator() (Conduit& c) {
00365
00366 bool allocateMemory=false ;
00367
00368 if(c.stsackBuffer==NULL) {
00369
00370 allocateMemory=true;
00371 }
00372
00373 else if ( dbr_size_n(c.channelRequestMetaSTSACK.getDbrDataType(),
00374 c.channelRequestMetaSTSACK.getNelem())
00375 > c.channelRequestMetaSTSACK.getByteSize() ) {
00376 std::cout << "stsackBuffer already exists= " << c.stsackBuffer << " for channel " << c.pv
00377 << " with handle " << c.handle << std::endl;
00378 std::cout << "Freeing and reallocating putBuffer" << std::endl;
00379 free(c.stsackBuffer);
00380 allocateMemory=true;
00381 }
00382
00383 if (allocateMemory) {
00384
00385
00386 c.stsackBuffer = (db_access_val *) malloc (dbr_size_n(c.channelRequestMetaSTSACK.getDbrDataType(),
00387 c.channelRequestMetaSTSACK.getNelem()));
00388
00389 c.channelRequestMetaSTSACK.byteSize
00390 =dbr_size_n(c.channelRequestMetaSTSACK.getDbrDataType(),
00391 c.channelRequestMetaSTSACK.getNelem());
00392 }
00393
00394 }
00395 #undef __METHOD__
00396 };
00397
00398
00403 struct change_dataBufferSize_TIME
00404 {
00405 #define __METHOD__ "change_dataBufferSize_PRIMITIVE"
00406
00407 change_dataBufferSize_TIME (const chtype & new_dataTypeBuffer): new_dataTypeBuffer(new_dataTypeBuffer){}
00408
00409 void operator() (Conduit& c) {
00410
00411
00412
00413
00414 bool allocateMemory=false ;
00415
00416
00417 if(c.dataBuffer==NULL) {
00418
00419 allocateMemory=true;
00420 }
00421
00422 else if ( dbr_size_n(new_dataTypeBuffer,c.channelRegalia.getNelem()) > c.channelRequestMetaData.getByteSize() ) {
00423 std::cout << "dataBuffer already exists= " << c.dataBuffer << " for channel " << c.pv
00424 << " with handle " << c.handle << std::endl;
00425 std::cout << "Freeing and reallocating dataBuffer" << std::endl;
00426
00427 std::cout << dbr_size_n(new_dataTypeBuffer,c.channelRegalia.getNelem()) << " VERSUS "
00428 << c.channelRequestMetaData.getByteSize() << std::endl;
00429 free(c.dataBuffer);
00430 allocateMemory=true;
00431
00432 }
00433
00434 if (allocateMemory) {
00435
00436 c.dataBuffer = (db_access_val *) malloc ( dbr_size_n(new_dataTypeBuffer,c.channelRegalia.getNelem()) );
00437 c.channelRequestMetaData.byteSize=dbr_size_n(new_dataTypeBuffer,c.channelRequestMetaData.getNelem());
00438
00439 }
00440
00441 if (c.dataBuffer==NULL){
00442 std::cout << __FILE__ << "/" << __LINE__ << "/" << __METHOD__ << std::endl;
00443 printf ("Virtual memory exhausted for channel %s ", ca_name(c.channelID));
00444 printf ("Exiting CAFE");
00445
00446 exit(0);
00447 }
00448 }
00449
00450 private:
00451 chtype new_dataTypeBuffer;
00452 #undef __METHOD__
00453 };
00454
00455
00459 struct free_dataBuffers
00460 {
00461 free_dataBuffers (){}
00462
00463 void operator() (Conduit& c) {
00464
00465
00466
00467 if(c.dataBuffer) {
00468 free(c.dataBuffer);
00469 }
00470
00471 if(c.ctrlBuffer) {
00472 free(c.ctrlBuffer);
00473 }
00474
00475 if(c.stsackBuffer) {
00476 free(c.stsackBuffer);
00477 }
00478
00479 if(c.putBuffer) {
00480 free(c.putBuffer);
00481 }
00482
00483 }
00484 };
00485
00486
00487 #endif // CONDUITCONNECTIONHANDLERARGS_H