diff --git a/kernel/ipc/mbus/mbus.c b/kernel/ipc/mbus/mbus.c index 4006deb..434366e 100644 --- a/kernel/ipc/mbus/mbus.c +++ b/kernel/ipc/mbus/mbus.c @@ -73,11 +73,10 @@ int32_t ipc_mbuspublish(const char *name, const uint8_t *const buffer) { return E_NOENTRY; } - size_t i = 0; IpcMBusCons *cons, *constmp; spinlock_acquire(&mbus->spinlock); LL_FOREACH_SAFE(mbus->consumers, cons, constmp) { - for (; i < mbus->objsize; i++) { + for (size_t i = 0; i < mbus->objsize; i++) { if (rbuf_push(&cons->rbuf, buffer[i]) < 0) { break; } @@ -85,7 +84,7 @@ int32_t ipc_mbuspublish(const char *name, const uint8_t *const buffer) { } spinlock_release(&mbus->spinlock); - return i; + return E_OK; } int32_t ipc_mbusconsume(const char *name, uint8_t *const buffer, uint64_t pid) { @@ -143,7 +142,9 @@ int32_t ipc_mbusattch(const char *name, uint64_t pid) { } rbuf_init(&cons->rbuf, buffer, mbus->objsize * mbus->objmax); + spinlock_acquire(&mbus->spinlock); LL_APPEND(mbus->consumers, cons); + spinlock_release(&mbus->spinlock); return E_OK; } @@ -175,15 +176,18 @@ int32_t ipc_mbusdttch(const char *name, uint64_t pid) { } void ipc_mbustick(void) { - spinlock_acquire(&IPC_MBUSES.spinlock); for (size_t i = 0; i < LEN(IPC_MBUSES.mbuses); i++) { + spinlock_acquire(&IPC_MBUSES.spinlock); IpcMBus *mbus = &IPC_MBUSES.mbuses[i]; + spinlock_release(&IPC_MBUSES.spinlock); + + spinlock_acquire(&mbus->spinlock); if (mbus->_hshtbstate != HSHTB_TAKEN) { + spinlock_release(&mbus->spinlock); continue; } IpcMBusCons *cons, *constmp; - spinlock_acquire(&mbus->spinlock); LL_FOREACH_SAFE(mbus->consumers, cons, constmp) { spinlock_acquire(&PROCS.spinlock); Proc *proc = NULL; @@ -198,5 +202,4 @@ void ipc_mbustick(void) { } spinlock_release(&mbus->spinlock); } - spinlock_release(&IPC_MBUSES.spinlock); }