Bill Fischofer(Bill-Fischofer-Linaro) replied on github web page: platform/linux-generic/include/odp_ring_st_internal.h line 32 @@ -0,0 +1,118 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_RING_ST_INTERNAL_H_ +#define ODP_RING_ST_INTERNAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp/api/hints.h> +#include <odp_align_internal.h> + +/* Basic ring for single thread usage. Operations must be synchronized by using + * locks (or other means), when multiple threads use the same ring. */ +typedef struct { + uint32_t head; + uint32_t tail; + uint32_t mask; + uint32_t *data; + +} ring_st_t; + +/* Initialize ring. Ring size must be a power of two. */ +static inline void ring_st_init(ring_st_t *ring, uint32_t *data, uint32_t size) +{ + ring->head = 0; + ring->tail = 0; + ring->mask = size - 1;
Comment: This only works if `size` is a power of 2. Should be documented as such, since this is an internal routine. In this case an `ODP_ASSERT(size == ROUNDUP_POWER2_U32(size))` for this requirement would be a useful debugging aid. > Bill Fischofer(Bill-Fischofer-Linaro) wrote: > should be `num = abs(tail - head);` to deal with wrap arounds, otherwise may > be misinterpreted as overly large since it's `uint32_t`. Note that GCC and > clang recognize `abs()` and treat it as a builtin, so there's no actual > `stdlib.h` call here. >> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >> Extra blank line should be removed (nit). https://github.com/Linaro/odp/pull/492#discussion_r169793906 updated_at 2018-02-22 09:32:40