--- libaitrpc/src/lists.c 2012/05/16 08:10:39 1.9.2.3 +++ libaitrpc/src/lists.c 2013/07/16 12:35:25 1.14.2.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: lists.c,v 1.9.2.3 2012/05/16 08:10:39 misho Exp $ +* $Id: lists.c,v 1.14.2.3 2013/07/16 12:35:25 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -52,44 +52,40 @@ SUCH DAMAGE. * @srv = RPC Server instance * @tag = Function tag * @funcaddr = Function address - * @args = Number of return function arguments * return: -1 error, 0 already registered tag or 1 register ok */ int -rpc_srv_registerCall(rpc_srv_t * __restrict srv, u_short tag, void *funcaddr, u_short args) +rpc_srv_registerCall(rpc_srv_t * __restrict srv, u_short tag, void *funcaddr) { rpc_func_t *func; 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 = malloc(sizeof(rpc_func_t)))) { + if (!(func = e_malloc(sizeof(rpc_func_t)))) { LOGERR; 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; - AIT_SET_PTR(&func->func_name, funcaddr, 0); - - /* allocate return variables */ - if (args > 0 && !(func->func_vars = io_allocVars(args))) { - AIT_FREE_VAL(&func->func_name); - free(func); - return -1; + /* search for duplicate */ + if (AVL_FIND(tagRPCFuncs, &srv->srv_funcs, func)) { + e_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; } @@ -114,11 +110,13 @@ 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); - io_freeVars(&f->func_vars); AIT_FREE_VAL(&f->func_name); - free(f); + e_free(f); return 1; } @@ -129,21 +127,19 @@ rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, u_s * @tag = tag for function * return: NULL not found call, !=NULL return call */ -inline rpc_func_t * +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); } /* --------------------------------------------------------- */ @@ -155,7 +151,7 @@ rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t t * @var = hash for variable * return: NULL not found, !=NULL return blob var */ -inline rpc_blob_t * +rpc_blob_t * rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t var) { rpc_blob_t *b, *tmp; @@ -177,10 +173,11 @@ rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t v * * @srv = RPC Server instance * @len = BLOB length + * @tout = BLOB live timeout in seconds * return: NULL error or new registered BLOB */ rpc_blob_t * -rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_t len) +rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_t len, int tout) { rpc_blob_t *blob = NULL; @@ -189,9 +186,10 @@ rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_ return blob; } - blob = rpc_srv_blobCreate(srv, len); + blob = rpc_srv_blobCreate(srv, len, tout); TAILQ_INSERT_TAIL(&srv->srv_blob.blobs, blob, blob_node); + return blob; } @@ -219,6 +217,6 @@ rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, uin TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node); rpc_srv_blobFree(srv, b); - free(b); + e_free(b); return 1; }