Diff for /libaitrpc/src/srv.c between versions 1.9.2.24 and 1.10.2.3

version 1.9.2.24, 2012/05/17 15:18:48 version 1.10.2.3, 2012/07/22 19:28:44
Line 62  closeClient(sched_task_t *task) Line 62  closeClient(sched_task_t *task)
         /* free buffer */          /* free buffer */
         AIT_FREE_VAL(&c->cli_buf);          AIT_FREE_VAL(&c->cli_buf);
   
        io_arrayDel(s->srv_clients, c->cli_id, 42);        io_arrayDel(s->srv_clients, c->cli_id, 0);
         if (c)
                 io_free(c);
         return NULL;          return NULL;
 }  }
   
Line 87  txPacket(sched_task_t *task) Line 89  txPacket(sched_task_t *task)
                         rpc->call_rep.ret = RPC_ERROR(-1);                          rpc->call_rep.ret = RPC_ERROR(-1);
                         rpc->call_rep.eno = RPC_ERROR(rpc_Errno);                          rpc->call_rep.eno = RPC_ERROR(rpc_Errno);
                 } else {                  } else {
                        rpc->call_argc = htons(io_arraySize(f->func_vars));                        rpc->call_argc = htons(io_arraySize(RPC_RETVARS(c)));
                         /* Go Encapsulate variables */                          /* Go Encapsulate variables */
                        ret = io_vars2buffer(buf + wlen, sizeof buf - wlen, f->func_vars);                        ret = io_vars2buffer(buf + wlen, sizeof buf - wlen, RPC_RETVARS(c));
                         /* Free return values */                          /* Free return values */
                        io_clrVars(f->func_vars);                        io_freeVars(&c->cli_vars);
                         if (ret == -1) {                          if (ret == -1) {
                                 rpc_SetErr(EBADRPC, "Prepare RPC packet failed");                                  rpc_SetErr(EBADRPC, "Prepare RPC packet failed");
                                 rpc->call_argc ^= rpc->call_argc;                                  rpc->call_argc ^= rpc->call_argc;
Line 151  execCall(sched_task_t *task) Line 153  execCall(sched_task_t *task)
                 rpc->call_rep.eno = RPC_ERROR(rpc_Errno);                  rpc->call_rep.eno = RPC_ERROR(rpc_Errno);
         } else {          } else {
                 /* if client doesn't want reply */                  /* if client doesn't want reply */
                argc = rpc->call_req.flags & RPC_NOREPLY;                argc = RPC_CHK_NOREPLY(rpc);
                rpc->call_rep.ret = RPC_ERROR(rpc_srv_execCall(f, rpc, arr));                rpc->call_rep.ret = RPC_ERROR(rpc_srv_execCall(c, rpc, f->func_name, arr));
                 if (rpc->call_rep.ret == htonl(-1)) {                  if (rpc->call_rep.ret == htonl(-1)) {
                         rpc->call_rep.eno = RPC_ERROR(errno);                          rpc->call_rep.eno = RPC_ERROR(errno);
                         rpc->call_argc ^= rpc->call_argc;                          rpc->call_argc ^= rpc->call_argc;
Line 160  execCall(sched_task_t *task) Line 162  execCall(sched_task_t *task)
                         rpc->call_rep.eno ^= rpc->call_rep.eno;                          rpc->call_rep.eno ^= rpc->call_rep.eno;
                         if (argc) {                          if (argc) {
                                 /* without reply */                                  /* without reply */
                                io_clrVars(f->func_vars);                                io_freeVars(&c->cli_vars);
                                 rpc->call_argc ^= rpc->call_argc;                                  rpc->call_argc ^= rpc->call_argc;
                         } else {                          } else {
                                 /* reply */                                  /* reply */
                                rpc->call_argc = htons(io_arraySize(f->func_vars));                                rpc->call_argc = htons(io_arraySize(RPC_RETVARS(c)));
                         }                          }
                 }                  }
         }          }
Line 227  rxPacket(sched_task_t *task) Line 229  rxPacket(sched_task_t *task)
                         continue;                          continue;
                 }                  }
   
                noreply = rpc->call_req.flags & RPC_NOREPLY;                noreply = RPC_CHK_NOREPLY(rpc);
   
                 /* check RPC packet session info */                  /* check RPC packet session info */
                 if (rpc_chkPktSession(&rpc->call_session, &s->srv_session)) {                  if (rpc_chkPktSession(&rpc->call_session, &s->srv_session)) {
Line 265  acceptClients(sched_task_t *task) Line 267  acceptClients(sched_task_t *task)
                         (c = io_array(srv->srv_clients, i, rpc_cli_t*)); i++);                          (c = io_array(srv->srv_clients, i, rpc_cli_t*)); i++);
         if (c)  /* no more free slots! */          if (c)  /* no more free slots! */
                 goto end;                  goto end;
        c = malloc(sizeof(rpc_cli_t));        c = io_malloc(sizeof(rpc_cli_t));
         if (!c) {          if (!c) {
                 LOGERR;                  LOGERR;
                 srv->srv_kill = 1;                  srv->srv_kill = 1;
Line 314  closeBLOBClient(sched_task_t *task) Line 316  closeBLOBClient(sched_task_t *task)
         /* free buffer */          /* free buffer */
         AIT_FREE_VAL(&c->cli_buf);          AIT_FREE_VAL(&c->cli_buf);
   
        io_arrayDel(s->srv_blob.clients, c->cli_id, 42);        io_arrayDel(s->srv_blob.clients, c->cli_id, 0);
         if (c)
                 io_free(c);
         return NULL;          return NULL;
 }  }
   
