task and tree64 are already very close in size and are merged together.
Overall performance gained slightly by this simple change.
* tree.h : tree manipulation macros and structures.
* (C) 2002 - Willy Tarreau - willy@ant-computing.com
*
+ * 2007/05/13: adapted to mempools v2.
+ *
*/
#ifndef __TREE_H__
struct tree64 *up; /* parent node. NULL = root */
};
-#define sizeof_tree64 (sizeof (struct tree64))
-extern void **pool_tree64;
+extern struct pool_head *pool2_tree64;
#define ULTREE_HEAD(l) struct ultree (l) = { .left=NULL, .right=NULL, .up=NULL, .low=0, .level=LONGBITS, .data=NULL }
#define ULTREE_INIT(l) { (l)->data = (l)->left = (l)->right = NULL; }
if (next == NULL) {
/* we'll have to insert our node here */
- *branch = new = (struct ulltree *)pool_alloc(tree64);
+ *branch = new = (struct ulltree *)pool_alloc2(pool2_tree64);
ULLTREE_INIT(new);
new->up = root;
new->value = x;
/* ok, now we know that we must insert between both. */
/* the new interconnect node */
- *branch = node = (struct ulltree *)pool_alloc(tree64); /* was <next> */
+ *branch = node = (struct ulltree *)pool_alloc2(pool2_tree64); /* was <next> */
ULLTREE_INIT(node);
node->up = root;
next->up = node;
/* the new leaf now */
node->level = m; /* set the level to the lowest common bit */
- new = (struct ulltree *)pool_alloc(tree64);
+ new = (struct ulltree *)pool_alloc2(pool2_tree64);
ULLTREE_INIT(new);
new->value = x;
new->level = ffs;
if (next == NULL) {
/* we'll have to insert our node here */
- *branch = new = (struct ultree *)pool_alloc(tree64);
+ *branch = new = (struct ultree *)pool_alloc2(pool2_tree64);
ULTREE_INIT(new);
new->up = root;
new->low = x;
/* ok, now we know that we must insert between both. */
/* the new interconnect node */
- *branch = node = (struct ultree *)pool_alloc(tree64); /* was <next> */
+ *branch = node = (struct ultree *)pool_alloc2(pool2_tree64); /* was <next> */
ULTREE_INIT(node);
node->up = root;
next->up = node;
/* the new leaf now */
node->level = m; /* set the level to the lowest common bit */
- new = (struct ultree *)pool_alloc(tree64);
+ new = (struct ultree *)pool_alloc2(pool2_tree64);
ULTREE_INIT(new);
new->low = x;
new->level = ffs;
if (next == NULL) {
/* we'll have to insert our node here */
- *branch = new =(struct ultree *)pool_alloc(tree64);
+ *branch = new =(struct ultree *)pool_alloc2(pool2_tree64);
UL2TREE_INIT(new);
new->up = root;
new->high = h;
/* ok, now we know that we must insert between both. */
/* the new interconnect node */
- *branch = node = (struct ultree *)pool_alloc(tree64); /* was <next> */
+ *branch = node = (struct ultree *)pool_alloc2(pool2_tree64); /* was <next> */
UL2TREE_INIT(node);
node->up = root;
next->up = node;
/* the new leaf now */
node->level = m; /* set the level to the lowest common bit */
- new = (struct ultree *)pool_alloc(tree64);
+ new = (struct ultree *)pool_alloc2(pool2_tree64);
UL2TREE_INIT(new);
new->high = h;
new->low = l;
goto __end; /* nothing left, don't delete the root node */ \
else { \
typeof (__root) __old; \
- pool_free(tree64, __ptr); \
+ pool_free2(pool2_tree64, __ptr); \
__old = __ptr; \
__ptr = __stack[__slen]; \
if (__ptr->left == __old) { \
goto __end; /* nothing left, don't delete the root node */ \
else { \
typeof (__root) __old; \
- pool_free(__type, __ptr); \
+ pool_free2(pool##__type, __ptr); \
__old = __ptr; \
__ptr = __stack[__slen]; \
if (__ptr->left == __old) { \
goto __end; /* nothing left, don't delete the root node */ \
else { \
typeof (__root) __old; \
- pool_free(tree64, __ptr); \
+ pool_free2(pool2_tree64, __ptr); \
__old = __ptr; \
__ptr = __stack[__slen]; \
if (__ptr->left == __old) { \
goto __end; /* nothing left, don't delete the root node */ \
else { \
typeof (__root) __old; \
- pool_free(tree64, __ptr); \
+ pool_free2(pool2_tree64, __ptr); \
__old = __ptr; \
__ptr = __stack[__slen]; \
if (__ptr->left == __old) { \
*/
down = node;
node = node->up;
- pool_free(tree64, down);
+ pool_free2(pool2_tree64, down);
if (node->data || node->up == NULL)
return node;
/* now we're sure we were sharing this empty node with another branch, let's find it */
down->up = node->up;
}
/* free the last node */
- pool_free(tree64, node);
+ pool_free2(pool2_tree64, node);
return down->up;
}
uplink = &up->right;
*uplink = down; /* we relink the lower branch above us or simply cut it */
- pool_free(tree64, node);
+ pool_free2(pool2_tree64, node);
node = up;
if (down)
down->up = node;
include/proto/session.h
This file defines everything related to sessions.
- Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu
+ Copyright (C) 2000-2007 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
#define _PROTO_SESSION_H
#include <common/config.h>
+#include <common/memory.h>
#include <types/session.h>
+extern struct pool_head *pool2_session;
+
void session_free(struct session *s);
+/* perform minimal intializations, report 0 in case of error, 1 if OK. */
+int init_session();
#endif /* _PROTO_SESSION_H */
#include <types/task.h>
extern void *run_queue;
+extern struct pool_head *pool2_task;
+
+/* perform minimal intializations, report 0 in case of error, 1 if OK. */
+int init_task();
/* needed later */
void *tree_delete(void *node);
*/
static inline void task_free(struct task *t)
{
- pool_free(task, t);
+ pool_free2(pool2_task, t);
}
/* inserts <task> into its assigned wait queue, where it may already be. In this case, it
include/types/session.h
This file defines everything related to sessions.
- Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu
+ Copyright (C) 2000-2007 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
};
-#define sizeof_session sizeof(struct session)
-extern void **pool_session;
-
-
#endif /* _TYPES_SESSION_H */
/*
void *context; /* the task's context */
};
-#define sizeof_task sizeof(struct task)
-extern void **pool_task;
-
#endif /* _TYPES_TASK_H */
/*
static int initialized = 0;
struct task *t;
if (!initialized) {
- if ((t = pool_alloc(task)) == NULL)
+ if ((t = pool_alloc2(pool2_task)) == NULL)
return -1;
t->wq = NULL;
t->qlist.p = NULL;
if (newsrv->maxconn > 0) {
struct task *t;
- if ((t = pool_alloc(task)) == NULL) {
+ if ((t = pool_alloc2(pool2_task)) == NULL) {
Alert("parsing [%s:%d] : out of memory.\n", file, linenum);
return -1;
}
while (newsrv != NULL) {
/* should this server be checked ? */
if (newsrv->state & SRV_CHECKED) {
- if ((t = pool_alloc(task)) == NULL) {
+ if ((t = pool_alloc2(pool2_task)) == NULL) {
Alert("parsing [%s:%d] : out of memory.\n", file, linenum);
return -1;
}
#include <proto/log.h>
#include <proto/hdr_idx.h>
#include <proto/proto_http.h>
+#include <proto/session.h>
#include <proto/stream_sock.h>
#include <proto/task.h>
}
}
- if ((s = pool_alloc(session)) == NULL) { /* disable this proxy for a while */
+ if ((s = pool_alloc2(pool2_session)) == NULL) { /* disable this proxy for a while */
Alert("out of memory in event_accept().\n");
EV_FD_CLR(fd, DIR_RD);
p->state = PR_STIDLE;
(((struct sockaddr_in *)&addr)->sin_addr.s_addr & p->mon_mask.s_addr) == p->mon_net.s_addr) {
if (p->mode == PR_MODE_TCP) {
close(cfd);
- pool_free(session, s);
+ pool_free2(pool2_session, s);
continue;
}
s->flags |= SN_MONITOR;
}
- if ((t = pool_alloc(task)) == NULL) { /* disable this proxy for a while */
+ if ((t = pool_alloc2(pool2_task)) == NULL) { /* disable this proxy for a while */
Alert("out of memory in event_accept().\n");
EV_FD_CLR(fd, DIR_RD);
p->state = PR_STIDLE;
close(cfd);
- pool_free(session, s);
+ pool_free2(pool2_session, s);
return 0;
}
if (cfd >= global.maxsock) {
Alert("accept(): not enough free sockets. Raise -n argument. Giving up.\n");
close(cfd);
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
(char *) &one, sizeof(one)) == -1)) {
Alert("accept(): cannot set the socket in non blocking mode. Giving up\n");
close(cfd);
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
pool_alloc_from(p->req_cap_pool, p->nb_req_cap*sizeof(char *)))
== NULL) { /* no memory */
close(cfd); /* nothing can be done for this fd without memory */
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
memset(txn->req.cap, 0, p->nb_req_cap*sizeof(char *));
if (txn->req.cap != NULL)
pool_free_to(p->req_cap_pool, txn->req.cap);
close(cfd); /* nothing can be done for this fd without memory */
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
memset(txn->rsp.cap, 0, p->nb_rsp_cap*sizeof(char *));
if (txn->req.cap != NULL)
pool_free_to(p->req_cap_pool, txn->req.cap);
close(cfd); /* nothing can be done for this fd without memory */
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
hdr_idx_init(&txn->hdr_idx);
if (txn->req.cap != NULL)
pool_free_to(p->req_cap_pool, txn->req.cap);
close(cfd); /* nothing can be done for this fd without memory */
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
if (txn->req.cap != NULL)
pool_free_to(p->req_cap_pool, txn->req.cap);
close(cfd); /* nothing can be done for this fd without memory */
- pool_free(task, t);
- pool_free(session, s);
+ pool_free2(pool2_task, t);
+ pool_free2(pool2_session, s);
return 0;
}
#include <proto/proxy.h>
#include <proto/queue.h>
#include <proto/server.h>
+#include <proto/session.h>
#include <proto/stream_sock.h>
#include <proto/task.h>
);
}
#endif
+ /* dump memory usage then free everything possible */
+ dump_pools();
+ pool_gc2();
}
#ifdef DEBUG_MEMORY
localtime((time_t *)&now.tv_sec);
start_date = now;
+ init_task();
+ init_session();
init_proto_http();
cfg_polling_mechanism = POLL_USE_SELECT; /* select() is always available */
if (fdtab) free(fdtab);
- pool_destroy(pool_session);
+ pool_destroy2(pool2_session);
pool_destroy(pool_buffer);
pool_destroy(pool_requri);
- pool_destroy(pool_task);
+ pool_destroy2(pool2_task);
pool_destroy(pool_capture);
pool_destroy(pool_appsess);
/*
* Server management functions.
*
- * Copyright 2000-2006 Willy Tarreau <w@1wt.eu>
+ * Copyright 2000-2007 Willy Tarreau <w@1wt.eu>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
#include <proto/queue.h>
-void **pool_session = NULL;
+struct pool_head *pool2_session;
/*
* frees the context associated to a session. It must have been removed first.
if (txn->srv_cookie)
pool_free(capture, txn->srv_cookie);
- pool_free(session, s);
+ pool_free2(pool2_session, s);
+}
+
+
+/* perform minimal intializations, report 0 in case of error, 1 if OK. */
+int init_session()
+{
+ pool2_session = create_pool("session", sizeof(struct session), MEM_F_SHARED);
+ return pool2_session != NULL;
}
*/
#include <common/config.h>
+#include <common/memory.h>
#include <common/mini-clist.h>
#include <common/standard.h>
#include <common/time.h>
#include <import/bitops.h>
#include <import/tree.h>
-
-void **pool_task= NULL;
-void **pool_tree64 = NULL;
static struct ultree *stack[LLONGBITS];
+struct pool_head *pool2_task, *pool2_tree64;
+
UL2TREE_HEAD(timer_wq);
void *eternity_queue = NULL;
void *run_queue = NULL;
+/* perform minimal intializations, report 0 in case of error, 1 if OK. */
+int init_task()
+{
+ pool2_task = create_pool("task", sizeof(struct task), MEM_F_SHARED);
+ pool2_tree64 = create_pool("tree64", sizeof(struct tree64), MEM_F_SHARED);
+ return pool2_task && pool2_tree64;
+}
+
struct ultree *ul2tree_insert(struct ultree *root, unsigned long h, unsigned long l)
{
return __ul2tree_insert(root, h, l);