Browse Source

fix wrong handling of session queue and thus the memory leak.

release0.1.5
Georg Hopp 12 years ago
parent
commit
db22ebe7a1
  1. 2
      include/queue.h
  2. 28
      src/application/adapter/http/update.c
  3. 1
      src/application/application.c

2
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;

28
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) {

1
src/application/application.c

@ -67,7 +67,6 @@ void
applicationDtor(void * _this)
{
Application this = _this;
size_t i;
delete(this->active_sessions);

Loading…
Cancel
Save