Line 417  rxBLOB(sched_task_t *task) Line 421  rxBLOB(sched_task_t *task)
                         }                          }
                         break;                          break;
                 case unset:                  case unset:
                        if (rpc_srv_unregisterBLOB(s, blob.hdr_var) == -1) {                        if (rpc_srv_unregisterBLOB(s, ntohl(blob.hdr_var)) == -1) {
                                 blob.hdr_cmd = error;                                  blob.hdr_cmd = error;
                                 blob.hdr_ret = RPC_ERROR(-1);                                  blob.hdr_ret = RPC_ERROR(-1);
                         }                          }
Line 448  acceptBLOBClients(sched_task_t *task) Line 452  acceptBLOBClients(sched_task_t *task)
                         (c = io_array(srv->srv_blob.clients, i, rpc_cli_t*)); i++);                          (c = io_array(srv->srv_blob.clients, i, rpc_cli_t*)); i++);
         if (c)  /* no more free slots! */          if (c)  /* no more free slots! */
                 goto end;                  goto end;
        c = malloc(sizeof(rpc_cli_t));        c = io_malloc(sizeof(rpc_cli_t));
         if (!c) {          if (!c) {
                 LOGERR;                  LOGERR;
                 srv->srv_kill = srv->srv_blob.kill = 1;                  srv->srv_kill = srv->srv_blob.kill = 1;
Line 592  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s Line 596  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s
  * @srv = RPC Server instance   * @srv = RPC Server instance
  * return: none   * return: none
  */   */
voidinline void
 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
 {  {
         rpc_cli_t *c;  
         register int i;  
         rpc_blob_t *b, *tmp;  
   
         if (!srv)          if (!srv)
                 return;                  return;
   
        if (srv->srv_blob.tid) {        srv->srv_blob.kill = 1;
                pthread_cancel(srv->srv_blob.tid); 
                pthread_join(srv->srv_blob.tid, NULL); 
        } 
 
        /* close all clients connections & server socket */ 
        for (i = 0; i < io_arraySize(srv->srv_blob.clients); i++) { 
                c = io_array(srv->srv_blob.clients, i, rpc_cli_t*); 
                if (c) { 
                        shutdown(c->cli_sock, SHUT_RDWR); 
                        close(c->cli_sock); 
 
                        schedCancelby(srv->srv_blob.root, taskMAX, CRITERIA_ARG, c, NULL); 
                        AIT_FREE_VAL(&c->cli_buf); 
                } 
                io_arrayDel(srv->srv_blob.clients, i, 42); 
        } 
        io_arrayDestroy(&srv->srv_blob.clients); 
 
        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); 
                free(b); 
        } 
 
        schedEnd(&srv->srv_blob.root); 
        AIT_FREE_VAL(&srv->srv_blob.dir); 
 }  }
   
 /*  /*
Line 644  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) Line 614  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
 int  int
 rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
 {  {
           rpc_cli_t *c;
           register int i;
           rpc_blob_t *b, *tmp;
           struct timespec ts = { RPC_SCHED_POLLING, 0 };
   
         if (!srv || srv->srv_kill) {          if (!srv || srv->srv_kill) {
                 rpc_SetErr(EINVAL, "Invalid parameter can`t start BLOB server");                  rpc_SetErr(EINVAL, "Invalid parameter can`t start BLOB server");
                 return -1;                  return -1;
Line 663  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) Line 638  rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv)
                 return -1;                  return -1;
         }          }
   
           schedPolling(srv->srv_blob.root, &ts, NULL);
         /* main rpc loop */          /* main rpc loop */
         schedRun(srv->srv_blob.root, &srv->srv_blob.kill);          schedRun(srv->srv_blob.root, &srv->srv_blob.kill);
   
           /* close all clients connections & server socket */
           for (i = 0; i < io_arraySize(srv->srv_blob.clients); i++) {
                   c = io_array(srv->srv_blob.clients, i, rpc_cli_t*);
                   if (c) {
                           shutdown(c->cli_sock, SHUT_RDWR);
                           close(c->cli_sock);
   
                           schedCancelby(srv->srv_blob.root, taskMAX, CRITERIA_ARG, c, NULL);
                           AIT_FREE_VAL(&c->cli_buf);
                   }
                   io_arrayDel(srv->srv_blob.clients, i, 42);
           }
           io_arrayDestroy(&srv->srv_blob.clients);
   
           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);
                   io_free(b);
           }
   
           schedEnd(&srv->srv_blob.root);
           AIT_FREE_VAL(&srv->srv_blob.dir);
         return 0;          return 0;
 }  }
   
