Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

/ps/src/dsc/co/mw/mwfwk/cmwfwPoller.cc

Go to the documentation of this file.
00001 #include "cmwfwList.h"
00002 #include "cmwfwPoller.h"
00003 #include "cmwfwIOValue.h"
00004 #include "cmwfwIOPMapper.h"
00005 #include "cmwfwDeviceServer.h"
00006 #include "cmwfwDeviceAdapter.h"
00007 
00008 
00009 extern cmwfwIOPMapper framework_iop_mapper;
00010 void* pollThrRoutine(void*);
00011 
00012 
00013 
00014 #define FILE "source file:cmwfwPoller.cc"
00015 #define ID "Contact Steen JENSEN, PS/CO"
00016 #define PROGRAM "Middleware server framework"
00017 #define T(a,b,c,d,e) TRACE(a,"%s(%s): %s %s %s %s\n",myname,FILE,b,c,d,e)
00018 #define E(a,b,c,d) ERROR("%s:%s(%s):ERROR: %s %s %s %s - %s\n",PROGRAM,myname,FILE,a,b,c,d,ID)
00019 //T(CMWFW_TRACE_CALLS,"","","","");
00020 //E("","","","");
00021 
00022 
00023 
00024 
00025 
00035 cmwfwPoller::cmwfwPoller(){
00036   char* myname = "cmwfwPoller::cmwfwPoller";
00037   T(CMWFW_TRACE_CALLS,"Entering","","","");
00038   T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00039 };
00040 
00041 
00042 
00052 cmwfwPoller::~cmwfwPoller(){
00053   char* myname = "cmwfwPoller::~cmwfwPoller";
00054   T(CMWFW_TRACE_CALLS,"Entering","","","");
00055   T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00056 };
00057 
00058 
00067 void cmwfwPoller::processIOP(const cmwfwIOPoint& iop){
00068   char* myname = "cmwfwPoller::processIOP";
00069   T(CMWFW_TRACE_CALLS,"Entering","","","");
00070 
00071   int                  did_update = 0;
00072   int                  updated_with_error = 0;
00073   cmwfwIOValue*        iov_ptr1    = 0;
00074   cmwfwIOValue*        iov_ptr2    = 0;
00075   cmwfwIOError*        ioe_ptr    = 0;
00076   cmwfwData            data_being_filled;
00077   cmwfwValueQualifier  vq_being_set;
00078   cmwfwDeviceServer*   srv_ptr    = framework_iop_mapper.getServer(iop);
00079   cmwfwDeviceAdapter*  adp_ptr    = framework_iop_mapper.getAdapter(iop);
00080   char* dn = iop.getDeviceName();
00081   char* cn = iop.getClassName();
00082   char* pn = iop.getPropertyName();
00083   char* cs = iop.getCycleSelector();
00084   cmwfwIOPoint iop_no_cs(dn,cn,pn,0);
00085 
00086   if( !srv_ptr ){
00087         char* dn = iop.getDeviceName();
00088         char* e = "Unable to update clients for ";
00089         char* errmess = new char[strlen(dn) + strlen(e) + 5];
00090         if(!errmess)heaperr(85);
00091         strcat(errmess,e);
00092         strcat(errmess,dn);
00093         throw cmwfwBadParameter(errmess);
00094     exit(-1);
00095   };
00096   if( !adp_ptr ){
00097         char* dn = iop.getDeviceName();
00098         char* e = "Unable to retrieve data for ";
00099         char* errmess = new char[strlen(dn) + strlen(e) + 5];
00100         if(!errmess)heaperr(94);
00101         strcat(errmess,e);
00102         strcat(errmess,dn);
00103         throw cmwfwBadParameter(errmess);
00104     exit(-1);
00105   };
00106 
00107   srv_ptr->iovalues->lock();
00108   iov_ptr1 = srv_ptr->getIOValue(iop,false);
00109   if(cs)
00110     iov_ptr2 = srv_ptr->getIOValue(iop_no_cs,false);
00111 
00112   if( (!iov_ptr1) && (!iov_ptr2) ){
00113     srv_ptr->iovalues->unlock();
00114     T(CMWFW_TRACE_CALLS,"Returning - no iovalues","","","");
00115         return;
00116   };
00117 
00118   try{
00119         adp_ptr->cmwfw_poll(iop,data_being_filled,vq_being_set);
00120   }
00121   catch(cmwfwIOError err){
00122         if(iov_ptr1)
00123           iov_ptr1->update(err);
00124         if(iov_ptr2)
00125           iov_ptr1->update(err);
00126     srv_ptr->iovalues->unlock();
00127     T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00128         return;
00129   };
00130   if(iov_ptr1){
00131         iov_ptr1->update(data_being_filled,vq_being_set);
00132   };
00133   if(iov_ptr2){
00134         iov_ptr2->update(data_being_filled,vq_being_set);
00135   }
00136   srv_ptr->iovalues->unlock();
00137   T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00138   return;
00139 };
00140 
00141 
00142 
00143 
00154 void cmwfwPoller::poll(const cmwfwIOPoint& iop){
00155   char* myname = "cmwfwPoller::poll(iopoint)";
00156   T(CMWFW_TRACE_CALLS,"Entering","","","");
00157 
00158   cmwfwIOPoint* res  = 0;
00159 
00160   if(find(iop,res)){
00161         if(!res)          //Someone below took control of the iopoint management
00162       processIOP(iop);
00163         else              //iopoint management is at this level
00164       processIOP(*res);
00165   };
00166 
00167   T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00168 };
00169 
00170 
00171 
00172 
00183 void cmwfwPoller::poll(){
00184   char* myname = "cmwfwPoller::poll";
00185   T(CMWFW_TRACE_CALLS,"Entering","","","");
00186 
00187   bool                 stat      = false;
00188   int                  stop      = 0;
00189   cmwfwIOPoint*        iop_ptr   = 0;
00190 
00191   iopoints->lock();
00192   iopoints->resetCurrent(false);
00193   stat = iopoints->getFirst(&iop_ptr,false);
00194   if(stat){
00195     processIOP(*iop_ptr);
00196   };
00197   while(stat){
00198     stat = iopoints->getNext(&iop_ptr,false);
00199         if(stat){
00200           processIOP(*iop_ptr);
00201         };
00202   };
00203   iopoints->unlock();
00204 
00205   T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00206 };
00207 
00208 
00209 
00210 
00211 
00221 void cmwfwPoller::poll(cmwfwList<cmwfwIOPoint*>& list){
00222   char* myname = "cmwfwPoller::poll(iopoint list)";
00223   T(CMWFW_TRACE_CALLS,"Entering","","","");
00224 
00225   cmwfwIOPoint* iop_ptr = 0;
00226 
00227   list.resetCurrent();
00228   list.getFirst(&iop_ptr);
00229   while(iop_ptr){
00230     processIOP(*iop_ptr);
00231     list.getNext(&iop_ptr);
00232   };
00233 
00234   T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00235 };
00236 
00237 
00247 void cmwfwPoller::heaperr(int line){
00248   char* myname = "cmwfwPoller";
00249   T(CMWFW_TRACE_CALLS,"Entering","","","");
00250 
00251   char l[30];
00252   itoa(line,l);
00253   E("Out of heap in line ",l,"","");
00254   T(CMWFW_TRACE_CALLS,"Exiting due to heap allocation error","","","");
00255   throw cmwfwInternalError(FILE,line,"Out of heap memory");
00256   exit(-1);
00257 };
00258 
00259 

Generated at Thu May 10 11:28:59 2001 for C.E.R.N.-PSControlsMiddlewareFramework by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001