X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fsession.c;h=3ebd9826b2f024d91ecbdc3a43a2bb33dc5bd5c5;hb=4a6f90f69c15bb4d99bbbae50e9c9e267dc9b244;hp=743f825470ac85cb848625f56cd0a639eec27fa7;hpb=8ca3d16606a99ef91d01a623dbe5ce1331688953;p=src%2Fapp-framework-binder.git diff --git a/src/session.c b/src/session.c index 743f8254..3ebd9826 100644 --- a/src/session.c +++ b/src/session.c @@ -30,6 +30,8 @@ #include #include +#include "afb-apis.h" +#include "session.h" // Session UUID are store in a simple array [for 10 sessions this should be enough] static struct { @@ -37,6 +39,8 @@ static struct { AFB_clientCtx **store; // sessions store int count; // current number of sessions int max; + int timeout; + int apicount; } sessions; static const char key_uuid[] = "uuid"; @@ -45,34 +49,29 @@ static const char key_token[] = "token"; // Free context [XXXX Should be protected again memory abort XXXX] static void ctxUuidFreeCB (AFB_clientCtx *client) { - - AFB_plugin **plugins = client->plugins; - AFB_freeCtxCB freeCtxCB; int idx; // If application add a handle let's free it now if (client->contexts != NULL) { // Free client handle with a standard Free function, with app callback or ignore it - for (idx=0; client->plugins[idx] != NULL; idx ++) { + for (idx=0; idx < sessions.apicount; idx ++) { if (client->contexts[idx] != NULL) { - freeCtxCB = client->plugins[idx]->freeCtxCB; - if (freeCtxCB == NULL) - free (client->contexts[idx]); - else if (freeCtxCB != (void*)-1) - freeCtxCB(client->contexts[idx], plugins[idx]->handle, client->uuid); + afb_apis_free_context(idx, client->contexts[idx]); } } } } // Create a new store in RAM, not that is too small it will be automatically extended -void ctxStoreInit (int nbSession) +void ctxStoreInit (int nbSession, int timeout, int apicount) { // let's create as store as hashtable does not have any sessions.store = calloc (1 + (unsigned)nbSession, sizeof(AFB_clientCtx)); sessions.max = nbSession; + sessions.timeout = timeout; + sessions.apicount = apicount; } static AFB_clientCtx *ctxStoreSearch (const char* uuid) @@ -150,7 +149,7 @@ static AFB_error ctxStoreAdd (AFB_clientCtx *client) } // Check if context timeout or not -static int ctxStoreToOld (AFB_clientCtx *ctx, int timeout) +static int ctxStoreTooOld (AFB_clientCtx *ctx, int timeout) { int res; time_t now = time(NULL); @@ -166,15 +165,15 @@ void ctxStoreGarbage (const int timeout) // Loop on Sessions Table and remove anything that is older than timeout for (idx=0; idx < sessions.max; idx++) { - ctx=sessions.store[idx]; - if ((ctx != NULL) && (ctxStoreToOld(ctx, timeout))) { + ctx = sessions.store[idx]; + if ((ctx != NULL) && (ctxStoreTooOld(ctx, timeout))) { ctxStoreDel (ctx); } } } // This function will return exiting client context or newly created client context -AFB_clientCtx *ctxClientGet (AFB_request *request, int idx) +AFB_clientCtx *ctxClientGet (AFB_request *request) { AFB_clientCtx *clientCtx=NULL; const char *uuid; @@ -201,14 +200,11 @@ AFB_clientCtx *ctxClientGet (AFB_request *request, int idx) clientCtx = ctxStoreSearch (uuid); if (clientCtx) { - if (ctxStoreToOld (clientCtx, request->config->cntxTimeout)) { + if (ctxStoreTooOld (clientCtx, sessions.timeout)) { // this session is too old let's delete it ctxStoreDel (clientCtx); clientCtx = NULL; } else { - request->context=clientCtx->contexts[idx]; - request->handle = clientCtx->plugins[idx]->handle; - request->uuid= uuid; return clientCtx; } } @@ -217,26 +213,20 @@ AFB_clientCtx *ctxClientGet (AFB_request *request, int idx) // we have no session let's create one otherwise let's clean any exiting values if (clientCtx == NULL) { clientCtx = calloc(1, sizeof(AFB_clientCtx)); // init NULL clientContext - clientCtx->contexts = calloc (1, (unsigned)request->config->pluginCount * (sizeof (void*))); - clientCtx->plugins = request->plugins; + clientCtx->contexts = calloc ((unsigned)sessions.apicount, sizeof (void*)); } uuid_generate(newuuid); // create a new UUID uuid_unparse_lower(newuuid, clientCtx->uuid); // if table is full at 50% let's clean it up - if(sessions.count > (sessions.max / 2)) ctxStoreGarbage(request->config->cntxTimeout); + if(sessions.count > (sessions.max / 2)) ctxStoreGarbage(sessions.timeout); // finally add uuid into hashtable if (AFB_SUCCESS != ctxStoreAdd (clientCtx)) { free (clientCtx); return NULL; } - - // if (verbose) fprintf (stderr, "ctxClientGet New uuid=[%s] token=[%s] timestamp=%d\n", clientCtx->uuid, clientCtx->token, clientCtx->timeStamp); - request->context = clientCtx->contexts[idx]; - request->handle = clientCtx->plugins[idx]->handle; - request->uuid=clientCtx->uuid; return clientCtx; } @@ -256,7 +246,7 @@ AFB_error ctxTokenCheck (AFB_clientCtx *clientCtx, AFB_request *request) return AFB_FALSE; // compare current token with previous one - if ((0 == strcmp (token, clientCtx->token)) && (!ctxStoreToOld (clientCtx, request->config->cntxTimeout))) { + if ((0 == strcmp (token, clientCtx->token)) && (!ctxStoreTooOld (clientCtx, sessions.timeout))) { return AFB_SUCCESS; }