Remove buffer prefix from buffers.
See commit on shared pointer.
This commit is contained in:
1 parent
8a716cd4f4
commit
a69c67e850
4 files changed
+40
-40
No files matched your search
@@ -1647,7 +1647,7 @@ This method is only defined if the type of the element defines a HASH method its
|
||||
|
||||
#### BUFFER\_DEF(name, type, size, policy[, oplist])
|
||||
|
||||
Define the buffer 'buffer\_##name##\_t' and its associated methods as "static inline" functions.
|
||||
Define the buffer 'name##\_t' and its associated methods as "static inline" functions.
|
||||
A buffer is a fixed size queue or stack.
|
||||
'name' shall be a C identifier which will be used to identify the container.
|
||||
|
||||
@@ -1673,7 +1673,7 @@ The object oplist is expected to have the following operators (INIT, INIT\_SET,
|
||||
|
||||
Example:
|
||||
|
||||
BUFFER_DEF(uint, unsigned int, 10, BUFFER_QUEUE|BUFFER_BLOCKING)
|
||||
BUFFER_DEF(buffer_uint, unsigned int, 10, BUFFER_QUEUE|BUFFER_BLOCKING)
|
||||
|
||||
buffer_uint_t g_buff;
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ SHARED_PTR_DEF(shared_bigdata, bigdata_t, (INIT(bigdata_init), CLEAR(bigdata_cle
|
||||
* - we change the semantics of _push / _pop into buffer as push a new item and pop it as a move (ideal semantics for shared_ptr interface).
|
||||
*/
|
||||
#define MY_QUEUE_SIZE 10
|
||||
BUFFER_DEF(bigdata, shared_bigdata_t, MY_QUEUE_SIZE,
|
||||
BUFFER_DEF(buffer_bigdata, shared_bigdata_t, MY_QUEUE_SIZE,
|
||||
BUFFER_QUEUE|BUFFER_PUSH_INIT_POP_MOVE, SHARED_PTR_OPLIST(shared_bigdata))
|
||||
|
||||
/* Let's build a Thread synchros tree:
|
||||
|
||||
+31
-31
@@ -46,8 +46,8 @@ typedef enum {
|
||||
USAGE: BUFFER_DEF(name, type, size_of_buffer_or_0, policy[, oplist]) */
|
||||
#define BUFFER_DEF(name, type, m_size, ... ) \
|
||||
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||
(BUFFERI_DEF2(name, type, m_size,__VA_ARGS__, (), M_C3(buffer_, name,_t)), \
|
||||
BUFFERI_DEF2(name, type, m_size,__VA_ARGS__, M_C3(buffer_, name,_t)))
|
||||
(BUFFERI_DEF2(name, type, m_size,__VA_ARGS__, (), M_C(name,_t)), \
|
||||
BUFFERI_DEF2(name, type, m_size,__VA_ARGS__, M_C(name,_t)))
|
||||
|
||||
|
||||
/********************************** INTERNAL ************************************/
|
||||
@@ -68,17 +68,17 @@ typedef enum {
|
||||
|
||||
#define BUFFERI_DEF2(name, type, m_size, policy, oplist, buffer_t) \
|
||||
\
|
||||
typedef struct M_C3(buffer_, name, _s) { \
|
||||
typedef struct M_C(name, _s) { \
|
||||
m_mutex_t mutex; \
|
||||
m_cond_t there_is_data; \
|
||||
m_cond_t there_is_room_for_data; \
|
||||
BUFFERI_IF_CTE_SIZE(m_size)( ,size_t size;) \
|
||||
size_t idx_prod, idx_cons, number, overwrite; \
|
||||
size_t idx_prod, idx_cons, number, overwrite; \
|
||||
type *data; \
|
||||
} buffer_t[1]; \
|
||||
\
|
||||
static inline void \
|
||||
M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
M_C(name, _init)(buffer_t v, size_t size) \
|
||||
{ \
|
||||
assert( size > 0); \
|
||||
BUFFERI_IF_CTE_SIZE(m_size)(assert(size == m_size), v->size = size); \
|
||||
@@ -103,7 +103,7 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
} \
|
||||
\
|
||||
static inline void \
|
||||
M_C3(bufferi_, name, _clear_obj)(buffer_t v) \
|
||||
M_C(name, _int_clear_obj)(buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||
@@ -122,12 +122,12 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
v->idx_prod = v->idx_cons = v->number = 0; \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
static inline void \
|
||||
M_C3(buffer_, name, _clear)(buffer_t v) \
|
||||
M_C(name, _clear)(buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
M_C3(bufferi_, name, _clear_obj)(v); \
|
||||
M_C(name, _int_clear_obj)(v); \
|
||||
M_GET_FREE oplist (v->data); \
|
||||
v->data = NULL; \
|
||||
v->overwrite = 0; \
|
||||
@@ -137,15 +137,15 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
m_cond_clear(v->there_is_room_for_data); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
\
|
||||
static inline void \
|
||||
M_C3(buffer_, name, _clean)(buffer_t v) \
|
||||
M_C(name, _clean)(buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) \
|
||||
m_mutex_lock(v->mutex); \
|
||||
if (BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) \
|
||||
M_C3(bufferi_, name, _clear_obj)(v); \
|
||||
M_C(name, _int_clear_obj)(v); \
|
||||
else \
|
||||
v->idx_prod = v->idx_cons = v->number = 0; \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) { \
|
||||
@@ -154,38 +154,38 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
} \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
static inline bool \
|
||||
M_C3(buffer_, name, _empty_p)(const buffer_t v) \
|
||||
M_C(name, _empty_p)(const buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
return v->number == 0; \
|
||||
} \
|
||||
\
|
||||
\
|
||||
static inline bool \
|
||||
M_C3(buffer_, name, _full_p)(const buffer_t v) \
|
||||
M_C(name, _full_p)(const buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
return v->number == BUFFERI_SIZE(m_size); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
static inline size_t \
|
||||
M_C3(buffer_, name, _size)(const buffer_t v) \
|
||||
M_C(name, _size)(const buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
return v->number; \
|
||||
} \
|
||||
\
|
||||
\
|
||||
static inline bool \
|
||||
M_C3(buffer_, name, _push)(buffer_t v, type const data) \
|
||||
M_C(name, _push)(buffer_t v, type const data) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
\
|
||||
\
|
||||
/* BUFFER lock */ \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) { \
|
||||
m_mutex_lock(v->mutex); \
|
||||
while (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
|
||||
&& M_C3(buffer_, name, _full_p)(v)) { \
|
||||
&& M_C(name, _full_p)(v)) { \
|
||||
if (BUFFERI_POLICY_P((policy), BUFFER_UNBLOCKING)) { \
|
||||
m_mutex_unlock(v->mutex); \
|
||||
return false; \
|
||||
@@ -193,9 +193,9 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
m_cond_wait(v->there_is_room_for_data, v->mutex); \
|
||||
} \
|
||||
} else if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
|
||||
&& M_C3(buffer_, name, _full_p)(v)) \
|
||||
&& M_C(name, _full_p)(v)) \
|
||||
return false; \
|
||||
\
|
||||
\
|
||||
/* INDEX computation if we have to overwrite the last element */ \
|
||||
if (M_UNLIKELY (BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
|
||||
&& v->number == BUFFERI_SIZE(m_size) )) { \
|
||||
@@ -236,26 +236,26 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
} \
|
||||
\
|
||||
static inline bool \
|
||||
M_C3(buffer_, name, _pop)(type *data, buffer_t v) \
|
||||
M_C(name, _pop)(type *data, buffer_t v) \
|
||||
{ \
|
||||
BUFFERI_CONTRACT(v,m_size); \
|
||||
\
|
||||
/* BUFFER lock */ \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) { \
|
||||
m_mutex_lock(v->mutex); \
|
||||
while (M_C3(buffer_, name, _empty_p)(v)) { \
|
||||
while (M_C(name, _empty_p)(v)) { \
|
||||
if (BUFFERI_POLICY_P((policy), BUFFER_UNBLOCKING)) { \
|
||||
m_mutex_unlock(v->mutex); \
|
||||
return false; \
|
||||
} \
|
||||
m_cond_wait(v->there_is_data, v->mutex); \
|
||||
} \
|
||||
} else if (M_C3(buffer_, name, _empty_p)(v)) \
|
||||
} else if (M_C(name, _empty_p)(v)) \
|
||||
return false; \
|
||||
\
|
||||
\
|
||||
/* POP data */ \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_STACK)) { \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||
M_GET_SET oplist (*data, v->data[v->idx_cons]); \
|
||||
} else { \
|
||||
M_DO_INIT_MOVE (oplist, *data, v->data[v->idx_cons]); \
|
||||
@@ -282,11 +282,11 @@ M_C3(buffer_, name, _init)(buffer_t v, size_t size) \
|
||||
} \
|
||||
\
|
||||
static inline size_t \
|
||||
M_C3(buffer_, name, _overwrite)(const buffer_t v) \
|
||||
M_C(name, _overwrite)(const buffer_t v) \
|
||||
{ \
|
||||
return v->overwrite; \
|
||||
} \
|
||||
|
||||
|
||||
|
||||
// NOTE: SET & INIT_SET are deliberatly missing. TBC if it the right way.
|
||||
// NOTE: There is no oplist defined for this container.
|
||||
|
||||
@@ -25,20 +25,20 @@
|
||||
#include "coverage.h"
|
||||
START_COVERAGE
|
||||
// Define a fixed queue of unsigned int
|
||||
BUFFER_DEF(uint, unsigned int, 10, BUFFER_QUEUE|BUFFER_BLOCKING)
|
||||
BUFFER_DEF(buffer_uint, unsigned int, 10, BUFFER_QUEUE|BUFFER_BLOCKING)
|
||||
END_COVERAGE
|
||||
|
||||
// Define a variable stack of float
|
||||
BUFFER_DEF(floats, float, 0, BUFFER_STACK|BUFFER_BLOCKING)
|
||||
BUFFER_DEF(buffer_floats, float, 0, BUFFER_STACK|BUFFER_BLOCKING)
|
||||
|
||||
// Define a fixed stack of char
|
||||
BUFFER_DEF(char, char, 10, BUFFER_STACK|BUFFER_UNBLOCKING)
|
||||
BUFFER_DEF(buffer_char, char, 10, BUFFER_STACK|BUFFER_UNBLOCKING)
|
||||
|
||||
// Define a fixed queue of long long
|
||||
BUFFER_DEF(llong, long long, 16, BUFFER_QUEUE|BUFFER_THREAD_UNSAFE|BUFFER_UNBLOCKING)
|
||||
BUFFER_DEF(buffer_llong, long long, 16, BUFFER_QUEUE|BUFFER_THREAD_UNSAFE|BUFFER_UNBLOCKING)
|
||||
|
||||
#include <gmp.h>
|
||||
BUFFER_DEF(mpz, mpz_t, 32, BUFFER_QUEUE, (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)))
|
||||
BUFFER_DEF(buffer_mpz, mpz_t, 32, BUFFER_QUEUE, (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)))
|
||||
|
||||
buffer_uint_t g_buff;
|
||||
|
||||
@@ -208,7 +208,7 @@ static test_t *test_new(void)
|
||||
return ishared_itest_init(p);
|
||||
}
|
||||
|
||||
BUFFER_DEF(itest, test_t *, 16, BUFFER_PUSH_INIT_POP_MOVE,
|
||||
BUFFER_DEF(buffer_itest, test_t *, 16, BUFFER_PUSH_INIT_POP_MOVE,
|
||||
ISHARED_PTR_OPLIST(ishared_itest))
|
||||
|
||||
static buffer_itest_t comm1;
|
||||
|
||||
Reference in new issue
Block a user