From 4a6f90f69c15bb4d99bbbae50e9c9e267dc9b244 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Wed, 30 Mar 2016 14:47:40 +0200 Subject: [PATCH] static setup of sessions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: I51b7c20ffe2a1fecf1471522df0aa66d81dcaec1 Signed-off-by: José Bollo --- src/main.c | 2 +- src/session.c | 19 +++++++++++-------- src/session.h | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main.c b/src/main.c index 400a55c0..e11a3a14 100644 --- a/src/main.c +++ b/src/main.c @@ -549,7 +549,7 @@ int main(int argc, char *argv[]) { if (session->config->ldpaths) afb_apis_add_pathset(session->config->ldpaths); - ctxStoreInit(CTX_NBCLIENTS); + ctxStoreInit(CTX_NBCLIENTS, session->config->cntxTimeout, afb_apis_count()); install_error_handlers(); diff --git a/src/session.c b/src/session.c index 9504fdbe..3ebd9826 100644 --- a/src/session.c +++ b/src/session.c @@ -39,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"; @@ -47,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]); } @@ -63,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) @@ -197,7 +200,7 @@ AFB_clientCtx *ctxClientGet (AFB_request *request) 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; @@ -210,14 +213,14 @@ AFB_clientCtx *ctxClientGet (AFB_request *request) // 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)) { @@ -243,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; } diff --git a/src/session.h b/src/session.h index e3b9b811..6c0b1d89 100644 --- a/src/session.h +++ b/src/session.h @@ -20,5 +20,5 @@ extern AFB_error ctxTokenCreate (AFB_clientCtx *clientCtx, AFB_request *request) extern AFB_error ctxTokenCheck (AFB_clientCtx *clientCtx, AFB_request *request); extern AFB_error ctxTokenReset (AFB_clientCtx *clientCtx, AFB_request *request); extern AFB_clientCtx *ctxClientGet (AFB_request *request); -extern void ctxStoreInit (int); +extern void ctxStoreInit (int nbSession, int timeout, int apicount); -- 2.16.6