--- libaitrpc/src/srv.c 2012/07/22 20:44:13 1.11 +++ libaitrpc/src/srv.c 2012/11/13 09:22:10 1.12 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.11 2012/07/22 20:44:13 misho Exp $ +* $Id: srv.c,v 1.12 2012/11/13 09:22:10 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -135,7 +135,7 @@ execCall(sched_task_t *task) if (argc) { arr = io_buffer2vars(buf + sizeof(struct tagRPCCall), AIT_LEN(&c->cli_buf) - TASK_VAL(task) - sizeof(struct tagRPCCall), - argc, 1); + argc, 42); if (!arr) { rpc_SetErr(ERPCMISMATCH, "#%d - %s", io_GetErrno(), io_GetError()); rpc->call_argc ^= rpc->call_argc; @@ -185,7 +185,10 @@ rxPacket(sched_task_t *task) u_char *buf = AIT_GET_BUF(&c->cli_buf); struct tagRPCCall *rpc; - memset(buf, 0, AIT_LEN(&c->cli_buf)); + if (!off) + memset(buf, 0, AIT_LEN(&c->cli_buf)); + else + memmove(buf, buf + off, AIT_LEN(&c->cli_buf) - off); rlen = recv(TASK_FD(task), buf + off, AIT_LEN(&c->cli_buf) - off, 0); if (rlen < 1) { /* close connection */ @@ -446,6 +449,9 @@ acceptBLOBClients(sched_task_t *task) rpc_cli_t *c = NULL; register int i; socklen_t salen = sizeof(io_sockaddr_t); +#ifdef TCP_NOPUSH + int n = 1; +#endif /* check free slots for connect */ for (i = 0; i < io_arraySize(srv->srv_blob.clients) && @@ -474,8 +480,12 @@ acceptBLOBClients(sched_task_t *task) AIT_FREE_VAL(&c->cli_buf); io_arrayDel(srv->srv_blob.clients, i, 42); goto end; - } else + } else { +#ifdef TCP_NOPUSH + setsockopt(c->cli_sock, IPPROTO_TCP, TCP_NOPUSH, &n, sizeof n); +#endif fcntl(c->cli_sock, F_SETFL, fcntl(c->cli_sock, F_GETFL) | O_NONBLOCK); + } schedRead(TASK_ROOT(task), rxBLOB, c, c->cli_sock, NULL, 0); end: @@ -702,7 +712,7 @@ rpc_srv_initServer(u_int regProgID, u_char regProcID, if (netBuf < RPC_MIN_BUFSIZ) netBuf = BUFSIZ; else - netBuf = io_align(netBuf, 1); /* align netBuf length */ + netBuf = io_align(netBuf, 2); /* align netBuf length */ #ifdef HAVE_SRANDOMDEV srandomdev(); @@ -727,13 +737,16 @@ rpc_srv_initServer(u_int regProgID, u_char regProcID, srv->srv_server.cli_parent = srv; memcpy(&srv->srv_server.cli_sa, &sa, sizeof srv->srv_server.cli_sa); - /* init functions list */ - TAILQ_INIT(&srv->srv_funcs); + /* init functions */ + pthread_mutex_init(&srv->srv_funcs.mtx, NULL); + SLIST_INIT(&srv->srv_funcs); + AVL_INIT(&srv->srv_funcs); /* init scheduler */ srv->srv_root = schedBegin(); if (!srv->srv_root) { rpc_SetErr(sched_GetErrno(), "%s", sched_GetError()); + pthread_mutex_destroy(&srv->srv_funcs.mtx); io_free(srv); return NULL; } @@ -743,6 +756,7 @@ rpc_srv_initServer(u_int regProgID, u_char regProcID, if (!srv->srv_clients) { rpc_SetErr(io_GetErrno(), "%s", io_GetError()); schedEnd(&srv->srv_root); + pthread_mutex_destroy(&srv->srv_funcs.mtx); io_free(srv); return NULL; } @@ -753,6 +767,7 @@ rpc_srv_initServer(u_int regProgID, u_char regProcID, LOGERR; io_arrayDestroy(&srv->srv_clients); schedEnd(&srv->srv_root); + pthread_mutex_destroy(&srv->srv_funcs.mtx); io_free(srv); return NULL; } @@ -782,6 +797,7 @@ err: /* error condition */ close(srv->srv_server.cli_sock); io_arrayDestroy(&srv->srv_clients); schedEnd(&srv->srv_root); + pthread_mutex_destroy(&srv->srv_funcs.mtx); io_free(srv); return NULL; } @@ -805,6 +821,7 @@ rpc_srv_endServer(rpc_srv_t ** __restrict psrv) (*psrv)->srv_kill = 1; sleep(RPC_SCHED_POLLING); + pthread_mutex_destroy(&(*psrv)->srv_funcs.mtx); io_free(*psrv); *psrv = NULL; } @@ -820,7 +837,7 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) { rpc_cli_t *c; register int i; - rpc_func_t *f, *tmp; + rpc_func_t *f; struct timespec ts = { RPC_SCHED_POLLING, 0 }; if (!srv) { @@ -828,13 +845,12 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) return -1; } - fcntl(srv->srv_server.cli_sock, F_SETFL, - fcntl(srv->srv_server.cli_sock, F_GETFL) | O_NONBLOCK); - if (listen(srv->srv_server.cli_sock, io_arraySize(srv->srv_clients)) == -1) { LOGERR; return -1; - } + } else + fcntl(srv->srv_server.cli_sock, F_SETFL, + fcntl(srv->srv_server.cli_sock, F_GETFL) | O_NONBLOCK); if (!schedRead(srv->srv_root, acceptClients, srv, srv->srv_server.cli_sock, NULL, 0)) { rpc_SetErr(sched_GetErrno(), "%s", sched_GetError()); @@ -863,12 +879,15 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) 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); + RPC_FUNCS_LOCK(&srv->srv_funcs); + while ((f = SLIST_FIRST(&srv->srv_funcs))) { + SLIST_REMOVE_HEAD(&srv->srv_funcs, func_next); AIT_FREE_VAL(&f->func_name); io_free(f); } + srv->srv_funcs.avlh_root = NULL; + RPC_FUNCS_UNLOCK(&srv->srv_funcs); schedEnd(&srv->srv_root); return 0;