#include #include #include "rbuf/rbuf.h" #include "spinlock/spinlock.h" #include "hal/hal.h" #include "dlmalloc/malloc.h" #include "errors.h" #include "pipe.h" int32_t ipc_pipeinit(IpcPipe *pipe) { hal_memset(pipe, 0, sizeof(*pipe)); spinlock_init(&pipe->spinlock); pipe->rbuf.buffer = dlmalloc(IPC_PIPE_MAX); if (pipe->rbuf.buffer == NULL) { return E_NOMEMORY; } pipe->rbuf.cap = IPC_PIPE_MAX; return E_OK; } void ipc_pipefree(IpcPipe *pipe) { dlfree(pipe->rbuf.buffer); } int32_t ipc_pipewrite(IpcPipe *pipe, const uint8_t *const buffer, size_t n) { size_t i = 0; spinlock_acquire(&pipe->spinlock); for (; i < n; i++) { if (rbuf_push(&pipe->rbuf, buffer[i]) < 0) { break; } } spinlock_release(&pipe->spinlock); return i; } int32_t ipc_piperead(IpcPipe *pipe, uint8_t *const buffer, size_t n) { size_t i = 0; spinlock_acquire(&pipe->spinlock); for (; i < n; i++) { if (rbuf_pop(&pipe->rbuf, &buffer[i]) < 0) { break; } } spinlock_release(&pipe->spinlock); return i; }