aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-03-30 14:47:40 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2016-03-30 14:47:40 +0200
commit4a6f90f69c15bb4d99bbbae50e9c9e267dc9b244 (patch)
tree5a3b24ce1f62292cd09eb310cfbe8e3abac46550 /src
parent0a621f91ee673dd9182467a4ed649636dd0f2ba0 (diff)
static setup of sessions
Change-Id: I51b7c20ffe2a1fecf1471522df0aa66d81dcaec1 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src')
-rw-r--r--src/main.c2
-rw-r--r--src/session.c19
-rw-r--r--src/session.h2
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);