1 /* $Id: buffer.c,v 1.6 2008/06/21 06:53:27 maxim Exp $
2 *
3 */
4
5 #include <stdlib.h>
6
7 #include "configure.h"
8
9 #include "common/misc.h"
10 #include "httpd.h"
11 #include "buffer.h"
12
13 #define MAX_SIZES (MAXIMUM_BUFFER_SIZE / INITIAL_BUFFER_SIZE)
14 #define BUFFERS_STEP 128*1024
15
16 static Buffer* freeBuffers[MAX_SIZES];
17 static int nBufferBlocks = 0;
18
19 Buffer*
newBuffer(int size)20 newBuffer(int size)
21 {
22 Buffer* buffer;
23 int s;
24 debug("newBuffer(%d)", size);
25
26 if (size > MAXIMUM_BUFFER_SIZE ||
27 (size % INITIAL_BUFFER_SIZE) ||
28 countBits(s = size / INITIAL_BUFFER_SIZE) != 1) {
29 if ((buffer = MALLOC(sizeof(Buffer) + size))) {
30 buffer->buffer = (char*)(buffer + 1);
31 buffer->size = size;
32 buffer->start = buffer->count = 0;
33 }
34 return buffer;
35 }
36
37 if (!(buffer = freeBuffers[--s])) {
38 int i;
39 int count = BUFFERS_STEP / size;
40 debug("newBuffer: allocating buffers-%d N%d (%dx%d bytes)", s, nBufferBlocks, count, size);
41 freeBuffers[s] = MALLOC(count * (sizeof(Buffer) + size));
42 if (!freeBuffers[s]) return NULL;
43 for (i = 0, buffer = freeBuffers[s]; i < count - 1; i++) {
44 buffer->buffer = (void*)buffer + sizeof(Buffer) + size;
45 buffer = (Buffer*)buffer->buffer;
46 }
47 buffer->buffer = NULL;
48 buffer = freeBuffers[s];
49 nBufferBlocks++;
50 //buffer = bufferBlocks[nBufferBlocks++] = freeBuffers[s];
51 }
52
53 freeBuffers[s] = (Buffer*)buffer->buffer;
54
55 buffer->buffer = (char*)(buffer + 1);
56 buffer->size = size;
57 buffer->start = buffer->count = 0;
58 debug("buffer: %p (%d), data: %p", buffer, sizeof(Buffer), buffer->buffer);
59 return buffer;
60 }
61
62 Buffer*
freeBuffer(Buffer * buffer)63 freeBuffer(Buffer* buffer)
64 {
65 int s;
66 debug("freeBuffer(%p): %d bytes", buffer, buffer ? buffer->size : 0);
67 if (!buffer) return NULL;
68
69 if (buffer->size > MAXIMUM_BUFFER_SIZE ||
70 (buffer->size % INITIAL_BUFFER_SIZE) ||
71 countBits(s = buffer->size / INITIAL_BUFFER_SIZE) != 1)
72 return FREE(buffer);
73
74 buffer->buffer = (char*)freeBuffers[--s];
75 freeBuffers[s] = buffer;
76 return NULL;
77 }
78
79
80 #if 0
81 void
82 freeAllBuffers()
83 {
84 int s;
85 for (s = 0; s < nBufferBlocks; s++)
86 FREE(bufferBlocks[s]);
87
88 for (s = 0; s < MAX_SIZES; s++) {
89 freeBuffers[s] = NULL;
90 buffersSizes[s] = 0;
91 }
92
93 }
94 #endif
95
96