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 |