summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/Network/IPCMsg.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-08-16 19:56:21 +0200
committerGitHub <noreply@github.com>2025-08-16 19:56:21 +0200
commit1a32b9307357ac0fc9095e853b2b6d94f9fe62bb (patch)
treef41f723659c8926e38182fbe062746d821ab487e /dev/kernel/src/Network/IPCMsg.cc
parenteb9df5eea339812513c25a8d3b2eeb03c633e7ac (diff)
parentb301047903b79560dce69085fc271a653a1eb4b6 (diff)
Merge pull request #55 from nekernel-org/dev
v0.0.4
Diffstat (limited to 'dev/kernel/src/Network/IPCMsg.cc')
-rw-r--r--dev/kernel/src/Network/IPCMsg.cc16
1 files changed, 15 insertions, 1 deletions
diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc
index cff19cfa..9abefcef 100644
--- a/dev/kernel/src/Network/IPCMsg.cc
+++ b/dev/kernel/src/Network/IPCMsg.cc
@@ -87,6 +87,8 @@ Bool ipc_construct_packet(_Output IPC_MSG** pckt_in) {
(*pckt_in)->IpcFrom.UserProcessID = 0;
(*pckt_in)->IpcFrom.UserProcessTeam = 0;
+ (*pckt_in)->IpcLock = kIPCLockFree;
+
return Yes;
}
@@ -103,7 +105,19 @@ Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept {
if (src->IpcMsgSz > target->IpcMsgSz) return No;
if (target->IpcMsgSz > src->IpcMsgSz) return No;
- rt_copy_memory(src->IpcData, target->IpcData, src->IpcMsgSz);
+ UInt32 timeout = 0U;
+
+ while ((target->IpcLock % kIPCLockUsed) != 0) {
+ if (timeout > 100000U) {
+ return No;
+ }
+ }
+
+ ++target->IpcLock;
+
+ rt_copy_memory_safe(src->IpcData, target->IpcData, src->IpcMsgSz, kIPCMsgSize);
+
+ --target->IpcLock;
return Yes;
}