--- libaitrpc/src/lists.c 2011/09/01 11:39:26 1.4.2.3 +++ libaitrpc/src/lists.c 2011/09/03 13:18:26 1.4.2.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: lists.c,v 1.4.2.3 2011/09/01 11:39:26 misho Exp $ +* $Id: lists.c,v 1.4.2.6 2011/09/03 13:18:26 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -221,6 +221,7 @@ rpc_srv_registerCall(rpc_srv_t * __restrict srv, const func->func_next = srv->srv_funcs; srv->srv_funcs = func; pthread_mutex_unlock(&srv->srv_mtx); + printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<func_name, func); return 0; } @@ -254,24 +255,25 @@ rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, con func.func_tag = crcFletcher16((u_short*) str, sizeof str / 2); func.func_hash = hash_fnv((char*) str, sizeof str); + pthread_mutex_lock(&srv->srv_mtx); f = rpc_srv_getCall(srv, func.func_tag, func.func_hash); if (!f) /* not found element for unregister */ return 0; - pthread_mutex_lock(&srv->srv_mtx); + printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>func(%s)=%p\n", f->func_name, f); if (srv->srv_funcs == f) { /* if is 1st element */ srv->srv_funcs = srv->srv_funcs->func_next; - if (f->func_vars) - rpc_srv_destroyVars(f); + rpc_srv_destroyVars(f); free(f); + f = NULL; } else { for (curr = srv->srv_funcs; curr->func_next != f; curr = curr->func_next); curr->func_next = curr->func_next->func_next; - if (f->func_vars) - rpc_srv_destroyVars(f); + rpc_srv_destroyVars(f); free(f); + f = NULL; } pthread_mutex_unlock(&srv->srv_mtx); @@ -353,12 +355,10 @@ rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t v return NULL; } - pthread_mutex_lock(&srv->srv_blob.mtx); for (b = srv->srv_blob.blobs; b; b = b->blob_next) { if (b->blob_var == var) break; } - pthread_mutex_unlock(&srv->srv_blob.mtx); return b; } @@ -409,6 +409,9 @@ rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, uin b = rpc_srv_getBLOB(srv, var); if (!b) /* not found element for unregister */ return 0; + /* if BLOB is unmapped force to unmap object */ + if (b->blob_data) + rpc_srv_blobUnmap(b); pthread_mutex_lock(&srv->srv_blob.mtx); if (srv->srv_blob.blobs == b) { /* if is 1st element */