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