--- libaitrpc/src/lists.c 2013/05/30 09:22:02 1.14 +++ libaitrpc/src/lists.c 2013/07/15 15:10:38 1.14.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: lists.c,v 1.14 2013/05/30 09:22:02 misho Exp $ +* $Id: lists.c,v 1.14.2.2 2013/07/15 15:10:38 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -168,19 +168,33 @@ rpc_srv_getBLOB(rpc_srv_t * __restrict srv, uint32_t v return b; } +static void * +toutBLOB(sched_task_t *task) +{ + rpc_cli_t *c = TASK_ARG(task); + + rpc_srv_unregisterBLOB((rpc_srv_t*) c->cli_parent, (uint32_t) TASK_DATA(task)); + + return NULL; +} + /* * rpc_srv_registerBLOB() - Register new BLOB to server * * @srv = RPC Server instance * @len = BLOB length + * @tout = BLOB live timeout in seconds + * @c = RPC Client * 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_cli_t * __restrict c) { rpc_blob_t *blob = NULL; + struct timespec ts = { tout ? tout : RPC_BLOB_TIMEOUT, 0 }; - if (!srv || !len) { + if (!srv || !len || !c) { rpc_SetErr(EINVAL, "Invalid parameter can`t register BLOB variable"); return blob; } @@ -188,6 +202,9 @@ rpc_srv_registerBLOB(rpc_srv_t * __restrict srv, size_ blob = rpc_srv_blobCreate(srv, len); TAILQ_INSERT_TAIL(&srv->srv_blob.blobs, blob, blob_node); + + schedTimer(srv->srv_blob.root, toutBLOB, c, ts, + (void*) (intptr_t) blob->blob_var, blob->blob_len); return blob; } @@ -213,6 +230,9 @@ rpc_srv_unregisterBLOB(rpc_srv_t * __restrict srv, uin return 0; TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node); + + schedCancelby(srv->srv_blob.root, taskTIMER, CRITERIA_DATA, + (void*) (intptr_t) b->blob_var, NULL); rpc_srv_blobFree(srv, b); e_free(b);