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         // Data type code will be one of DBF_. The constant TYPENOTCONN=-1 is
00032         // returned if the channel is not connected
00033         // but we do not overwrite it upon disconnect.
00034 
00035         //connectFlag
00036         if  (new_connectionHandlerArgs.op == CA_OP_CONN_UP){
00037         
00038             //std::cout << " change_connectionHandlerArgs: bytesize UP " << c.channelRequestMetaData.byteSize << std::endl;
00039                                 //channelRegalia  
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             //Data type code will be one of DBF_. The constant TYPENOTCONN=-1 is
00057             //returned if the channel is not connected.
00058             //Does not get overwritten on channel disconnection
00059             c.channelRegalia.dataType               = nativeDataType;
00060 
00061 
00062                                         // DATA BUFFER ------------------------------------------------------------------
00063                                 // data buffer CLIENT
00064             // Check if c.channelRegalia.cafeConnectionState == ICAFE_CS_NEVER_CONN or not!
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                 //cafeDbrType first filled with CAFENUM:DBR_TIME on initialization
00074                 //but will be overwritten by whatever the client needs
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                 //What client is actutally requesting
00093                 c.channelRequestMetaDataClient.byteSize=dbr_size_n(
00094                     c.channelRequestMetaDataClient.dbrDataType,
00095                     //dbf_type_to_DBR_TIME(nativeDataType),
00096                     c.channelRequestMetaDataClient.nelem);
00097             }
00098              
00099                                 //data Buffer requested by Cafe
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             //cafeDbrType first filled with CAFENUM:DBR_TIME on initialization
00106             //cafeDbrType can only be overwritten by an explicit method invocation
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             // CTRL BUFFER ------------------------------------------------------------------
00127               
00128             //No of elements for Ctrl Buffers
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                                                  //ctrl data CLIENT         
00139             //Ctrl data requested by Client
00140             if (c.channelRegalia.cafeConnectionState  == ICAFE_CS_NEVER_CONN ) {
00141                 c.channelRequestMetaCtrlClient.channelID   = new_connectionHandlerArgs.chid;
00142                 c.channelRequestMetaCtrlClient.nelem       = c.channelRegalia.nelem; //nelem_ctrl_buffer;
00143                 c.channelRequestMetaCtrlClient.nelemCache  = c.channelRegalia.nelem;
00144                 c.channelRequestMetaCtrlClient.dataType    = nativeDataType;
00145 
00146                 //cafeDbrType first filled with CAFENUM:DBR_CTRL on initialization
00147                 //but will be overwritten by whatever the client needs
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             //ctrl Data requested by Cafe
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             //cafeDbrType first filled with CAFENUM:DBR_CTRL on initialization
00172             //cafeDbrType can only be overwritten by an explicit method invocation
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             // STSACK BUFFER ------------------------------------------------------------------
00188               
00189             //No of elements for STSACK Buffers    
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             //STSACK Buffer Repository
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             //PRIMITIVE Buffer Repository
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)); // 1 sec per million
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             //nativeType not known on disconnect!!
00234 
00235             //Also callback done
00236             c.channelRequestStatusGet.setCallbackKind(false, true); //fake completion
00237             c.channelRequestStatusPut.setCallbackKind(false, true); //fake completion
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         // Free buffer on re-connection
00265         // Check Byte size first!!!
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             //std::cout << "sizeof c.ctrlBuffer " << dbr_size_n(new_ctrlTypeBuffer,c.channelRequestMetaCtrl.getNelem())  << std::endl;
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             //std::cout << "sizeof c.putBuffer " << dbr_size_n(c.channelRequestMetaPrimitive.getDbrDataType(),
00330             //                                           c.channelRequestMetaPrimitive.getNelem())  << std::endl;
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             //std::cout << "sizeof c.stsackBuffer " << dbr_size_n(c.channelRequestMetaSTSACK.getDbrDataType(),
00385              //                                           c.channelRequestMetaSTSACK.getNelem())  << std::endl;
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         // Free buffer on re-connection
00412         // Check Byte size first!!!
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             //std::cout << "sizeof c.dataBuffer " << dbr_size_n(new_dataTypeBuffer,c.channelRegalia.getNelem())  << std::endl;
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         //std::cout << "c.handle=" << c.handle << " " << c.pv << std::endl;
00466 
00467         if(c.dataBuffer) {            
00468             free(c.dataBuffer); // _TIME data buffer for ca_get          
00469         }
00470 
00471         if(c.ctrlBuffer) {          
00472            free(c.ctrlBuffer); // _CTRL data buffer for ca_get           
00473         }
00474 
00475         if(c.stsackBuffer) {      
00476            free(c.stsackBuffer); // _STSACK_STRING data buffer for ca_get
00477         }
00478 
00479         if(c.putBuffer) {            
00480             free(c.putBuffer);  // data buffer for ca_put
00481         }
00482 
00483     }
00484 };
00485 
00486 
00487 #endif // CONDUITCONNECTIONHANDLERARGS_H

Generated on 28 May 2018 for CAFE by  doxygen 1.6.1