Files
my-os-project2/kernel/ipc/pipe/pipe.c
2025-09-06 11:47:01 +02:00

48 lines
1.0 KiB
C

#include <stdint.h>
#include <stddef.h>
#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;
}