Line 686  rpc_srv_initServer(u_int regProgID, u_char regProcID,  Line 689  rpc_srv_initServer(u_int regProgID, u_char regProcID, 
 {  {
         int n = 1;          int n = 1;
         rpc_srv_t *srv = NULL;          rpc_srv_t *srv = NULL;
        io_sockaddr_t sa;        io_sockaddr_t sa = IO_SOCKADDR_INIT;
   
         if (!concurentClients || !regProgID) {          if (!concurentClients || !regProgID) {
                 rpc_SetErr(EINVAL, "Invalid parameters can`t init RPC server");                  rpc_SetErr(EINVAL, "Invalid parameters can`t init RPC server");
Line 709  rpc_srv_initServer(u_int regProgID, u_char regProcID,  Line 712  rpc_srv_initServer(u_int regProgID, u_char regProcID, 
         srandom((time(&tim) ^ getpid()));          srandom((time(&tim) ^ getpid()));
 #endif  #endif
   
        srv = malloc(sizeof(rpc_srv_t));        srv = io_malloc(sizeof(rpc_srv_t));
         if (!srv) {          if (!srv) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 731  rpc_srv_initServer(u_int regProgID, u_char regProcID,  Line 734  rpc_srv_initServer(u_int regProgID, u_char regProcID, 
         srv->srv_root = schedBegin();          srv->srv_root = schedBegin();
         if (!srv->srv_root) {          if (!srv->srv_root) {
                 rpc_SetErr(sched_GetErrno(), "%s", sched_GetError());                  rpc_SetErr(sched_GetErrno(), "%s", sched_GetError());
                free(srv);                io_free(srv);
                 return NULL;                  return NULL;
         }          }
   
Line 740  rpc_srv_initServer(u_int regProgID, u_char regProcID,  Line 743  rpc_srv_initServer(u_int regProgID, u_char regProcID, 
         if (!srv->srv_clients) {          if (!srv->srv_clients) {
                 rpc_SetErr(io_GetErrno(), "%s", io_GetError());                  rpc_SetErr(io_GetErrno(), "%s", io_GetError());
                 schedEnd(&srv->srv_root);                  schedEnd(&srv->srv_root);
                free(srv);                io_free(srv);
                 return NULL;                  return NULL;
         }          }
   
Line 750  rpc_srv_initServer(u_int regProgID, u_char regProcID,  Line 753  rpc_srv_initServer(u_int regProgID, u_char regProcID, 
                 LOGERR;                  LOGERR;
                 io_arrayDestroy(&srv->srv_clients);                  io_arrayDestroy(&srv->srv_clients);
                 schedEnd(&srv->srv_root);                  schedEnd(&srv->srv_root);
                free(srv);                io_free(srv);
                 return NULL;                  return NULL;
         }          }
         if (setsockopt(srv->srv_server.cli_sock, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n) == -1) {          if (setsockopt(srv->srv_server.cli_sock, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n) == -1) {
Line 779  err: /* error condition */ Line 782  err: /* error condition */
         close(srv->srv_server.cli_sock);          close(srv->srv_server.cli_sock);
         io_arrayDestroy(&srv->srv_clients);          io_arrayDestroy(&srv->srv_clients);
         schedEnd(&srv->srv_root);          schedEnd(&srv->srv_root);
        free(srv);        io_free(srv);
         return NULL;          return NULL;
 }  }
   
Line 789  err: /* error condition */ Line 792  err: /* error condition */
  * @psrv = RPC Server instance   * @psrv = RPC Server instance
  * return: none   * return: none
  */   */
voidinline void
 rpc_srv_endServer(rpc_srv_t ** __restrict psrv)  rpc_srv_endServer(rpc_srv_t ** __restrict psrv)
 {  {
         rpc_cli_t *c;  
         register int i;  
         rpc_func_t *f, *tmp;  
   
         if (!psrv || !*psrv)          if (!psrv || !*psrv)
                 return;                  return;
   
           /* if send kill to blob server */
         if (!(*psrv)->srv_blob.kill)          if (!(*psrv)->srv_blob.kill)
                 rpc_srv_endBLOBServer(*psrv);                  rpc_srv_endBLOBServer(*psrv);
   
        /* close all clients connections & server socket */        (*psrv)->srv_kill = 1;
        for (i = 0; i < io_arraySize((*psrv)->srv_clients); i++) {        sleep(RPC_SCHED_POLLING);
                c = io_array((*psrv)->srv_clients, i, rpc_cli_t*); 
                if (c) { 
                        shutdown(c->cli_sock, SHUT_RDWR); 
                        close(c->cli_sock); 
   
                        schedCancelby((*psrv)->srv_root, taskMAX, CRITERIA_ARG, c, NULL);        io_free(*psrv);
                        AIT_FREE_VAL(&c->cli_buf); 
                } 
                io_arrayDel((*psrv)->srv_clients, i, 42); 
        } 
        io_arrayDestroy(&(*psrv)->srv_clients); 
 
        close((*psrv)->srv_server.cli_sock); 
 
        /* detach exported calls */ 
        TAILQ_FOREACH_SAFE(f, &(*psrv)->srv_funcs, func_node, tmp) { 
                TAILQ_REMOVE(&(*psrv)->srv_funcs, f, func_node); 
 
                io_freeVars(&f->func_vars); 
                AIT_FREE_VAL(&f->func_name); 
                free(f); 
        } 
 
        schedEnd(&(*psrv)->srv_root); 
        free(*psrv); 
         *psrv = NULL;          *psrv = NULL;
 }  }
   
Line 841  rpc_srv_endServer(rpc_srv_t ** __restrict psrv) Line 818  rpc_srv_endServer(rpc_srv_t ** __restrict psrv)
 int  int
 rpc_srv_loopServer(rpc_srv_t * __restrict srv)  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
 {  {
           rpc_cli_t *c;
           register int i;
           rpc_func_t *f, *tmp;
           struct timespec ts = { RPC_SCHED_POLLING, 0 };
   
         if (!srv) {          if (!srv) {
                 rpc_SetErr(EINVAL, "Invalid parameter can`t start RPC server");                  rpc_SetErr(EINVAL, "Invalid parameter can`t start RPC server");
                 return -1;                  return -1;
Line 859  rpc_srv_loopServer(rpc_srv_t * __restrict srv) Line 841  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
                 return -1;                  return -1;
         }          }
   
           schedPolling(srv->srv_root, &ts, NULL);
         /* main rpc loop */          /* main rpc loop */
         schedRun(srv->srv_root, &srv->srv_kill);          schedRun(srv->srv_root, &srv->srv_kill);
   
           /* close all clients connections & server socket */
           for (i = 0; i < io_arraySize(srv->srv_clients); i++) {
                   c = io_array(srv->srv_clients, i, rpc_cli_t*);
                   if (c) {
                           shutdown(c->cli_sock, SHUT_RDWR);
                           close(c->cli_sock);
   
                           schedCancelby(srv->srv_root, taskMAX, CRITERIA_ARG, c, NULL);
                           io_freeVars(&RPC_RETVARS(c));
                           AIT_FREE_VAL(&c->cli_buf);
                   }
                   io_arrayDel(srv->srv_clients, i, 42);
           }
           io_arrayDestroy(&srv->srv_clients);
   
           close(srv->srv_server.cli_sock);
   
           /* detach exported calls */
           TAILQ_FOREACH_SAFE(f, &srv->srv_funcs, func_node, tmp) {
                   TAILQ_REMOVE(&srv->srv_funcs, f, func_node);
   
                   AIT_FREE_VAL(&f->func_name);
                   io_free(f);
           }
   
           schedEnd(&srv->srv_root);
         return 0;          return 0;
 }  }
   
Line 868  rpc_srv_loopServer(rpc_srv_t * __restrict srv) Line 878  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
 /*  /*
  * rpc_srv_execCall() Execute registered call from RPC server   * rpc_srv_execCall() Execute registered call from RPC server
  *   *
 * @call = Register RPC call * @cli = RPC client
  * @rpc = IN RPC call structure   * @rpc = IN RPC call structure
    * @funcname = Execute RPC function
  * @args = IN RPC calling arguments from RPC client   * @args = IN RPC calling arguments from RPC client
  * return: -1 error, !=-1 ok   * return: -1 error, !=-1 ok
  */   */
 int  int
rpc_srv_execCall(rpc_func_t * __restrict call, struct tagRPCCall * __restrict rpc, rpc_srv_execCall(rpc_cli_t * __restrict cli, struct tagRPCCall * __restrict rpc, 
                array_t * __restrict args)                ait_val_t funcname, array_t * __restrict args)
 {  {
         rpc_callback_t func;          rpc_callback_t func;
   
        if (!call || !rpc || !call->func_parent || !AIT_ADDR(&call->func_name)) {        if (!cli || !rpc || !AIT_ADDR(&funcname)) {
                 rpc_SetErr(EINVAL, "Invalid parameter can`t exec function");                  rpc_SetErr(EINVAL, "Invalid parameter can`t exec function");
                 return -1;                  return -1;
         }          }
   
        func = AIT_GET_LIKE(&call->func_name, rpc_callback_t);        func = AIT_GET_LIKE(&funcname, rpc_callback_t);
        return func(call, rpc, args);        return func(cli, rpc, args);
 }  }

Removed from v.1.9.2.24  
changed lines
  Added in v.1.10.2.3


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