51 lines
1.1 KiB
C
51 lines
1.1 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, uint64_t pid) {
|
|
hal_memset(pipe, 0, sizeof(*pipe));
|
|
spinlock_init(&pipe->spinlock);
|
|
pipe->ownerpid = pid;
|
|
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) {
|
|
if (pipe->rbuf.buffer != NULL) {
|
|
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;
|
|
}
|