This file defines everything related to sessions.
Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
-
+
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation, version 2.1
#include <types/session.h>
extern struct pool_head *pool2_session;
+extern struct list sessions;
void session_free(struct session *s);
This file defines everything related to sessions.
Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
-
+
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation, version 2.1
* server should eventually be released.
*/
struct session {
+ struct list list; /* position in global sessions list */
struct task *task; /* the task associated with this session */
/* application specific below */
struct proxy *fe; /* the proxy this session depends on for the client side */
/*
* FIXME: This should move to the STREAM_SOCK code then split into TCP and HTTP.
*/
-
+
/*
* this function is called on a read event from a listen socket, corresponding
* to an accept. It tries to accept as many connections as possible.
goto out_close;
}
+ LIST_ADDQ(&sessions, &s->list);
+
s->flags = 0;
s->term_trace = 0;
out_free_task:
pool_free2(pool2_task, t);
out_free_session:
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
out_close:
close(cfd);
return 0;
}
+ LIST_ADDQ(&sessions, &s->list);
+
s->flags = 0;
s->term_trace = 0;
if ((t = pool_alloc2(pool2_task)) == NULL) {
Alert("out of memory in uxst_event_accept().\n");
close(cfd);
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
return 0;
}
Alert("accept(): not enough free sockets. Raise -n argument. Giving up.\n");
close(cfd);
pool_free2(pool2_task, t);
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
return 0;
}
Alert("accept(): cannot set the socket in non blocking mode. Giving up\n");
close(cfd);
pool_free2(pool2_task, t);
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
return 0;
}
if ((s->req = pool_alloc2(pool2_buffer)) == NULL) { /* no memory */
close(cfd); /* nothing can be done for this fd without memory */
pool_free2(pool2_task, t);
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
return 0;
}
pool_free2(pool2_buffer, s->req);
close(cfd); /* nothing can be done for this fd without memory */
pool_free2(pool2_task, t);
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
return 0;
}
buffer_shutr(req);
t->cli_state = CL_STSHUTR;
return 1;
- }
+ }
/* last server read and buffer empty */
else if ((s == SV_STSHUTR || s == SV_STCLOSE) && (rep->flags & BF_EMPTY)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
t->flags |= SN_FINST_D;
}
return 1;
- }
+ }
/* write timeout */
else if (tick_is_expired(rep->wex, now_ms)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
struct pool_head *pool2_session;
+struct list sessions;
/*
* frees the context associated to a session. It must have been removed first.
pool_free2(pool2_requri, txn->uri);
pool_free2(pool2_capture, txn->cli_cookie);
pool_free2(pool2_capture, txn->srv_cookie);
+ LIST_DEL(&s->list);
pool_free2(pool2_session, s);
/* We may want to free the maximum amount of pools if the proxy is stopping */
/* perform minimal intializations, report 0 in case of error, 1 if OK. */
int init_session()
{
+ LIST_INIT(&sessions);
pool2_session = create_pool("session", sizeof(struct session), MEM_F_SHARED);
return pool2_session != NULL;
}