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

Reply via email to