git-svn-id: file:///var/lib/svn/clamav-devel/branches/mpool@4300 77e5149b-7576-45b1-b177-96237e5ba77b
aCaB authored on 2008/10/29 05:57:54... | ... |
@@ -39,7 +39,7 @@ |
39 | 39 |
#include <stddef.h> |
40 | 40 |
|
41 | 41 |
|
42 |
-/* #define DEBUGMPOOL */ |
|
42 |
+#define DEBUGMPOOL |
|
43 | 43 |
#ifdef DEBUGMPOOL |
44 | 44 |
#include <stdio.h> |
45 | 45 |
FILE *lfd = NULL; |
... | ... |
@@ -50,16 +50,16 @@ FILE *lfd = NULL; |
50 | 50 |
|
51 | 51 |
#include "mpool.h" |
52 | 52 |
|
53 |
-//#define MIN_FRAGSIZE 4096 /* 1m2.282s */ |
|
54 |
-//#define MIN_FRAGSIZE 8192 /* 0m46.652s */ |
|
55 |
-//#define MIN_FRAGSIZE 16384 /* 0m8.365s */ |
|
56 |
-//#define MIN_FRAGSIZE 32768 /* 0m3.788s */ |
|
57 |
-//#define MIN_FRAGSIZE 65536 /* 0m2.759s */ |
|
58 |
-//#define MIN_FRAGSIZE 131072 /* 0m2.445s */ |
|
53 |
+/* #define MIN_FRAGSIZE 4096 /\* 1m2.282s *\/ */ |
|
54 |
+/* #define MIN_FRAGSIZE 8192 /\* 0m46.652s *\/ */ |
|
55 |
+/* #define MIN_FRAGSIZE 16384 /\* 0m8.365s *\/ */ |
|
56 |
+/* #define MIN_FRAGSIZE 32768 /\* 0m3.788s *\/ */ |
|
57 |
+/* #define MIN_FRAGSIZE 65536 /\* 0m2.759s *\/ */ |
|
58 |
+/* #define MIN_FRAGSIZE 131072 /\* 0m2.445s *\/ */ |
|
59 | 59 |
#define MIN_FRAGSIZE 262144 /* 0m2.343s */ |
60 |
-//#define MIN_FRAGSIZE 524288 /* 0m2.387s */ |
|
61 |
-//#define MIN_FRAGSIZE 1048576 /* 0m2.392s */ |
|
62 |
-//#define MIN_FRAGSIZE 2097152 /* 0m2.402s */ |
|
60 |
+/* #define MIN_FRAGSIZE 524288 /\* 0m2.387s *\/ */ |
|
61 |
+/* #define MIN_FRAGSIZE 1048576 /\* 0m2.392s *\/ */ |
|
62 |
+/* #define MIN_FRAGSIZE 2097152 /\* 0m2.402s *\/ */ |
|
63 | 63 |
|
64 | 64 |
|
65 | 65 |
struct FRAG { |
... | ... |
@@ -69,37 +69,44 @@ struct FRAG { |
69 | 69 |
}; |
70 | 70 |
#define FRAG_OVERHEAD (offsetof(struct FRAG, fake)) |
71 | 71 |
|
72 |
+#define align_to_voidptr(size) (((size) / sizeof(void *) + ((size) % sizeof(void *) != 0)) * sizeof(void *)) |
|
73 |
+#define roundup(size) (FRAG_OVERHEAD + align_to_voidptr(size)) |
|
72 | 74 |
|
73 | 75 |
static unsigned int align_to_pagesize(struct MP *mp, unsigned int size) { |
74 | 76 |
return (size / mp->psize + (size % mp->psize != 0)) * mp->psize; |
75 | 77 |
} |
76 |
-static unsigned int align_to_voidptr(unsigned int size) { |
|
77 |
- return (size / sizeof(void *) + (size % sizeof(void *) != 0)) * sizeof(void *); |
|
78 |
-} |
|
79 | 78 |
|
80 |
-/* FIXME: use instead a bit2size table so we can spare bits and offer a better granularity */ |
|
81 | 79 |
static unsigned int to_bits(unsigned int size) { |
82 | 80 |
unsigned int i; |
83 |
- for(i=0; i<32; i++) |
|
84 |
- if((unsigned int)1<<i >= size) return i; |
|
81 |
+ for(i=0; i<FRAGSBITS; i++) |
|
82 |
+ if(fragsz[i] >= size) return i; |
|
85 | 83 |
return i; /* NOTREACHED */ |
86 | 84 |
} |
87 | 85 |
static unsigned int from_bits(unsigned int bits) { |
88 |
- return 1<<bits; |
|
86 |
+ return fragsz[bits]; |
|
89 | 87 |
} |
88 |
+/* static unsigned int to_bits(unsigned int size) { */ |
|
89 |
+/* unsigned int i; */ |
|
90 |
+/* for(i=0; i<32; i++) */ |
|
91 |
+/* if((unsigned int)1<<i >= size) return i; */ |
|
92 |
+/* return i; /\* NOTREACHED *\/ */ |
|
93 |
+/* } */ |
|
94 |
+/* static unsigned int from_bits(unsigned int bits) { */ |
|
95 |
+/* return 1<<bits; */ |
|
96 |
+/* } */ |
|
90 | 97 |
|
91 | 98 |
struct MP *mp_create() { |
92 | 99 |
struct MP mp, *mp_p; |
100 |
+ unsigned int sz; |
|
93 | 101 |
memset(&mp, 0, sizeof(mp)); |
94 | 102 |
mp.psize = getpagesize(); |
95 | 103 |
#ifdef DEBUGMPOOL |
96 | 104 |
lfd = fopen("mmpool_log", "w"); |
97 | 105 |
#endif |
98 |
- mp.fd = open("/dev/zero", O_RDWR, 0); |
|
99 |
- mp.top = align_to_pagesize(&mp, MIN_FRAGSIZE + 0*sizeof(mp)); |
|
106 |
+ sz = align_to_pagesize(&mp, MIN_FRAGSIZE); |
|
100 | 107 |
mp.mpm.usize = align_to_voidptr(sizeof(struct MPMAP)); |
101 |
- mp.mpm.size = mp.top - align_to_voidptr(sizeof(mp)); |
|
102 |
- if ((mp_p = (struct MP *)mmap(NULL, mp.top, PROT_READ | PROT_WRITE, MAP_PRIVATE, mp.fd, 0)) == MAP_FAILED) |
|
108 |
+ mp.mpm.size = sz - align_to_voidptr(sizeof(mp)); |
|
109 |
+ if ((mp_p = (struct MP *)mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)) == MAP_FAILED) |
|
103 | 110 |
return NULL; |
104 | 111 |
memcpy(mp_p, &mp, sizeof(mp)); |
105 | 112 |
spam("Map created @ %p->%p - size %u out of %u\n", mp_p, (void*)mp_p + mp.mpm.size, mp.mpm.usize, mp.mpm.size); |
... | ... |
@@ -108,7 +115,6 @@ struct MP *mp_create() { |
108 | 108 |
|
109 | 109 |
void mp_destroy(struct MP *mp) { |
110 | 110 |
struct MPMAP *mpm_next = mp->mpm.next, *mpm; |
111 |
- close(mp->fd); |
|
112 | 111 |
while((mpm = mpm_next)) { |
113 | 112 |
mpm_next = mpm->next; |
114 | 113 |
munmap((void *)mpm, mpm->size); |
... | ... |
@@ -148,19 +154,21 @@ void *mp_malloc(struct MP *mp, size_t size) { |
148 | 148 |
struct FRAG *f = NULL; |
149 | 149 |
struct MPMAP *mpm = &mp->mpm; |
150 | 150 |
|
151 |
- // check_all(mp); |
|
151 |
+ /* check_all(mp); */ |
|
152 | 152 |
if (!size) return NULL; |
153 | 153 |
|
154 | 154 |
j = sbits+2; |
155 | 155 |
if (j<7) j = 7; |
156 | 156 |
if (j > 32) j = 32; |
157 | 157 |
|
158 |
+ j=sbits; |
|
159 |
+ |
|
158 | 160 |
for (i=sbits; i<j; i++) |
159 | 161 |
if((f = mp->avail[i])) break; |
160 | 162 |
|
161 | 163 |
/* Case 1: We have a free'd frag */ |
162 | 164 |
if(f) { |
163 |
- spam("malloc %p size %u (freed)\n"), f, size; |
|
165 |
+ spam("malloc %p size %u (freed)\n", f, roundup(size)); |
|
164 | 166 |
mp->avail[i] = f->next; |
165 | 167 |
return &f->fake; |
166 | 168 |
} |
... | ... |
@@ -171,7 +179,7 @@ void *mp_malloc(struct MP *mp, size_t size) { |
171 | 171 |
while(mpm) { |
172 | 172 |
if(mpm->size - mpm->usize >= needed) { |
173 | 173 |
f = (struct FRAG *)((void *)mpm + mpm->usize); |
174 |
- spam("malloc %p size %u (hole)\n", f, size); |
|
174 |
+ spam("malloc %p size %u (hole)\n", f, roundup(size)); |
|
175 | 175 |
mpm->usize += needed; |
176 | 176 |
f->sbits = sbits; |
177 | 177 |
return &f->fake; |
... | ... |
@@ -185,17 +193,16 @@ void *mp_malloc(struct MP *mp, size_t size) { |
185 | 185 |
else |
186 | 186 |
i = align_to_pagesize(mp, MIN_FRAGSIZE); |
187 | 187 |
|
188 |
- if ((mpm = (struct MPMAP *)mmap(NULL, i, PROT_READ | PROT_WRITE, MAP_PRIVATE, mp->fd, mp->top)) == MAP_FAILED) { |
|
188 |
+ if ((mpm = (struct MPMAP *)mmap(NULL, i, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)) == MAP_FAILED) { |
|
189 | 189 |
spam("failed to alloc %u bytes (%u requested)\n", i, size); |
190 | 190 |
return NULL; |
191 | 191 |
} |
192 |
- mp->top += i; |
|
193 | 192 |
mpm->size = i; |
194 | 193 |
mpm->usize = needed + align_to_voidptr(sizeof(*mpm)); |
195 | 194 |
mpm->next = mp->mpm.next; |
196 | 195 |
mp->mpm.next = mpm; |
197 | 196 |
f = (struct FRAG *)((void *)mpm + align_to_voidptr(sizeof(*mpm))); |
198 |
- spam("malloc %p size %u (new map)\n", f, size); |
|
197 |
+ spam("malloc %p size %u (new map)\n", f, roundup(size)); |
|
199 | 198 |
f->sbits = sbits; |
200 | 199 |
return &f->fake; |
201 | 200 |
} |
... | ... |
@@ -22,6 +22,92 @@ |
22 | 22 |
#define MPOOL_H |
23 | 23 |
|
24 | 24 |
#ifdef USE_MPOOL |
25 |
+ |
|
26 |
+static const unsigned int fragsz[] = { |
|
27 |
+24, /* (33067) */ |
|
28 |
+32, /* (93876) */ |
|
29 |
+40, /* (731459) */ |
|
30 |
+48, /* (35286) */ |
|
31 |
+56, /* (6930) */ |
|
32 |
+64, /* (442013) */ |
|
33 |
+72, /* (2706) */ |
|
34 |
+80, /* (2252) */ |
|
35 |
+88, /* (3631) */ |
|
36 |
+96, /* (2594) */ |
|
37 |
+104, /* (3679) */ |
|
38 |
+112, /* (3697) */ |
|
39 |
+120, /* (3991) */ |
|
40 |
+128, /* (5141) */ |
|
41 |
+136, /* (22458) */ |
|
42 |
+144, /* (4320) */ |
|
43 |
+152, /* (4296) */ |
|
44 |
+160, /* (12177) */ |
|
45 |
+168, /* (18024) */ |
|
46 |
+/* 176, /\* (323) *\/ */ |
|
47 |
+/* 184, /\* (329) *\/ */ |
|
48 |
+/* 192, /\* (202) *\/ */ |
|
49 |
+/* 200, /\* (221) *\/ */ |
|
50 |
+/* 208, /\* (166) *\/ */ |
|
51 |
+/* 216, /\* (179) *\/ */ |
|
52 |
+/* 224, /\* (216) *\/ */ |
|
53 |
+/* 232, /\* (172) *\/ */ |
|
54 |
+/* 240, /\* (157) *\/ */ |
|
55 |
+/* 248, /\* (178) *\/ */ |
|
56 |
+256, /* (133) */ |
|
57 |
+/* 264, /\* (157) *\/ */ |
|
58 |
+/* 272, /\* (140) *\/ */ |
|
59 |
+/* 280, /\* (161) *\/ */ |
|
60 |
+/* 288, /\* (125) *\/ */ |
|
61 |
+/* 296, /\* (141) *\/ */ |
|
62 |
+/* 304, /\* (100) *\/ */ |
|
63 |
+/* 312, /\* (97) *\/ */ |
|
64 |
+/* 320, /\* (70) *\/ */ |
|
65 |
+/* 328, /\* (13) *\/ */ |
|
66 |
+/* 336, /\* (21) *\/ */ |
|
67 |
+/* 344, /\* (21) *\/ */ |
|
68 |
+/* 352, /\* (13) *\/ */ |
|
69 |
+/* 360, /\* (9) *\/ */ |
|
70 |
+/* 368, /\* (8) *\/ */ |
|
71 |
+/* 376, /\* (14) *\/ */ |
|
72 |
+/* 384, /\* (5) *\/ */ |
|
73 |
+/* 392, /\* (6) *\/ */ |
|
74 |
+/* 400, /\* (4) *\/ */ |
|
75 |
+/* 408, /\* (2) *\/ */ |
|
76 |
+/* 416, /\* (6) *\/ */ |
|
77 |
+/* 424, /\* (5) *\/ */ |
|
78 |
+/* 432, /\* (4) *\/ */ |
|
79 |
+/* 440, /\* (4) *\/ */ |
|
80 |
+/* 448, /\* (4) *\/ */ |
|
81 |
+/* 464, /\* (2) *\/ */ |
|
82 |
+/* 472, /\* (2) *\/ */ |
|
83 |
+/* 480, /\* (1) *\/ */ |
|
84 |
+/* 496, /\* (1) *\/ */ |
|
85 |
+/* 512, /\* (2) *\/ */ |
|
86 |
+520, /* (11) */ |
|
87 |
+/* 536, /\* (1) *\/ */ |
|
88 |
+/* 544, /\* (2) *\/ */ |
|
89 |
+/* 552, /\* (1) *\/ */ |
|
90 |
+/* 584, /\* (3) *\/ */ |
|
91 |
+/* 600, /\* (1) *\/ */ |
|
92 |
+/* 624, /\* (1) *\/ */ |
|
93 |
+/* 656, /\* (1) *\/ */ |
|
94 |
+/* 784, /\* (2) *\/ */ |
|
95 |
+1032, /* (11) */ |
|
96 |
+/* 2056, /\* (14) *\/ */ |
|
97 |
+2064, /* (7456) */ |
|
98 |
+4104, /* (14) */ |
|
99 |
+8200, /* (9) */ |
|
100 |
+16392, /* (6) */ |
|
101 |
+32776, /* (4) */ |
|
102 |
+63512, /* (7) */ |
|
103 |
+134408, /* (1) */ |
|
104 |
+507984, /* (7) */ |
|
105 |
+1051040, /* (1) */ |
|
106 |
+2097152 |
|
107 |
+}; |
|
108 |
+ |
|
109 |
+#define FRAGSBITS (sizeof(fragsz)/sizeof(fragsz[0])) |
|
110 |
+ |
|
25 | 111 |
struct MPMAP { |
26 | 112 |
struct MPMAP *next; |
27 | 113 |
unsigned int size; |
... | ... |
@@ -29,10 +115,8 @@ struct MPMAP { |
29 | 29 |
}; |
30 | 30 |
|
31 | 31 |
struct MP { |
32 |
- int fd; |
|
33 | 32 |
unsigned int psize; |
34 |
- unsigned int top; |
|
35 |
- struct FRAG *avail[32]; |
|
33 |
+ struct FRAG *avail[FRAGSBITS]; |
|
36 | 34 |
struct MPMAP mpm; |
37 | 35 |
}; |
38 | 36 |
|