Files
pico/projects/Zeta/API/Z/functions/buffer.h
2026-03-24 22:22:37 +00:00

85 lines
1.8 KiB
C
Vendored

/* Zeta API - Z/functions/buffer.h
______ ______________ ___
|__ / | ___|___ ___|/ \
/ /__| __| | | / - \
/______|_____| |__| /__/ \__\
Copyright (C) 2012 Remis.
Copyright (C) 2006-2024 Manuel Sainz de Baranda y Goñi.
Released under the terms of the GNU Lesser General Public License v3. */
#ifndef Z_functions_buffer_H
#define Z_functions_buffer_H
#include <Z/constants/pointer.h>
#include <Z/macros/language.h>
#include <Z/types/buffer.h>
#include <Z/functions/atomic.h>
static Z_INLINE
void z_triple_buffer_initialize(
ZTripleBuffer* self,
void* slot_0,
void* slot_1,
void* slot_2
)
{
self->slots[0] = slot_0;
self->slots[1] = slot_1;
self->slots[2] = slot_2;
self->f = 6;
}
static Z_INLINE
void *z_triple_buffer_consume(ZTripleBuffer *self)
{
zuchar fi, fo;
do {
if (!((fi = self->f) & 64)) return Z_NULL;
fo = (zuchar)((fi & 48) | ((fi & 12) >> 2) | ((fi & 3) << 2));
}
while (!z_T_atomic_set_if_equal(UCHAR)(&self->f, fi, fo));
return self->slots[fo & 3];
}
static Z_INLINE
void *z_triple_buffer_consumption(ZTripleBuffer const *self)
{return self->slots[self->f & 3];}
static Z_INLINE
zuchar z_triple_buffer_consumption_index(ZTripleBuffer const *self)
{return self->f & 3;}
static Z_INLINE
void *z_triple_buffer_produce(ZTripleBuffer *self)
{
zuchar fi, fo;
do {
fi = self->f;
fo = (zuchar)(64 | ((fi & 48) >> 2) | ((fi & 12) << 2) | (fi & 3));
}
while (!z_T_atomic_set_if_equal(UCHAR)(&self->f, fi, fo));
return self->slots[(fo & 48) >> 4];
}
static Z_INLINE
void *z_triple_buffer_production(ZTripleBuffer const *self)
{return self->slots[(self->f & 48) >> 4];}
static Z_INLINE
zuchar z_triple_buffer_production_index(ZTripleBuffer const *self)
{return (self->f & 48) >> 4;}
#endif /* Z_functions_buffer_H */