Diff for /libaitrpc/src/srv.c between versions 1.16.2.2 and 1.16.2.6

version 1.16.2.2, 2013/07/15 14:22:00 version 1.16.2.6, 2013/07/16 12:35:25
Line 559  closeBLOBClient(sched_task_t *task) Line 559  closeBLOBClient(sched_task_t *task)
 }  }
   
 static void *  static void *
 toutBLOB(sched_task_t *task)  
 {  
         rpc_cli_t *c = TASK_ARG(task);  
   
         rpc_srv_unregisterBLOB((rpc_srv_t*) c->cli_parent, (uint32_t) TASK_DATA(task));  
   
         return NULL;  
 }  
   
 static void *  
 txBLOB(sched_task_t *task)  txBLOB(sched_task_t *task)
 {  {
         rpc_cli_t *c = TASK_ARG(task);          rpc_cli_t *c = TASK_ARG(task);
Line 593  rxBLOB(sched_task_t *task) Line 583  rxBLOB(sched_task_t *task)
         rpc_blob_t *b;          rpc_blob_t *b;
         struct tagBLOBHdr blob;          struct tagBLOBHdr blob;
         int rlen;          int rlen;
         struct timespec ts = { RPC_BLOB_TIMEOUT, 0 };  
   
         memset(&blob, 0, sizeof blob);          memset(&blob, 0, sizeof blob);
         rlen = recv(TASK_FD(task), &blob, sizeof blob, 0);          rlen = recv(TASK_FD(task), &blob, sizeof blob, 0);
Line 639  rxBLOB(sched_task_t *task) Line 628  rxBLOB(sched_task_t *task)
                         }                          }
                         break;                          break;
                 case set:                  case set:
                        if ((b = rpc_srv_registerBLOB(s, ntohl(blob.hdr_len)))) {                        if ((b = rpc_srv_registerBLOB(s, ntohl(blob.hdr_len)
                                                         ntohl(blob.hdr_ret)))) {
                                 /* set new BLOB variable for reply :) */                                  /* set new BLOB variable for reply :) */
                                 blob.hdr_var = htonl(b->blob_var);                                  blob.hdr_var = htonl(b->blob_var);
   
                                 /* set live BLOB timeout */  
                                 ts.tv_sec = blob.hdr_ret ? blob.hdr_ret : RPC_BLOB_TIMEOUT;  
   
                                 /* receive BLOB from client */                                  /* receive BLOB from client */
                                 blob.hdr_ret = htonl(rpc_srv_recvBLOB(c, b));                                  blob.hdr_ret = htonl(rpc_srv_recvBLOB(c, b));
                                 rpc_srv_blobUnmap(b);                                  rpc_srv_blobUnmap(b);
   
                                 schedTimer(TASK_ROOT(task), toutBLOB, TASK_ARG(task), ts,   
                                                 (void*) (intptr_t) ntohl(blob.hdr_var), ntohl(blob.hdr_len));  
                         } else {                          } else {
                                 blob.hdr_cmd = error;                                  blob.hdr_cmd = error;
                                 blob.hdr_ret = RPC_ERROR(-1);                                  blob.hdr_ret = RPC_ERROR(-1);
Line 662  rxBLOB(sched_task_t *task) Line 646  rxBLOB(sched_task_t *task)
                                 blob.hdr_cmd = error;                                  blob.hdr_cmd = error;
                                 blob.hdr_ret = RPC_ERROR(-1);                                  blob.hdr_ret = RPC_ERROR(-1);
                         }                          }
   
                         schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_DATA,   
                                         (void*) (intptr_t) ntohl(blob.hdr_var), NULL);  
                         break;                          break;
                 default:                  default:
                         rpc_SetErr(EPROCUNAVAIL, "Unsupported BLOB command %d", blob.hdr_cmd);                          rpc_SetErr(EPROCUNAVAIL, "Unsupported BLOB command %d", blob.hdr_cmd);
