--- libaitrpc/src/lists.c 2012/07/22 20:44:13 1.11 +++ libaitrpc/src/lists.c 2012/11/13 09:22:10 1.12 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: lists.c,v 1.11 2012/07/22 20:44:13 misho Exp $ +* $Id: lists.c,v 1.12 2012/11/13 09:22:10 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -62,11 +62,6 @@ rpc_srv_registerCall(rpc_srv_t * __restrict srv, u_sho if (!srv || !funcaddr) { rpc_SetErr(EINVAL, "Invalid parameter can`t register function"); return -1; - } else { - /* search for duplicate */ - TAILQ_FOREACH(func, &srv->srv_funcs, func_node) - if (AIT_KEY(&func->func_name) == tag) - return 0; } if (!(func = io_malloc(sizeof(rpc_func_t)))) { @@ -74,14 +69,23 @@ rpc_srv_registerCall(rpc_srv_t * __restrict srv, u_sho return -1; } else { memset(func, 0, sizeof(rpc_func_t)); - func->func_parent = srv; + AIT_KEY(&func->func_name) = tag; } - AIT_KEY(&func->func_name) = tag; + /* search for duplicate */ + if (AVL_FIND(tagRPCFuncs, &srv->srv_funcs, func)) { + io_free(func); + return 0; + } + + func->func_parent = srv; AIT_SET_PTR(&func->func_name, funcaddr, 0); /* add to list of functions */ - TAILQ_INSERT_TAIL(&srv->srv_funcs, func, func_node); + RPC_FUNCS_LOCK(&srv->srv_funcs); + SLIST_INSERT_HEAD(&srv->srv_funcs, func, func_next); + AVL_INSERT(tagRPCFuncs, &srv->srv_funcs, func); + RPC_FUNCS_UNLOCK(&srv->srv_funcs); return 1; } @@ -106,7 +110,10 @@ rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, u_s if (!f) /* not found element for unregister */ return 0; - TAILQ_REMOVE(&srv->srv_funcs, f, func_node); + RPC_FUNCS_LOCK(&srv->srv_funcs); + AVL_REMOVE(tagRPCFuncs, &srv->srv_funcs, f); + SLIST_REMOVE(&srv->srv_funcs, f, tagRPCFunc, func_next); + RPC_FUNCS_UNLOCK(&srv->srv_funcs); AIT_FREE_VAL(&f->func_name); io_free(f); @@ -123,18 +130,16 @@ rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, u_s inline rpc_func_t * rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t tag) { - rpc_func_t *f, *tmp; + rpc_func_t tmp; if (!srv) { rpc_SetErr(EINVAL, "Invalid parameter can`t get function"); return NULL; - } + } else + memset(&tmp, 0, sizeof tmp); - TAILQ_FOREACH_SAFE(f, &srv->srv_funcs, func_node, tmp) - if (AIT_KEY(&f->func_name) == tag) - break; - - return f; + AIT_KEY(&tmp.func_name) = tag; + return AVL_FIND(tagRPCFuncs, &srv->srv_funcs, &tmp); } /* --------------------------------------------------------- */