--- libaitrpc/src/srv.c 2024/02/26 16:56:22 1.30.2.7 +++ libaitrpc/src/srv.c 2024/03/20 17:06:11 1.30.2.12 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.30.2.7 2024/02/26 16:56:22 misho Exp $ +* $Id: srv.c,v 1.30.2.12 2024/03/20 17:06:11 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -87,7 +87,8 @@ rpc_freeCli(rpc_cli_t * __restrict c) { rpc_srv_t *s = c->cli_parent; - schedCancelby(s->srv_root, taskMAX, CRITERIA_ARG, c, NULL); + if (s->srv_proto == SOCK_STREAM) + schedCancelby(s->srv_root, taskMAX, CRITERIA_ARG, c, NULL); /* free buffer */ AIT_FREE_VAL(&c->cli_buf); @@ -146,6 +147,11 @@ _allocClient(rpc_srv_t * __restrict srv, sockaddr_t * /* alloc empty buffer */ AIT_SET_BUFSIZ(&c->cli_buf, 0, srv->srv_netbuf); + if (!AIT_GET_BUF(&c->cli_buf)) { + array_Del(srv->srv_clients, n, 0); + e_free(c); + c = NULL; + } } return c; @@ -302,27 +308,12 @@ execCall(sched_task_t *task) taskExit(task, NULL); } -int -rpc_srv_Return(sched_root_task_t *root, rpc_cli_t *c) -{ - rpc_srv_t *s = c->cli_parent; - u_char *buf = AIT_GET_BUF(&c->cli_buf); - struct tagRPCCall *rpc = (struct tagRPCCall*) buf; - - if (!RPC_CHK_NOREPLY(rpc)) { - rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); - schedWrite(root, cbProto[s->srv_proto][CB_TXPACKET], c, c->cli_sock, NULL, 0); - } - - return rpc->call_argc; -} - static void * rxPacket(sched_task_t *task) { rpc_cli_t *c = TASK_ARG(task); rpc_srv_t *s = c->cli_parent; - int len, noreply = 0, rlen = AIT_LEN(&c->cli_buf); + int len, noreply = 0, rlen; #if 0 u_short crc; #endif @@ -575,7 +566,7 @@ rxUDPPacket(sched_task_t *task) c = _allocClient(srv, &sa); if (!c) { - EVERBOSE(1, "RPC client quota exceeded! Connection will be shutdown!\n"); + EVERBOSE(1, "RPC client quota exceeded!"); usleep(2000); /* blocked client delay */ goto end; } else { @@ -1012,7 +1003,7 @@ rxEXTPacket(sched_task_t *task) { rpc_srv_t *srv = TASK_ARG(task); rpc_cli_t *c = NULL; - int len, noreply = 0, rlen = AIT_LEN(&c->cli_buf); + int len, noreply = 0, rlen; struct tagRPCCall *rpc; struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; sockaddr_t sa; @@ -1580,8 +1571,7 @@ rpc_srv_initServer(u_char InstID, int concurentClients pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); return NULL; - } else - schedSignalDispatch(srv->srv_root, 42); + } /* init pool for clients */ srv->srv_clients = array_Init(concurentClients); @@ -1703,7 +1693,6 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) schedPolling(srv->srv_root, &ts, NULL); /* main rpc loop */ schedRun(srv->srv_root, &srv->srv_kill); - schedSignalDispatch(srv->srv_root, 0); /* close all clients connections & server socket */ for (i = 0; i < array_Size(srv->srv_clients); i++) { @@ -1842,8 +1831,7 @@ rpc_srv_initServer2(u_char InstID, int concurentClient pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); return NULL; - } else - schedSignalDispatch(srv->srv_root, 42); + } /* init pool for clients */ srv->srv_clients = array_Init(concurentClients); @@ -1961,8 +1949,7 @@ rpc_srv_initServerExt(u_char InstID, int netBuf, int f pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); return NULL; - } else - schedSignalDispatch(srv->srv_root, 42); + } /* init pool for clients */ srv->srv_clients = array_Init(1); @@ -1980,4 +1967,26 @@ rpc_srv_initServerExt(u_char InstID, int netBuf, int f rpc_register_srvPing(srv); return srv; +} + +/* + * rpc_srv_Return() - Prepare IPC return answer to RPC client + * + * @c = RPC client + * return: number of arguments in response + */ +int +rpc_srv_Return(rpc_cli_t *c) +{ + rpc_srv_t *s = c->cli_parent; + u_char *buf = AIT_GET_BUF(&c->cli_buf); + struct tagRPCCall *rpc = (struct tagRPCCall*) buf; + + if (!RPC_CHK_NOREPLY(rpc)) { + rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); + schedWrite(s->srv_root, cbProto[s->srv_proto][CB_TXPACKET], c, c->cli_sock, rpc, 0); + } else + rpc->call_argc ^= rpc->call_argc; + + return rpc->call_argc; }