TSP: The Transport Sample Protocol



Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

tsp_request.c

Go to the documentation of this file.
00001 
00038 #include "tsp_sys_headers.h"
00039 #include "tsp_request.h"
00040 
00041 int 
00042 TSP_provider_rqh_manager_get_max_nb(void) {
00043   return TSP_MAX_REQUEST_HANDLERS;
00044 }
00045 
00046 int
00047 TSP_provider_rqh_manager_get_nb(void) {
00048 
00049   int retval = 0;
00050   int i;
00051   STRACE_IO(("-->IN"));
00052   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,-1);
00053   for (i=0; i<TSP_provider_rqh_manager_get_max_nb(); ++i) {
00054     if (rqh_manager_if.request_handlers[i].status != TSP_RQH_STATUS_NOTINSTALLED)
00055       ++retval;
00056   }
00057   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,-1);
00058   STRACE_IO(("-->OUT"));
00059   return retval;
00060 } /* End of TSP_provider_rqh_manager_get_nb */
00061 
00062 
00063 int 
00064 TSP_provider_rqh_manager_get_nb_running(void) {
00065 
00066   int retval = 0;
00067   STRACE_IO(("-->IN"));
00068 
00069   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,-1);
00070   retval = rqh_manager_if.nb_running_rhq;
00071   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,-1);
00072 
00073   STRACE_IO(("-->OUT"));
00074   return retval;
00075 } /* End of TSP_provider_rqh_manager_get_nb_running */
00076 
00077 TSP_provider_request_handler_t* 
00078 TSP_provider_rqh_manager_get(int rank) {
00079 
00080   TSP_provider_request_handler_t*  retval = NULL;
00081 
00082   if ((rank<0) || (rank>TSP_provider_rqh_manager_get_max_nb())) {
00083     STRACE_ERROR(("Invalid request handler RANK=%d, max=%d",rank,TSP_provider_rqh_manager_get_max_nb()));
00084   }
00085   else {
00086     retval = &rqh_manager_if.request_handlers[rank];
00087   }
00088   
00089   return retval;
00090 } /* End of TSP_provider_rqh_manager_get */
00091 
00092 char* 
00093 TSP_provider_rqh_manager_get_url(int rank) {
00094 
00095   TSP_provider_request_handler_t*  rqh_p;
00096 
00097   rqh_p = TSP_provider_rqh_manager_get(rank);
00098   if(rqh_p)
00099     return rqh_p->url(rqh_p);
00100   else
00101     return NULL;
00102 
00103 } /* End of TSP_provider_rqh_manager_get_url */
00104 
00105 int 
00106 TSP_provider_rqh_manager_install(int rank, tsp_request_handler_ft rqh_constructor) {
00107 
00108   int retval = TRUE;
00109   TSP_provider_request_handler_t* rqh_p;
00110   STRACE_IO(("-->IN"));
00111 
00112   rqh_p = TSP_provider_rqh_manager_get(rank);
00113   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,FALSE);
00114   if (!rqh_p) {
00115     retval=FALSE;
00116   }
00117   else {
00118     /* Verify the adressed rqh was not already installed */
00119     if (rqh_p->status != TSP_RQH_STATUS_NOTINSTALLED) {
00120       STRACE_ERROR(("Could not replace an installed request handler"));
00121       retval = FALSE;
00122     }
00123     else {
00124        /* Really install handler */
00125       if (!rqh_constructor(rqh_p)) {
00126         STRACE_ERROR(("Invalid request handler constructor"));
00127         retval = FALSE;
00128       }
00129     } /* (rqh_p->status == TSP_RQH_STATUS_RUNNING) [else] */
00130   } /* if  (!rqh_p) [else] */
00131 
00132   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,FALSE);
00133   STRACE_IO(("-->OUT"));
00134   return retval;
00135 } /* End of TSP_provider_rqh_manager_install */
00136 
00137 int 
00138 TSP_provider_rqh_manager_init(void) {
00139 
00140   int retval = TRUE;
00141   int i;
00142   STRACE_IO(("-->IN"));
00143 
00144   /* Initialise rqh manager data structure, mutex, cond var... 
00145    * Note that we do not test returned code from those
00146    * function since they should ALWAYS return 0.
00147    * see pthread_cond_init(3), pthread_mutex_init(3)
00148    */
00149   pthread_cond_init(&rqh_manager_if.cond,(pthread_condattr_t *)NULL);  
00150   pthread_mutex_init(&rqh_manager_if.mutex,(const pthread_mutexattr_t *)NULL);
00151   
00152   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,-1);
00153   
00154   rqh_manager_if.nb_running_rhq = 0;
00155   /* RAZ handlers array */ 
00156   for (i=0;i<TSP_provider_rqh_manager_get_max_nb();++i) {
00157     rqh_manager_if.request_handlers[i].tid                = 0;
00158     rqh_manager_if.request_handlers[i].status             = TSP_RQH_STATUS_NOTINSTALLED;
00159     rqh_manager_if.request_handlers[i].config_param       = NULL;
00160     rqh_manager_if.request_handlers[i].config             = NULL;
00161     rqh_manager_if.request_handlers[i].run                = NULL;
00162     rqh_manager_if.request_handlers[i].stop               = NULL;
00163     rqh_manager_if.request_handlers[i].url                = NULL;
00164   }
00165   
00166   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,-1);
00167   STRACE_IO(("-->OUT"));
00168   return retval;
00169 } /* End of TSP_provider_rqh_manager_init */
00170 
00171 
00172 int 
00173 TSP_provider_rqh_manager_refresh(void) {
00174 
00175   int retval = TRUE, timeout;
00176   TSP_provider_request_handler_t *rqh_p;
00177   int rank, nb, tstatus;
00178 
00179   /* 
00180    * configure and run all TSP request handlers
00181    * which are installed, but not running
00182    */
00183   STRACE_IO(("-->IN"));
00184   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,FALSE);
00185 
00186   nb = TSP_provider_rqh_manager_get_max_nb();
00187   rank = 0;
00188   while (rank < nb && TRUE == retval)
00189     {
00190       rqh_p = TSP_provider_rqh_manager_get(rank);
00191 
00192       if (rqh_p->status == TSP_RQH_STATUS_IDLE)
00193         {
00194           retval = rqh_p->config(rqh_p);
00195           if (retval)
00196             {
00197               tstatus = pthread_create(&rqh_p->tid, NULL, rqh_p->run, rqh_p);
00198         
00199               if (0 == tstatus)
00200                 {
00201                   /* wait for handler to be really running, 1 second */
00202                   timeout = 100;
00203                   while(rqh_p->status != TSP_RQH_STATUS_RUNNING && timeout)
00204                     {
00205                       tsp_usleep(10000);
00206                       timeout --;
00207                     }
00208 
00209                   if(rqh_p->status == TSP_RQH_STATUS_RUNNING)
00210                     {
00211                       rqh_manager_if.nb_running_rhq++;
00212                       STRACE_INFO(("Request handler # %d started with URL %s", rank, TSP_rpc_request_url(rqh_p)));
00213                     }
00214                   else
00215                     {
00216                       STRACE_ERROR(("Request handler # %d could not start properly", rank));
00217                     }
00218                 }
00219             }
00220         }
00221       rank++;
00222     } /* End while loop over configured request handlers */
00223 
00224   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,FALSE);
00225   STRACE_IO(("-->OUT"));
00226   return retval;
00227 }  /* End of TSP_provider_rqh_manager_refresh */
00228 
00229 
00230 
00231 int TSP_provider_rqh_manager_end(void)
00232 {
00233   int timeout;
00234   TSP_provider_request_handler_t *rqh_p;
00235   int rank, nb;
00236 
00237   /* 
00238    * call stop for all TSP request handlers
00239    * that are running
00240    */
00241   STRACE_IO(("-->IN"));
00242   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,FALSE);
00243 
00244   nb = TSP_provider_rqh_manager_get_max_nb();
00245   for(rank = 0; rank < nb; rank++)
00246     {
00247       rqh_p = TSP_provider_rqh_manager_get(rank);
00248 
00249       if (rqh_p->status == TSP_RQH_STATUS_RUNNING)
00250         {
00251           rqh_p->stop(rqh_p);
00252 
00253           /* wait for handler to be really stopped, 1 second */
00254           timeout = 100;
00255           while(rqh_p->status != TSP_RQH_STATUS_STOPPED && timeout)
00256             {
00257               tsp_usleep(10000);
00258               timeout --;
00259             }
00260 
00261           if(rqh_p->status != TSP_RQH_STATUS_STOPPED)
00262             {
00263               STRACE_ERROR(("Could not stop handler # %d, canceling", rank));
00264               pthread_cancel(rqh_p->tid);
00265             }
00266           rqh_manager_if.nb_running_rhq--;
00267         }
00268     } /* End while loop over running request handlers */
00269 
00270   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,FALSE);
00271   STRACE_IO(("-->OUT"));
00272   return TRUE;
00273 } /* end of TSP_provider_rqh_manager_end */
00274 
00275 
00276 void TSP_provider_rqh_manager_waitend(void) {
00277 
00278   STRACE_IO(("-->INT"));
00279 
00280   TSP_LOCK_MUTEX(&rqh_manager_if.mutex,);
00281   while (rqh_manager_if.nb_running_rhq > 0) {
00282     pthread_cond_wait(&rqh_manager_if.cond,&rqh_manager_if.mutex);
00283   }
00284   TSP_UNLOCK_MUTEX(&rqh_manager_if.mutex,);
00285   STRACE_DEBUG(("No more Request Hanndler running -->terminate"));
00286   STRACE_IO(("-->OUT"));
00287 } /* end of TSP_provider_rqh_manager_waitend */
Framework Home Page.

Beware !! TSP wave is coming...