[MINOR] maintain a global session list in order to ease debugging

Now the global variable 'sessions' will be a dual-linked list of all
known sessions. The list element is set at the beginning of the session
so that it's easier to follow them all with gdb.
This commit is contained in:
Willy Tarreau 2008-11-23 19:53:55 +01:00
parent 0a5d5ddeb9
commit f54f8bdd8d
5 changed files with 20 additions and 5 deletions

View File

@ -27,6 +27,7 @@
#include <types/session.h>
extern struct pool_head *pool2_session;
extern struct list sessions;
void session_free(struct session *s);

View File

@ -152,6 +152,7 @@ enum {
* 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 */

View File

@ -106,6 +106,8 @@ int event_accept(int fd) {
goto out_close;
}
LIST_ADDQ(&sessions, &s->list);
s->flags = 0;
s->term_trace = 0;
@ -455,6 +457,7 @@ int event_accept(int fd) {
out_free_task:
pool_free2(pool2_task, t);
out_free_session:
LIST_DEL(&s->list);
pool_free2(pool2_session, s);
out_close:
close(cfd);

View File

@ -411,12 +411,15 @@ int uxst_event_accept(int fd) {
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;
}
@ -428,6 +431,7 @@ int uxst_event_accept(int fd) {
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;
}
@ -436,6 +440,7 @@ int uxst_event_accept(int fd) {
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;
}
@ -467,6 +472,7 @@ int uxst_event_accept(int fd) {
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;
}
@ -475,6 +481,7 @@ int uxst_event_accept(int fd) {
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;
}

View File

@ -26,6 +26,7 @@
struct pool_head *pool2_session;
struct list sessions;
/*
* frees the context associated to a session. It must have been removed first.
@ -74,6 +75,7 @@ void session_free(struct session *s)
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 */
@ -92,6 +94,7 @@ void session_free(struct session *s)
/* 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;
}