From 636e495d2eda51b6cbaa4220132879f54bcdf9a9 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Thu, 26 Sep 2013 23:13:51 +0100 Subject: [PATCH] fix wrong handling of session queue and thus the memory leak. --- include/queue.h | 2 ++ src/application/adapter/http/update.c | 28 ++++++++++++++++++++------- src/application/application.c | 1 - 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/include/queue.h b/include/queue.h index 1f16331..586bcc9 100644 --- a/include/queue.h +++ b/include/queue.h @@ -40,6 +40,8 @@ CLASS(Queue) { * first and last are only available in the initial queue * element (the root). This elelment does not contain any message * and exists only for organizational purpose. + * @TODO next and first always have to be the same...so get rid + * of first. */ Queue first; Queue last; diff --git a/src/application/adapter/http/update.c b/src/application/adapter/http/update.c index 2b6f967..47fa55e 100644 --- a/src/application/adapter/http/update.c +++ b/src/application/adapter/http/update.c @@ -62,8 +62,9 @@ static Session getSession(Queue sess_queue, const char * sid) { - Session sess = NULL; - time_t now = time(NULL); + Session sess = NULL; + Queue current = sess_queue; + time_t now = time(NULL); /** * session start or update @@ -95,12 +96,25 @@ getSession(Queue sess_queue, const char * sid) * remove expired sessions and pick out its own.... * this is O(n), but currently I gave no better idea at all. */ - while (NULL != sess_queue->next) { - Session session = (Session)sess_queue->next->msg; + while (NULL != current->next) { + Session session = (Session)current->next->msg; if (now >= session->livetime) { - Queue to_delete = sess_queue->next; - sess_queue->next = sess_queue->next->next; + Queue to_delete = current->next; + + if (to_delete == sess_queue->first) { + sess_queue->first = to_delete->next; + } + if (to_delete == sess_queue->last) { + if (to_delete == sess_queue->next) { + sess_queue->last = NULL; + } else { + sess_queue->last = current; + } + } + + current->next = to_delete->next; + delete(session); delete(to_delete); continue; @@ -111,7 +125,7 @@ getSession(Queue sess_queue, const char * sid) sess = session; } - sess_queue = sess_queue->next; + current = current->next; } if (NULL == sess) { diff --git a/src/application/application.c b/src/application/application.c index 755210f..911687c 100644 --- a/src/application/application.c +++ b/src/application/application.c @@ -67,7 +67,6 @@ void applicationDtor(void * _this) { Application this = _this; - size_t i; delete(this->active_sessions);