oops, put the mempool stuff back, we don't use e-memory afterall. Damn
2003-11-14 Not Zed <NotZed@Ximian.com> * camel-mime-parser.c (SCAN_BUF): oops, put the mempool stuff back, we don't use e-memory afterall. Damn plane hacking. svn path=/trunk/; revision=23344
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2003-11-14 Not Zed <NotZed@Ximian.com>
|
||||||
|
|
||||||
|
* camel-mime-parser.c (SCAN_BUF): oops, put the mempool stuff
|
||||||
|
back, we don't use e-memory afterall. Damn plane hacking.
|
||||||
|
|
||||||
2003-11-13 Not Zed <NotZed@Ximian.com>
|
2003-11-13 Not Zed <NotZed@Ximian.com>
|
||||||
|
|
||||||
* camel-mime-parser.c: Remove mempool code, we use the stuff in
|
* camel-mime-parser.c: Remove mempool code, we use the stuff in
|
||||||
|
@ -71,6 +71,115 @@ int inend_id = -1,
|
|||||||
#define _header_scan_state _CamelMimeParserPrivate
|
#define _header_scan_state _CamelMimeParserPrivate
|
||||||
#define _PRIVATE(o) (((CamelMimeParser *)(o))->priv)
|
#define _PRIVATE(o) (((CamelMimeParser *)(o))->priv)
|
||||||
|
|
||||||
|
#ifdef MEMPOOL
|
||||||
|
typedef struct _MemPoolNode {
|
||||||
|
struct _MemPoolNode *next;
|
||||||
|
|
||||||
|
int free;
|
||||||
|
char data[1];
|
||||||
|
} MemPoolNode;
|
||||||
|
|
||||||
|
typedef struct _MemPoolThresholdNode {
|
||||||
|
struct _MemPoolThresholdNode *next;
|
||||||
|
char data[1];
|
||||||
|
} MemPoolThresholdNode;
|
||||||
|
|
||||||
|
typedef struct _MemPool {
|
||||||
|
int blocksize;
|
||||||
|
int threshold;
|
||||||
|
struct _MemPoolNode *blocks;
|
||||||
|
struct _MemPoolThresholdNode *threshold_blocks;
|
||||||
|
} MemPool;
|
||||||
|
|
||||||
|
MemPool *mempool_new(int blocksize, int threshold);
|
||||||
|
void *mempool_alloc(MemPool *pool, int size);
|
||||||
|
void mempool_flush(MemPool *pool, int freeall);
|
||||||
|
void mempool_free(MemPool *pool);
|
||||||
|
|
||||||
|
MemPool *mempool_new(int blocksize, int threshold)
|
||||||
|
{
|
||||||
|
MemPool *pool;
|
||||||
|
|
||||||
|
pool = g_malloc(sizeof(*pool));
|
||||||
|
if (threshold >= blocksize)
|
||||||
|
threshold = blocksize * 2 / 3;
|
||||||
|
pool->blocksize = blocksize;
|
||||||
|
pool->threshold = threshold;
|
||||||
|
pool->blocks = NULL;
|
||||||
|
pool->threshold_blocks = NULL;
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *mempool_alloc(MemPool *pool, int size)
|
||||||
|
{
|
||||||
|
size = (size + STRUCT_ALIGN) & (~(STRUCT_ALIGN-1));
|
||||||
|
if (size>=pool->threshold) {
|
||||||
|
MemPoolThresholdNode *n;
|
||||||
|
|
||||||
|
n = g_malloc(sizeof(*n) - sizeof(char) + size);
|
||||||
|
n->next = pool->threshold_blocks;
|
||||||
|
pool->threshold_blocks = n;
|
||||||
|
return &n->data[0];
|
||||||
|
} else {
|
||||||
|
MemPoolNode *n;
|
||||||
|
|
||||||
|
n = pool->blocks;
|
||||||
|
while (n) {
|
||||||
|
if (n->free >= size) {
|
||||||
|
n->free -= size;
|
||||||
|
return &n->data[n->free];
|
||||||
|
}
|
||||||
|
n = n->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = g_malloc(sizeof(*n) - sizeof(char) + pool->blocksize);
|
||||||
|
n->next = pool->blocks;
|
||||||
|
pool->blocks = n;
|
||||||
|
n->free = pool->blocksize - size;
|
||||||
|
return &n->data[n->free];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mempool_flush(MemPool *pool, int freeall)
|
||||||
|
{
|
||||||
|
MemPoolThresholdNode *tn, *tw;
|
||||||
|
MemPoolNode *pw, *pn;
|
||||||
|
|
||||||
|
tw = pool->threshold_blocks;
|
||||||
|
while (tw) {
|
||||||
|
tn = tw->next;
|
||||||
|
g_free(tw);
|
||||||
|
tw = tn;
|
||||||
|
}
|
||||||
|
pool->threshold_blocks = NULL;
|
||||||
|
|
||||||
|
if (freeall) {
|
||||||
|
pw = pool->blocks;
|
||||||
|
while (pw) {
|
||||||
|
pn = pw->next;
|
||||||
|
g_free(pw);
|
||||||
|
pw = pn;
|
||||||
|
}
|
||||||
|
pool->blocks = NULL;
|
||||||
|
} else {
|
||||||
|
pw = pool->blocks;
|
||||||
|
while (pw) {
|
||||||
|
pw->free = pool->blocksize;
|
||||||
|
pw = pw->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mempool_free(MemPool *pool)
|
||||||
|
{
|
||||||
|
if (pool) {
|
||||||
|
mempool_flush(pool, 1);
|
||||||
|
g_free(pool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
struct _header_scan_state {
|
struct _header_scan_state {
|
||||||
|
|
||||||
/* global state */
|
/* global state */
|
||||||
|
Reference in New Issue
Block a user