ucx/buffer.c

changeset 61
fb07a0ab9a17
parent 60
abae4669fba7
child 62
6814aea8462d
equal deleted inserted replaced
60:abae4669fba7 61:fb07a0ab9a17
5 5
6 struct UcxBuffer { 6 struct UcxBuffer {
7 void *space; 7 void *space;
8 off_t pos; 8 off_t pos;
9 size_t length; 9 size_t length;
10 _Bool autofree; 10 int flags;
11 }; 11 };
12 12
13 UcxBuffer *ucx_buffer_new(void *space, size_t length) { 13 UcxBuffer *ucx_buffer_new(void *space, size_t length, int flags) {
14 UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 14 UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer));
15 if (buffer) { 15 if (buffer) {
16 buffer->flags = flags;
16 if (!space) { 17 if (!space) {
17 buffer->space = malloc(length); 18 buffer->space = malloc(length);
18 if (!buffer->space) { 19 if (!buffer->space) {
19 free(buffer); 20 free(buffer);
20 return NULL; 21 return NULL;
21 } 22 }
22 memset(buffer->space, 0, length); 23 memset(buffer->space, 0, length);
23 buffer->autofree = 1; 24 buffer->flags |= UCX_BUFFER_AUTOFREE;
24 } else { 25 } else {
25 buffer->space = space; 26 buffer->space = space;
26 buffer->autofree = 0;
27 } 27 }
28 buffer->length = length; 28 buffer->length = length;
29 29
30 buffer->pos = 0; 30 buffer->pos = 0;
31 } 31 }
32 32
33 return buffer; 33 return buffer;
34 } 34 }
35 35
36 void ucx_buffer_free(UcxBuffer *buffer) { 36 void ucx_buffer_free(UcxBuffer *buffer) {
37 if (buffer->autofree) { 37 if ((buffer->flags & UCX_BUFFER_AUTOFREE) > 0) {
38 free(buffer->space); 38 free(buffer->space);
39 } 39 }
40 free(buffer); 40 free(buffer);
41 } 41 }
42 42

mercurial