10
10
#include <time.h>
11
11
#include <unistd.h>
12
12
13
- #define RINGBUF_PAD (SIZE ) (((size_t)(SIZE) + 7U) & (~7U))
13
+ #define RINGBUF_PAD (SIZE ) (((size_t)(SIZE) + 7U) & (~7U))/* size is padded to a multiple of 8 */
14
+ #define GAP_MASK 1U
15
+ #define SIZE_MASK (~GAP_MASK)
14
16
15
17
typedef struct {
16
- uint32_t size , gap ;
18
+ uint32_t size_and_gap ;
17
19
} ringbuf_element_t ;
18
20
19
21
typedef struct {
@@ -54,7 +56,7 @@ static inline ringbuf_t *ringbuf_new(size_t minimum, bool release_and_acquire)
54
56
const size_t body_size = ringbuf_body_size (minimum );
55
57
const size_t total_size = sizeof (ringbuf_t ) + body_size ;
56
58
57
- posix_memalign ((void * * ) & ringbuf , sizeof ( ringbuf_element_t ) , total_size );
59
+ posix_memalign ((void * * ) & ringbuf , 8 , total_size );
58
60
mlock (ringbuf , total_size ); /* prevent memory from being flushed */
59
61
60
62
if (ringbuf )
@@ -170,19 +172,17 @@ static inline void ringbuf_write_advance(ringbuf_t *ringbuf, size_t written)
170
172
/* fill end of first buffer with gap */
171
173
ringbuf_element_t * element =
172
174
(ringbuf_element_t * ) (ringbuf -> buf + head );
173
- element -> size = ringbuf -> gapd - sizeof (ringbuf_element_t );
174
- element -> gap = 1 ;
175
+ element -> size_and_gap = ringbuf -> gapd - sizeof (ringbuf_element_t );
176
+ element -> size_and_gap |= GAP_MASK ;
175
177
176
178
/* fill written element header */
177
179
element = (void * ) ringbuf -> buf ;
178
- element -> size = written ;
179
- element -> gap = 0 ;
180
+ element -> size_and_gap = written ;
180
181
} else {
181
182
/* fill written element header */
182
183
ringbuf_element_t * element =
183
184
(ringbuf_element_t * ) (ringbuf -> buf + head );
184
- element -> size = written ;
185
- element -> gap = 0 ;
185
+ element -> size_and_gap = written ;
186
186
}
187
187
188
188
/* advance write head */
@@ -226,7 +226,7 @@ static inline const void *ringbuf_read_request(ringbuf_t *ringbuf,
226
226
const size_t len1 = ringbuf -> size - tail ;
227
227
const ringbuf_element_t * element = (const ringbuf_element_t * ) buf1 ;
228
228
229
- if (element -> gap ) { /* gap element? */
229
+ if (element -> size_and_gap & GAP_MASK ) { /* gap element? */
230
230
/* skip gap */
231
231
_ringbuf_read_advance_raw (ringbuf , tail , len1 );
232
232
@@ -235,19 +235,19 @@ static inline const void *ringbuf_read_request(ringbuf_t *ringbuf,
235
235
/* there will always be at least on element after a gap */
236
236
element = (const ringbuf_element_t * ) buf2 ;
237
237
238
- * toread = element -> size ;
238
+ * toread = ( element -> size_and_gap ) & SIZE_MASK ;
239
239
return buf2 + sizeof (ringbuf_element_t );
240
240
}
241
241
242
242
/* valid chunk, use it! */
243
- * toread = element -> size ;
243
+ * toread = ( element -> size_and_gap ) & SIZE_MASK ;
244
244
return buf1 + sizeof (ringbuf_element_t );
245
245
}
246
246
247
247
/* available buffer is contiguous */
248
248
const uint8_t * buf = ringbuf -> buf + tail ;
249
249
const ringbuf_element_t * element = (const ringbuf_element_t * ) buf ;
250
- * toread = element -> size ;
250
+ * toread = ( element -> size_and_gap ) & SIZE_MASK ;
251
251
return buf + sizeof (ringbuf_element_t );
252
252
}
253
253
@@ -267,7 +267,7 @@ static inline void ringbuf_read_advance(ringbuf_t *ringbuf)
267
267
268
268
/* advance read tail */
269
269
_ringbuf_read_advance_raw (
270
- ringbuf , tail , sizeof (ringbuf_element_t ) + RINGBUF_PAD (element -> size ));
270
+ ringbuf , tail , sizeof (ringbuf_element_t ) + RINGBUF_PAD (element -> size_and_gap & SIZE_MASK ));
271
271
}
272
272
273
273
/* Test program */
0 commit comments