--- libaitrpc/src/blob.c 2013/07/15 14:27:28 1.13.2.3 +++ libaitrpc/src/blob.c 2013/07/16 12:35:25 1.13.2.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: blob.c,v 1.13.2.3 2013/07/15 14:27:28 misho Exp $ +* $Id: blob.c,v 1.13.2.4 2013/07/16 12:35:25 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -46,20 +46,31 @@ SUCH DAMAGE. #include "global.h" +static void * +toutBLOB(sched_task_t *task) +{ + rpc_srv_unregisterBLOB(TASK_DATA(task), ((rpc_blob_t*) TASK_ARG(task))->blob_var); + + return NULL; +} + + /* * rpc_srv_blobCreate() - Create and map blob to memory region and return object * * @srv = RPC Server instance * @len = BLOB length object + * @tout = BLOB live timeout in seconds * return: NULL error or !=NULL allocated BLOB object */ rpc_blob_t * -rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len) +rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len, int tout) { rpc_blob_t *blob = NULL; char szFName[MAXPATHLEN]; int f; u_int rnd; + struct timespec ts = { tout ? tout : RPC_BLOB_TIMEOUT, 0 }; again: rnd = random() % UINT_MAX; @@ -101,6 +112,8 @@ again: blob->blob_len = len; blob->blob_var = rnd; + + schedTimer(srv->srv_blob.root, toutBLOB, blob, ts, srv, 0); return blob; } @@ -181,6 +194,8 @@ rpc_srv_blobFree(rpc_srv_t * __restrict srv, rpc_blob_ return -1; } else rpc_srv_blobUnmap(blob); + + schedCancelby(srv->srv_blob.root, taskTIMER, CRITERIA_ARG, blob, NULL); memset(szFName, 0, sizeof szFName); snprintf(szFName, sizeof szFName, BLOB_FILE, AIT_GET_STRZ(&srv->srv_blob.dir), blob->blob_var);