X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-session.c;h=1e3f5085ceb00b2d08d918c33876406ab16ac5c0;hb=3e3a29fa49ec494800a4aa866d84fba4eaa8261b;hp=c312b46cbd9adc150dbaf9ea9a9d037959d9c303;hpb=c2490604356e9a32f6be7c1eeac210d467eb6d89;p=src%2Fapp-framework-binder.git diff --git a/src/afb-session.c b/src/afb-session.c index c312b46c..1e3f5085 100644 --- a/src/afb-session.c +++ b/src/afb-session.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -227,21 +228,12 @@ static void session_destroy (struct afb_session *session) /* update expiration of 'session' according to 'now' */ static void session_update_expiration(struct afb_session *session, time_t now) { - int timeout; time_t expiration; /* compute expiration */ - timeout = session->timeout; - if (timeout == AFB_SESSION_TIMEOUT_INFINITE) + expiration = now + afb_session_timeout(session); + if (expiration < 0) expiration = MAX_EXPIRATION; - else { - if (timeout == AFB_SESSION_TIMEOUT_DEFAULT) - expiration = now + sessions.timeout; - else - expiration = now + timeout; - if (expiration < 0) - expiration = MAX_EXPIRATION; - } /* record the expiration */ session->expiration = expiration; @@ -416,6 +408,30 @@ struct afb_session *afb_session_create (int timeout) return afb_session_get(NULL, timeout, NULL); } +/** + * Returns the timeout of 'session' in seconds + */ +int afb_session_timeout(struct afb_session *session) +{ + int timeout; + + /* compute timeout */ + timeout = session->timeout; + if (timeout == AFB_SESSION_TIMEOUT_DEFAULT) + timeout = sessions.timeout; + if (timeout < 0) + timeout = INT_MAX; + return timeout; +} + +/** + * Returns the second remaining before expiration of 'session' + */ +int afb_session_what_remains(struct afb_session *session) +{ + return (int)(session->expiration - NOW); +} + /* This function will return exiting session or newly created session */ struct afb_session *afb_session_get (const char *uuid, int timeout, int *created) { @@ -459,6 +475,7 @@ struct afb_session *afb_session_addref(struct afb_session *session) { if (session != NULL) { afb_hook_session_addref(session); + session_lock(session); session->refcount++; session_unlock(session); } @@ -471,9 +488,9 @@ void afb_session_unref(struct afb_session *session) if (session == NULL) return; - session_lock(session); afb_hook_session_unref(session); - if (--session->refcount) { + session_lock(session); + if (!--session->refcount) { if (session->autoclose) session_close(session); if (session->notinset) {