Line 680  end: Line 661  end:
 }  }
   
 static void *  static void *
   flushBLOB(sched_task_t *task)
   {
           rpc_srv_t *srv = TASK_ARG(task);
           rpc_blob_t *b, *tmp;
   
           printf("!signal 99\n");
   
           TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) {
                   TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node);
   
                   rpc_srv_blobFree(srv, b);
                   e_free(b);
           }
   
           schedSignalSelf(task);
           return NULL;
   }
   
   static void *
 acceptBLOBClients(sched_task_t *task)  acceptBLOBClients(sched_task_t *task)
 {  {
         rpc_srv_t *srv = TASK_ARG(task);          rpc_srv_t *srv = TASK_ARG(task);
Line 853  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) Line 853  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
                 return;                  return;
   
         srv->srv_blob.kill = 1;          srv->srv_blob.kill = 1;
   
           schedEnd(&srv->srv_blob.root);
 }  }
   
 /*  /*
Line 879  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) Line 881  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
                 return -1;                  return -1;
         }          }
   
           schedSignal(srv->srv_blob.root, flushBLOB, srv, SIGFBLOB, NULL, 0);
         if (!schedRead(srv->srv_blob.root, acceptBLOBClients, srv,           if (!schedRead(srv->srv_blob.root, acceptBLOBClients, srv, 
                                 srv->srv_blob.server.cli_sock, NULL, 0)) {                                  srv->srv_blob.server.cli_sock, NULL, 0)) {
                 rpc_SetErr(sched_GetErrno(), "%s", sched_GetError());                  rpc_SetErr(sched_GetErrno(), "%s", sched_GetError());
Line 889  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) Line 892  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
         /* main rpc loop */          /* main rpc loop */
         schedRun(srv->srv_blob.root, &srv->srv_blob.kill);          schedRun(srv->srv_blob.root, &srv->srv_blob.kill);
   
           /* detach blobs */
           TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) {
                   TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node);
   
                   rpc_srv_blobFree(srv, b);
                   e_free(b);
           }
   
         /* close all clients connections & server socket */          /* close all clients connections & server socket */
         for (i = 0; i < array_Size(srv->srv_blob.clients); i++) {          for (i = 0; i < array_Size(srv->srv_blob.clients); i++) {
                 c = array(srv->srv_blob.clients, i, rpc_cli_t*);                  c = array(srv->srv_blob.clients, i, rpc_cli_t*);
Line 905  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) Line 916  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
   
         close(srv->srv_blob.server.cli_sock);          close(srv->srv_blob.server.cli_sock);
   
         /* detach blobs */  
         TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) {  
                 TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node);  
   
                 rpc_srv_blobFree(srv, b);  
                 e_free(b);  
         }  
   
         schedEnd(&srv->srv_blob.root);  
         AIT_FREE_VAL(&srv->srv_blob.dir);          AIT_FREE_VAL(&srv->srv_blob.dir);
         return 0;          return 0;
 }  }
Line 1056  rpc_srv_endServer(rpc_srv_t ** __restrict psrv) Line 1058  rpc_srv_endServer(rpc_srv_t ** __restrict psrv)
                 return;                  return;
   
         /* if send kill to blob server */          /* if send kill to blob server */
        if (!(*psrv)->srv_blob.kill)        rpc_srv_endBLOBServer(*psrv);
                rpc_srv_endBLOBServer(*psrv); 
   
         (*psrv)->srv_kill = 1;          (*psrv)->srv_kill = 1;
         sleep(RPC_SCHED_POLLING);          sleep(RPC_SCHED_POLLING);
   
           schedEnd(&(*psrv)->srv_root);
   
         pthread_mutex_destroy(&(*psrv)->srv_funcs.mtx);          pthread_mutex_destroy(&(*psrv)->srv_funcs.mtx);
         e_free(*psrv);          e_free(*psrv);
         *psrv = NULL;          *psrv = NULL;
Line 1130  rpc_srv_loopServer(rpc_srv_t * __restrict srv) Line 1133  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
         srv->srv_funcs.avlh_root = NULL;          srv->srv_funcs.avlh_root = NULL;
         RPC_FUNCS_UNLOCK(&srv->srv_funcs);          RPC_FUNCS_UNLOCK(&srv->srv_funcs);
   
         schedEnd(&srv->srv_root);  
         return 0;          return 0;
 }  }
   

Removed from v.1.16.2.2  
changed lines
  Added in v.1.16.2.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>