#ifndef UCS_MPMC_H
#define UCS_MPMC_H
#include <ucs/type/status.h>
#include <ucs/sys/math.h>
#define UCS_MPMC_VALID_SHIFT 63
#define UCS_MPMC_VALUE_MAX UCS_BIT(UCS_MPMC_VALID_SHIFT)
typedef struct ucs_mpmc_queue {
uint32_t length;
int shift;
volatile uint32_t producer;
volatile uint32_t consumer;
uint64_t *queue;
} ucs_mpmc_queue_t;
ucs_status_t ucs_mpmc_queue_init(ucs_mpmc_queue_t *mpmc, uint32_t length);
void ucs_mpmc_queue_cleanup(ucs_mpmc_queue_t *mpmc);
ucs_status_t ucs_mpmc_queue_push(ucs_mpmc_queue_t *mpmc, uint64_t value);
ucs_status_t ucs_mpmc_queue_pull(ucs_mpmc_queue_t *mpmc, uint64_t *value_p);
static inline int ucs_mpmc_queue_is_empty(ucs_mpmc_queue_t *mpmc)
{
return mpmc->producer == mpmc->consumer;
}
#endif