--- libaitrpc/inc/aitrpc.h 2011/08/31 17:11:58 1.3.2.4 +++ libaitrpc/inc/aitrpc.h 2011/09/03 12:58:49 1.3.2.7 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitrpc.h,v 1.3.2.4 2011/08/31 17:11:58 misho Exp $ +* $Id: aitrpc.h,v 1.3.2.7 2011/09/03 12:58:49 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -79,9 +79,9 @@ SUCH DAMAGE. /* RPC types */ typedef enum { - disable, enable, kill, /* for blob.state */ - ok, error, /* for blob reply */ - get, set, unset /* for blob request */ + disable, enable, running, kill, /* for blob.state */ + ok, error, /* for blob reply */ + get, set, unset /* for blob request */ } cmd_type_t; @@ -94,7 +94,7 @@ typedef enum { } while (0) #define RPC_CALLBACK_CHK_ARGS(_f, _n) do { \ RPC_CALLBACK_CHECK_INPUT((_f)); \ - if ((_f) && (_f)->func_args != _n) { \ + if ((_f) && io_arraySize((_f)->func_vars) != _n) { \ rpc_SetErr(22, "Error:: different number of arguments!\n"); \ return -1; \ } \ @@ -119,7 +119,6 @@ typedef struct tagRPCFunc { int8_t func_file[MAXPATHLEN]; int8_t func_name[UCHAR_MAX + 1]; - uint16_t func_args; array_t *func_vars; void *func_parent; @@ -248,11 +247,19 @@ rpc_srv_t *rpc_srv_initServer(u_int regProgID, u_int r */ void rpc_srv_endServer(rpc_srv_t * __restrict srv); /* - * rpc_srv_execServer() Execute Main server loop and wait for clients requests + * rpc_srv_loopServer() Execute Main server loop and wait for clients requests * @srv = RPC Server instance * return: -1 error or 0 ok, infinite loop ... */ -int rpc_srv_execServer(rpc_srv_t * __restrict srv); +int rpc_srv_loopServer(rpc_srv_t * __restrict srv); +#define rpc_srv_execServer(_srv, _sync) do { assert((_srv)); pthread_t __tid; \ + pthread_create(&__tid, NULL, (void*(*)(void*)) \ + rpc_srv_loopServer, (_srv)); \ + if ((_sync)) \ + pthread_join(__tid, (void**) (_sync)); \ + else \ + pthread_detach(__tid); \ + } while (0) /* * rpc_srv_initBLOBServer() Init & create BLOB Server @@ -269,11 +276,19 @@ int rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, */ void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv); /* - * rpc_srv_execBLOBServer() Execute Main BLOB server loop and wait for clients requests + * rpc_srv_loopBLOB() Execute Main BLOB server loop and wait for clients requests * @srv = RPC Server instance * return: -1 error or 0 ok, infinite loop ... */ -int rpc_srv_execBLOBServer(rpc_srv_t * __restrict srv); +int rpc_srv_loopBLOB(rpc_srv_t * __restrict srv); +#define rpc_srv_execBLOBServer(_srv) do { assert((_srv)); pthread_t __tid; \ + if ((_srv)->srv_blob.state == enable) { \ + pthread_create(&__tid, NULL, (void*(*)(void*)) \ + rpc_srv_loopBLOB, (_srv)); \ + pthread_detach(__tid); \ + (_srv)->srv_blob.state = running; \ + } \ + } while (0) /* * rpc_srv_registerCall() Register call to RPC server @@ -321,14 +336,6 @@ int rpc_srv_execCall(rpc_func_t * __restrict call, str /* - * rpc_srv_returnVars() Init return variables for RPC call and zeroed values - (for safe handling return values, use this!) - * @call = RPC function call - * @varnum = Number of return variables - * return: NULL error, !=NULL array with return values for RPC call with varnum items - */ -inline array_t *rpc_srv_returnVars(rpc_func_t * __restrict call, int varnum); -/* * rpc_srv_allocVars() Allocate array for call variables, if already allocated memory for RPC call reallocate used space * @call = RPC function call @@ -336,14 +343,19 @@ inline array_t *rpc_srv_returnVars(rpc_func_t * __rest * return: -1 error, !=-1 return varnum value */ inline int rpc_srv_allocVars(rpc_func_t * __restrict call, int varnum); -#define rpc_srv_freeVars(_call) (assert((_call)), rpc_srv_allocVars((_call), 0)) /* - * rpc_srv_zeroVars() Clean values from variables of RPC call + * rpc_srv_destroyVars() Destroy variables of array & array * @call = RPC function call - * return: -1 error, !=-1 Returned number of cleaned RPC variables + * return: -1 error, !=-1 Returne remained variables */ -inline int rpc_srv_zeroVars(rpc_func_t * __restrict call); +inline int rpc_srv_destroyVars(rpc_func_t * __restrict call); /* + * rpc_srv_freeVals() Clean values from variables of array + * @call = RPC function call + * return: -1 error, !=-1 Returned number of cleaned variables + */ +inline int rpc_srv_freeVals(rpc_func_t * __restrict call); +/* * rpc_srv_copyVars() Copy variables for RPC call to new variable array * @call = RPC function call * @newvars = New allocated variables array, must be free after use @@ -441,7 +453,7 @@ int rpc_cli_sendBLOB(rpc_cli_t * __restrict cli, ait_v * @data = BLOB data, must be free after use! * return: -1 error, 0 ok, 1 remote error */ -int rpc_cli_recvBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** data); +int rpc_cli_recvBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** __restrict data); /* * rpc_cli_delBLOB() Delete BLOB from server * @cli = Client instance @@ -456,7 +468,7 @@ int rpc_cli_delBLOB(rpc_cli_t * __restrict cli, ait_va * @data = BLOB data, must be free after use! * return: -1 error, 0 ok, >0 remote error */ -inline int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** data); +inline int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_val_t * __restrict var, void ** __restrict data);