mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-04-11 03:31:36 +00:00
[MAJOR] migrated task, tree64 and session to pool2
task and tree64 are already very close in size and are merged together. Overall performance gained slightly by this simple change.
This commit is contained in:
parent
e6ce59deb7
commit
c6ca1a02aa
@ -2,6 +2,8 @@
|
||||
* 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__
|
||||
@ -51,8 +53,7 @@ struct tree64 {
|
||||
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; }
|
||||
@ -96,7 +97,7 @@ inline static struct ulltree *__ulltree_insert(struct ulltree *root, unsigned lo
|
||||
|
||||
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;
|
||||
@ -111,7 +112,7 @@ inline static struct ulltree *__ulltree_insert(struct ulltree *root, unsigned lo
|
||||
/* 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;
|
||||
@ -139,7 +140,7 @@ inline static struct ulltree *__ulltree_insert(struct ulltree *root, unsigned lo
|
||||
|
||||
/* 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;
|
||||
@ -186,7 +187,7 @@ inline static struct ultree *__ultree_insert(struct ultree *root, unsigned long
|
||||
|
||||
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;
|
||||
@ -200,7 +201,7 @@ inline static struct ultree *__ultree_insert(struct ultree *root, unsigned long
|
||||
/* 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;
|
||||
@ -228,7 +229,7 @@ inline static struct ultree *__ultree_insert(struct ultree *root, unsigned long
|
||||
|
||||
/* 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;
|
||||
@ -279,7 +280,7 @@ inline static struct ultree *__ul2tree_insert(struct ultree *root, unsigned long
|
||||
|
||||
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;
|
||||
@ -308,7 +309,7 @@ inline static struct ultree *__ul2tree_insert(struct ultree *root, unsigned long
|
||||
/* 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;
|
||||
@ -352,7 +353,7 @@ inline static struct ultree *__ul2tree_insert(struct ultree *root, unsigned long
|
||||
|
||||
/* 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;
|
||||
@ -456,7 +457,7 @@ __right: \
|
||||
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) { \
|
||||
@ -506,7 +507,7 @@ __right: \
|
||||
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) { \
|
||||
@ -561,7 +562,7 @@ __right: \
|
||||
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) { \
|
||||
@ -617,7 +618,7 @@ __right: \
|
||||
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) { \
|
||||
@ -671,7 +672,7 @@ inline static void *__tree_delete_only_one(void *firstnode) {
|
||||
*/
|
||||
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 */
|
||||
@ -684,7 +685,7 @@ inline static void *__tree_delete_only_one(void *firstnode) {
|
||||
down->up = node->up;
|
||||
}
|
||||
/* free the last node */
|
||||
pool_free(tree64, node);
|
||||
pool_free2(pool2_tree64, node);
|
||||
return down->up;
|
||||
}
|
||||
|
||||
@ -716,7 +717,7 @@ inline static void *__tree_delete(void *firstnode) {
|
||||
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;
|
||||
|
@ -2,7 +2,7 @@
|
||||
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
|
||||
@ -23,10 +23,15 @@
|
||||
#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 */
|
||||
|
||||
|
@ -33,6 +33,10 @@
|
||||
#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);
|
||||
@ -97,7 +101,7 @@ static inline struct task *task_delete(struct task *t)
|
||||
*/
|
||||
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
|
||||
|
@ -2,7 +2,7 @@
|
||||
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
|
||||
@ -123,10 +123,6 @@ struct session {
|
||||
};
|
||||
|
||||
|
||||
#define sizeof_session sizeof(struct session)
|
||||
extern void **pool_session;
|
||||
|
||||
|
||||
#endif /* _TYPES_SESSION_H */
|
||||
|
||||
/*
|
||||
|
@ -42,9 +42,6 @@ struct task {
|
||||
void *context; /* the task's context */
|
||||
};
|
||||
|
||||
#define sizeof_task sizeof(struct task)
|
||||
extern void **pool_task;
|
||||
|
||||
#endif /* _TYPES_TASK_H */
|
||||
|
||||
/*
|
||||
|
@ -111,7 +111,7 @@ int appsession_task_init(void)
|
||||
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;
|
||||
|
@ -2488,7 +2488,7 @@ int readcfgfile(const char *file)
|
||||
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;
|
||||
}
|
||||
@ -2535,7 +2535,7 @@ int readcfgfile(const char *file)
|
||||
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;
|
||||
}
|
||||
|
37
src/client.c
37
src/client.c
@ -41,6 +41,7 @@
|
||||
#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>
|
||||
|
||||
@ -110,7 +111,7 @@ int event_accept(int fd) {
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
@ -127,18 +128,18 @@ int event_accept(int fd) {
|
||||
(((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;
|
||||
}
|
||||
|
||||
@ -146,8 +147,8 @@ int event_accept(int fd) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -156,8 +157,8 @@ int event_accept(int fd) {
|
||||
(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;
|
||||
}
|
||||
|
||||
@ -236,8 +237,8 @@ int event_accept(int fd) {
|
||||
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 *));
|
||||
@ -251,8 +252,8 @@ int event_accept(int fd) {
|
||||
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 *));
|
||||
@ -267,8 +268,8 @@ int event_accept(int fd) {
|
||||
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);
|
||||
@ -354,8 +355,8 @@ int event_accept(int fd) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -377,8 +378,8 @@ int event_accept(int fd) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -87,6 +87,7 @@
|
||||
#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>
|
||||
|
||||
@ -292,6 +293,9 @@ void dump(int sig)
|
||||
);
|
||||
}
|
||||
#endif
|
||||
/* dump memory usage then free everything possible */
|
||||
dump_pools();
|
||||
pool_gc2();
|
||||
}
|
||||
|
||||
#ifdef DEBUG_MEMORY
|
||||
@ -370,6 +374,8 @@ void init(int argc, char **argv)
|
||||
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 */
|
||||
@ -654,10 +660,10 @@ void deinit(void)
|
||||
|
||||
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);
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
@ -26,7 +26,7 @@
|
||||
#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.
|
||||
@ -69,7 +69,15 @@ void session_free(struct session *s)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
14
src/task.c
14
src/task.c
@ -11,6 +11,7 @@
|
||||
*/
|
||||
|
||||
#include <common/config.h>
|
||||
#include <common/memory.h>
|
||||
#include <common/mini-clist.h>
|
||||
#include <common/standard.h>
|
||||
#include <common/time.h>
|
||||
@ -23,15 +24,22 @@
|
||||
#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);
|
||||
|
Loading…
Reference in New Issue
Block a user