X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fsession.c;h=3ebd9826b2f024d91ecbdc3a43a2bb33dc5bd5c5;hb=cc4b56b6710624c069642d1a510d0060949fe5b9;hp=9569b46c1cf51721aef24b973f3c14cfc493b0f9;hpb=ca208671cc79bbc05c574df788035878e5d39382;p=src%2Fapp-framework-binder.git diff --git a/src/session.c b/src/session.c index 9569b46c..3ebd9826 100644 --- a/src/session.c +++ b/src/session.c @@ -31,6 +31,7 @@ #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 { @@ -38,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"; @@ -46,14 +49,13 @@ static const char key_token[] = "token"; // Free context [XXXX Should be protected again memory abort XXXX] static void ctxUuidFreeCB (AFB_clientCtx *client) { - int idx, cnt; + int idx; // If application add a handle let's free it now if (client->contexts != NULL) { - cnt = afb_apis_count(); // Free client handle with a standard Free function, with app callback or ignore it - for (idx=0; idx < cnt; idx ++) { + for (idx=0; idx < sessions.apicount; idx ++) { if (client->contexts[idx] != NULL) { afb_apis_free_context(idx, client->contexts[idx]); } @@ -62,12 +64,14 @@ static void ctxUuidFreeCB (AFB_clientCtx *client) } // 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) @@ -169,7 +173,7 @@ void ctxStoreGarbage (const int timeout) } // This function will return exiting client context or newly created client context -AFB_clientCtx *ctxClientGet (AFB_request *request, int apiidx) +AFB_clientCtx *ctxClientGet (AFB_request *request) { AFB_clientCtx *clientCtx=NULL; const char *uuid; @@ -196,13 +200,11 @@ AFB_clientCtx *ctxClientGet (AFB_request *request, int apiidx) clientCtx = ctxStoreSearch (uuid); if (clientCtx) { - if (ctxStoreTooOld (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[apiidx]; - request->uuid = uuid; return clientCtx; } } @@ -211,24 +213,20 @@ AFB_clientCtx *ctxClientGet (AFB_request *request, int apiidx) // 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 ((unsigned)afb_apis_count(), sizeof (void*)); + 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[apiidx]; - request->uuid = clientCtx->uuid; return clientCtx; } @@ -248,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)) && (!ctxStoreTooOld (clientCtx, request->config->cntxTimeout))) { + if ((0 == strcmp (token, clientCtx->token)) && (!ctxStoreTooOld (clientCtx, sessions.timeout))) { return AFB_SUCCESS; }