src/buffer.c

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1501
e60860db189f
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "cx/buffer.h"
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
530
e866516cac17 #170 first buffer tests
Mike Becker <universe@uap-core.de>
parents: 529
diff changeset
31 #include <stdio.h>
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 #include <string.h>
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
33 #include <errno.h>
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34
1292
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
35 #ifdef _WIN32
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
36 #include <Windows.h>
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
37 #include <sysinfoapi.h>
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
38 static unsigned long system_page_size() {
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
39 static unsigned long ps = 0;
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
40 if (ps == 0) {
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
41 SYSTEM_INFO sysinfo;
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
42 GetSystemInfo(&sysinfo);
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
43 ps = sysinfo.dwPageSize;
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
44 }
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
45 return ps;
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
46 }
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
47 #else
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
48 #include <unistd.h>
1501
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
49 static unsigned long system_page_size() {
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
50 static unsigned long ps = 0;
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
51 if (ps == 0) {
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
52 long sc = sysconf(_SC_PAGESIZE);
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
53 if (sc < 0) {
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
54 // fallback for systems which do not report a value here
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
55 ps = 4096; // LCOV_EXCL_LINE
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
56 } else {
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
57 ps = (unsigned long) sc;
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
58 }
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
59 }
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
60 return ps;
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
61 }
1292
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
62 #endif
1e7ee17777f4 add windows support for new buffer auto-extend strategy - relates to #641
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
63
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
64 static int buffer_copy_on_write(CxBuffer* buffer) {
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
65 if (0 == (buffer->flags & CX_BUFFER_COPY_ON_WRITE)) return 0;
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
66 void *newspace = cxMalloc(buffer->allocator, buffer->capacity);
1501
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
67 if (NULL == newspace) return -1; // LCOV_EXCL_LINE
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
68 memcpy(newspace, buffer->space, buffer->size);
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
69 buffer->space = newspace;
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
70 buffer->flags &= ~CX_BUFFER_COPY_ON_WRITE;
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
71 buffer->flags |= CX_BUFFER_FREE_CONTENTS;
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
72 return 0;
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
73 }
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
74
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
75 int cxBufferInit(
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
76 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 void *space,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 size_t capacity,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
79 const CxAllocator *allocator,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 int flags
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 ) {
989
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
82 if (allocator == NULL) {
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
83 allocator = cxDefaultAllocator;
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
84 }
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
85 if (flags & CX_BUFFER_COPY_ON_EXTEND) {
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
86 flags |= CX_BUFFER_AUTO_EXTEND;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
87 }
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
88 buffer->allocator = allocator;
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
89 buffer->flags = flags;
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
90 if (!space) {
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
91 buffer->bytes = cxMalloc(allocator, capacity);
1501
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
92 if (buffer->bytes == NULL) return -1; // LCOV_EXCL_LINE
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
93 buffer->flags |= CX_BUFFER_FREE_CONTENTS;
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
94 } else {
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
95 buffer->bytes = space;
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
96 }
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
97 buffer->capacity = capacity;
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
98 buffer->size = 0;
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
99 buffer->pos = 0;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
101 buffer->flush = NULL;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
102
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
103 return 0;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
104 }
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
106 int cxBufferEnableFlushing(
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
107 CxBuffer *buffer,
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
108 CxBufferFlushConfig config
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
109 ) {
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
110 buffer->flush = cxMallocDefault(sizeof(CxBufferFlushConfig));
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
111 if (buffer->flush == NULL) return -1; // LCOV_EXCL_LINE
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
112 memcpy(buffer->flush, &config, sizeof(CxBufferFlushConfig));
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
113 return 0;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
116 void cxBufferDestroy(CxBuffer *buffer) {
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
117 if (buffer->flags & CX_BUFFER_FREE_CONTENTS) {
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
118 cxFree(buffer->allocator, buffer->bytes);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 }
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
120 cxFreeDefault(buffer->flush);
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
121 memset(buffer, 0, sizeof(CxBuffer));
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
122 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
124 CxBuffer *cxBufferCreate(
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
125 void *space,
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
126 size_t capacity,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
127 const CxAllocator *allocator,
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
128 int flags
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
129 ) {
989
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
130 if (allocator == NULL) {
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
131 allocator = cxDefaultAllocator;
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
132 }
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
133 CxBuffer *buf = cxMalloc(allocator, sizeof(CxBuffer));
1501
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
134 if (buf == NULL) return NULL; // LCOV_EXCL_LINE
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
135 if (0 == cxBufferInit(buf, space, capacity, allocator, flags)) {
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
136 return buf;
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
137 } else {
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
138 // LCOV_EXCL_START
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
139 cxFree(allocator, buf);
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
140 return NULL;
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
141 // LCOV_EXCL_STOP
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
142 }
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
143 }
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
144
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
145 void cxBufferFree(CxBuffer *buffer) {
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
146 if (buffer == NULL) return;
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
147 const CxAllocator *allocator = buffer->allocator;
991
ec49db06dae0 cxBufferFree() now calls cxBufferDestroy()
Mike Becker <universe@uap-core.de>
parents: 989
diff changeset
148 cxBufferDestroy(buffer);
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
149 cxFree(allocator, buffer);
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
150 }
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
151
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
152 int cxBufferSeek(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
153 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
154 off_t offset,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
155 int whence
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156 ) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
157 size_t npos;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
158 switch (whence) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
159 case SEEK_CUR:
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 npos = buffer->pos;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 break;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 case SEEK_END:
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163 npos = buffer->size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
164 break;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
165 case SEEK_SET:
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166 npos = 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167 break;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
168 default:
1259
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1138
diff changeset
169 errno = EINVAL;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
170 return -1;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
171 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
172
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
173 size_t opos = npos;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174 npos += offset;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
175
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
176 if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) {
1288
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
177 // to be compliant with fseek() specification
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
178 // we return EINVAL on underflow
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
179 errno = EINVAL;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
180 return -1;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
181 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
182
1007
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1005
diff changeset
183 if (npos > buffer->size) {
1288
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
184 // not compliant with fseek() specification
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
185 // but this is the better behavior for CxBuffer
b41ad5d9bcbf fixes errno value after failing cxBufferSeek() to be consistently EINVAL
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
186 errno = EINVAL;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
187 return -1;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
188 } else {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
189 buffer->pos = npos;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
190 return 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
191 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
192
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
193 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
194
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
195 void cxBufferClear(CxBuffer *buffer) {
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
196 if (0 == (buffer->flags & CX_BUFFER_COPY_ON_WRITE)) {
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
197 memset(buffer->bytes, 0, buffer->size);
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
198 }
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
199 buffer->size = 0;
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
200 buffer->pos = 0;
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
201 }
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
202
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
203 void cxBufferReset(CxBuffer *buffer) {
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
204 buffer->size = 0;
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
205 buffer->pos = 0;
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
206 }
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
207
1004
d8044fd5005c make cxBufferEof() return a bool
Mike Becker <universe@uap-core.de>
parents: 991
diff changeset
208 bool cxBufferEof(const CxBuffer *buffer) {
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
209 return buffer->pos >= buffer->size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
210 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
211
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
212 int cxBufferMinimumCapacity(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
213 CxBuffer *buffer,
532
080c304ec176 fix cxBufferMinimumCapacity implementation still using additional_bytes
Mike Becker <universe@uap-core.de>
parents: 530
diff changeset
214 size_t newcap
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
215 ) {
532
080c304ec176 fix cxBufferMinimumCapacity implementation still using additional_bytes
Mike Becker <universe@uap-core.de>
parents: 530
diff changeset
216 if (newcap <= buffer->capacity) {
080c304ec176 fix cxBufferMinimumCapacity implementation still using additional_bytes
Mike Becker <universe@uap-core.de>
parents: 530
diff changeset
217 return 0;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
218 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
219
1501
e60860db189f add fallback when sysconf() returns -1 when obtaining the page size
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
220 unsigned long pagesize = system_page_size();
1291
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
221 // if page size is larger than 64 KB - for some reason - truncate to 64 KB
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
222 if (pagesize > 65536) pagesize = 65536;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
223 if (newcap < pagesize) {
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
224 // when smaller as one page, map to the next power of two
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
225 newcap--;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
226 newcap |= newcap >> 1;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
227 newcap |= newcap >> 2;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
228 newcap |= newcap >> 4;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
229 // last operation only needed for pages larger 4096 bytes
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
230 // but if/else would be more expensive than just doing this
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
231 newcap |= newcap >> 8;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
232 newcap++;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
233 } else {
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
234 // otherwise, map to a multiple of the page size
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
235 newcap -= newcap % pagesize;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
236 newcap += pagesize;
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
237 // note: if newcap is already page aligned,
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
238 // this gives a full additional page (which is good)
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
239 }
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
240
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
241
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
242 const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
243 if (buffer->flags & force_copy_flags) {
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
244 void *newspace = cxMalloc(buffer->allocator, newcap);
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
245 if (NULL == newspace) return -1;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
246 memcpy(newspace, buffer->space, buffer->size);
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
247 buffer->space = newspace;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
248 buffer->capacity = newcap;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
249 buffer->flags &= ~force_copy_flags;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
250 buffer->flags |= CX_BUFFER_FREE_CONTENTS;
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
251 return 0;
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
252 } else if (cxReallocate(buffer->allocator,
536
cb9b9739055e #170 add cxBufferClear test
Mike Becker <universe@uap-core.de>
parents: 534
diff changeset
253 (void **) &buffer->bytes, newcap) == 0) {
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
254 buffer->capacity = newcap;
533
8d70ad8da899 do not implicitly zero freshly allocated memory
Mike Becker <universe@uap-core.de>
parents: 532
diff changeset
255 return 0;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
256 } else {
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
257 return -1; // LCOV_EXCL_LINE
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
258 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
259 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
260
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
261 void cxBufferShrink(
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
262 CxBuffer *buffer,
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
263 size_t reserve
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
264 ) {
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
265 // Ensure buffer is in a reallocatable state
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
266 const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND;
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
267 if (buffer->flags & force_copy_flags) {
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
268 // do nothing when we are not allowed to reallocate
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
269 return;
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
270 }
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
271
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
272 // calculate new capacity
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
273 size_t newCapacity = buffer->size + reserve;
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
274
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
275 // If new capacity is smaller than current capacity, resize the buffer
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
276 if (newCapacity < buffer->capacity) {
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
277 if (0 == cxReallocate(buffer->allocator, &buffer->bytes, newCapacity)) {
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
278 buffer->capacity = newCapacity;
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
279 }
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
280 }
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
281 }
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1288
diff changeset
282
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
283 static size_t cx_buffer_flush_helper(
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
284 const CxBuffer *buffer,
1128
3672b89e606c fix stupid signature of the flush helper
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
285 const unsigned char *src,
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
286 size_t size,
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
287 size_t nitems
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
288 ) {
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
289 // flush data from an arbitrary source
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
290 // does not need to be the buffer's contents
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
291 size_t max_items = buffer->flush->blksize / size;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
292 size_t fblocks = 0;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
293 size_t flushed_total = 0;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
294 while (nitems > 0 && fblocks < buffer->flush->blkmax) {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
295 fblocks++;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
296 size_t items = nitems > max_items ? max_items : nitems;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
297 size_t flushed = buffer->flush->wfunc(
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
298 src, size, items, buffer->flush->target);
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
299 if (flushed > 0) {
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
300 flushed_total += flushed;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
301 src += flushed * size;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
302 nitems -= flushed;
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
303 } else {
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
304 // if no bytes can be flushed out anymore, we give up
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
305 break;
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
306 }
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
307 }
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
308 return flushed_total;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
309 }
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
310
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
311 static size_t cx_buffer_flush_impl(CxBuffer *buffer, size_t size) {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
312 // flush the current contents of the buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
313 unsigned char *space = buffer->bytes;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
314 size_t remaining = buffer->pos / size;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
315 size_t flushed_total = cx_buffer_flush_helper(
1128
3672b89e606c fix stupid signature of the flush helper
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
316 buffer, space, size, remaining);
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
317
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
318 // shift the buffer left after flushing
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
319 // IMPORTANT: up to this point, copy on write must have been
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
320 // performed already, because we can't do error handling here
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
321 cxBufferShiftLeft(buffer, flushed_total*size);
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
322
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
323 return flushed_total;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
324 }
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
325
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
326 size_t cxBufferFlush(CxBuffer *buffer) {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
327 if (buffer_copy_on_write(buffer)) return 0;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
328 return cx_buffer_flush_impl(buffer, 1);
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
329 }
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
330
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
331 size_t cxBufferWrite(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
332 const void *ptr,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
333 size_t size,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
334 size_t nitems,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
335 CxBuffer *buffer
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
336 ) {
543
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
337 // optimize for easy case
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
338 if (size == 1 && (buffer->capacity - buffer->pos) >= nitems) {
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
339 if (buffer_copy_on_write(buffer)) return 0;
543
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
340 memcpy(buffer->bytes + buffer->pos, ptr, nitems);
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
341 buffer->pos += nitems;
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
342 if (buffer->pos > buffer->size) {
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
343 buffer->size = buffer->pos;
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
344 }
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
345 return nitems;
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
346 }
7b9114030ca4 optimization for buffer write easy cases
Mike Becker <universe@uap-core.de>
parents: 542
diff changeset
347
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
348 size_t len, total_flushed = 0;
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
349 cx_buffer_write_retry:
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
350 if (cx_szmul(size, nitems, &len)) {
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
351 errno = EOVERFLOW;
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
352 return total_flushed;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
353 }
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
354 if (buffer->pos > SIZE_MAX - len) {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
355 errno = EOVERFLOW;
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
356 return total_flushed;
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
357 }
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
358
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
359 size_t required = buffer->pos + len;
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
360 bool perform_flush = false;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
361 if (required > buffer->capacity) {
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
362 if (buffer->flags & CX_BUFFER_AUTO_EXTEND) {
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
363 if (buffer->flush != NULL && required > buffer->flush->threshold) {
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
364 perform_flush = true;
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
365 } else {
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
366 if (cxBufferMinimumCapacity(buffer, required)) {
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
367 return total_flushed; // LCOV_EXCL_LINE
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
368 }
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
369 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
370 } else {
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
371 if (buffer->flush != NULL) {
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
372 perform_flush = true;
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
373 } else {
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
374 // truncate data, if we can neither extend nor flush
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
375 len = buffer->capacity - buffer->pos;
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
376 if (size > 1) {
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
377 len -= len % size;
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
378 }
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
379 nitems = len / size;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
380 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
381 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
382 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
383
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
384 // check here and not above because of possible truncation
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
385 if (len == 0) {
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
386 return total_flushed;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
387 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
388
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
389 // check if we need to copy
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
390 if (buffer_copy_on_write(buffer)) return 0;
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
391
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
392 // perform the operation
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
393 if (perform_flush) {
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
394 size_t items_flushed;
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
395 if (buffer->pos == 0) {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
396 // if we don't have data in the buffer, but are instructed
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
397 // to flush, it means that we are supposed to relay the data
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
398 items_flushed = cx_buffer_flush_helper(buffer, ptr, size, nitems);
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
399 if (items_flushed == 0) {
1135
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
400 // we needed to relay data, but could not flush anything
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
401 // i.e. we have to give up to avoid endless trying
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
402 return 0;
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
403 }
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
404 nitems -= items_flushed;
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
405 total_flushed += items_flushed;
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
406 if (nitems > 0) {
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
407 ptr = ((unsigned char*)ptr) + items_flushed * size;
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
408 goto cx_buffer_write_retry;
1128
3672b89e606c fix stupid signature of the flush helper
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
409 }
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
410 return total_flushed;
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
411 } else {
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
412 items_flushed = cx_buffer_flush_impl(buffer, size);
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
413 if (items_flushed == 0) {
1135
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
414 // flush target is full, let's try to truncate
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
415 size_t remaining_space;
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
416 if (buffer->flags & CX_BUFFER_AUTO_EXTEND) {
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
417 remaining_space = buffer->flush->threshold > buffer->pos
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
418 ? buffer->flush->threshold - buffer->pos
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
419 : 0;
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
420 } else {
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
421 remaining_space = buffer->capacity > buffer->pos
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
422 ? buffer->capacity - buffer->pos
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
423 : 0;
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
424 }
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
425 nitems = remaining_space / size;
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
426 if (nitems == 0) {
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
427 return total_flushed;
1135
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1131
diff changeset
428 }
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
429 }
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
430 goto cx_buffer_write_retry;
544
2e73456e5f84 #184 untested implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 543
diff changeset
431 }
539
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
432 } else {
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
433 memcpy(buffer->bytes + buffer->pos, ptr, len);
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
434 buffer->pos += len;
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
435 if (buffer->pos > buffer->size) {
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
436 buffer->size = buffer->pos;
9cd98da9ee17 #184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents: 538
diff changeset
437 }
1138
29672c777a28 avoid recursion in cxBufferWrite() - fixes #567
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
438 return total_flushed + nitems;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
439 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
440 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
441
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
442 size_t cxBufferAppend(
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
443 const void *ptr,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
444 size_t size,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
445 size_t nitems,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
446 CxBuffer *buffer
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
447 ) {
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
448 size_t pos = buffer->pos;
1131
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
449 size_t append_pos = buffer->size;
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
450 buffer->pos = append_pos;
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
451 size_t written = cxBufferWrite(ptr, size, nitems, buffer);
1131
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
452 // the buffer might have been flushed
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
453 // we must compute a possible delta for the position
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
454 // expected: pos = append_pos + written
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
455 // -> if this is not the case, there is a delta
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
456 size_t delta = append_pos + written*size - buffer->pos;
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
457 if (delta > pos) {
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
458 buffer->pos = 0;
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
459 } else {
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
460 buffer->pos = pos - delta;
644f77f903b1 fix cxBufferAppend() not adjusting position after flush
Mike Becker <universe@uap-core.de>
parents: 1128
diff changeset
461 }
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
462 return written;
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
463 }
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
464
538
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
465 int cxBufferPut(
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
466 CxBuffer *buffer,
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
467 int c
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
468 ) {
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
469 c &= 0xFF;
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
470 unsigned char const ch = c;
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
471 if (cxBufferWrite(&ch, 1, 1, buffer) == 1) {
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
472 return c;
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
473 } else {
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
474 return EOF;
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
475 }
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
476 }
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
477
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
478 int cxBufferTerminate(CxBuffer *buffer) {
1284
b2103354baed fix implementation of cxBufferTerminate() - fixes #631
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
479 if (0 == cxBufferPut(buffer, 0)) {
b2103354baed fix implementation of cxBufferTerminate() - fixes #631
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
480 buffer->size = buffer->pos - 1;
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
481 return 0;
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
482 } else {
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
483 return -1;
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
484 }
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
485 }
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
486
538
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
487 size_t cxBufferPutString(
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
488 CxBuffer *buffer,
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
489 const char *str
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
490 ) {
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
491 return cxBufferWrite(str, 1, strlen(str), buffer);
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
492 }
2cfbcbe86a7c #170 first basic write tests
Mike Becker <universe@uap-core.de>
parents: 536
diff changeset
493
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
494 size_t cxBufferRead(
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
495 void *ptr,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
496 size_t size,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
497 size_t nitems,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
498 CxBuffer *buffer
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
499 ) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
500 size_t len;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
501 if (cx_szmul(size, nitems, &len)) {
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
502 errno = EOVERFLOW;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
503 return 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
504 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
505 if (buffer->pos + len > buffer->size) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
506 len = buffer->size - buffer->pos;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
507 if (size > 1) len -= len % size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
508 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
509
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
510 if (len <= 0) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
511 return len;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
512 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
513
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
514 memcpy(ptr, buffer->bytes + buffer->pos, len);
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
515 buffer->pos += len;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
516
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
517 return len / size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
518 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
519
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
520 int cxBufferGet(CxBuffer *buffer) {
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
521 if (cxBufferEof(buffer)) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
522 return EOF;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
523 } else {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
524 int c = buffer->bytes[buffer->pos];
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
525 buffer->pos++;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
526 return c;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
527 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
528 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
529
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
530 int cxBufferShiftLeft(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
531 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
532 size_t shift
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
533 ) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
534 if (shift >= buffer->size) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
535 buffer->pos = buffer->size = 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
536 } else {
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
537 if (buffer_copy_on_write(buffer)) return -1;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
538 memmove(buffer->bytes, buffer->bytes + shift, buffer->size - shift);
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
539 buffer->size -= shift;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
540
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
541 if (buffer->pos >= shift) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
542 buffer->pos -= shift;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
543 } else {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
544 buffer->pos = 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
545 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
546 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
547 return 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
548 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
549
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
550 int cxBufferShiftRight(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
551 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
552 size_t shift
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
553 ) {
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
554 if (buffer->size > SIZE_MAX - shift) {
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
555 errno = EOVERFLOW;
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
556 return -1;
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
557 }
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
558 size_t req_capacity = buffer->size + shift;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
559 size_t movebytes;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
560
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
561 // auto extend buffer, if required and enabled
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
562 if (buffer->capacity < req_capacity) {
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
563 if (buffer->flags & CX_BUFFER_AUTO_EXTEND) {
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
564 if (cxBufferMinimumCapacity(buffer, req_capacity)) {
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
565 return -1; // LCOV_EXCL_LINE
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
566 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
567 movebytes = buffer->size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
568 } else {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
569 movebytes = buffer->capacity - shift;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
570 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
571 } else {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
572 movebytes = buffer->size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
573 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
574
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
575 if (movebytes > 0) {
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
576 if (buffer_copy_on_write(buffer)) return -1;
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
577 memmove(buffer->bytes + shift, buffer->bytes, movebytes);
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
578 buffer->size = shift + movebytes;
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
579 }
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
580
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
581 buffer->pos += shift;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
582 if (buffer->pos > buffer->size) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
583 buffer->pos = buffer->size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
584 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
585
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
586 return 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
587 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
588
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
589 int cxBufferShift(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
590 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
591 off_t shift
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
592 ) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
593 if (shift < 0) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
594 return cxBufferShiftLeft(buffer, (size_t) (-shift));
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
595 } else if (shift > 0) {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
596 return cxBufferShiftRight(buffer, (size_t) shift);
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
597 } else {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
598 return 0;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
599 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
600 }

mercurial