56 lines
1.1 KiB
HolyC
56 lines
1.1 KiB
HolyC
#define ipc user_data.u32[0]
|
|
#define IPC_QUEUE_SIZE 1024
|
|
#define IPC_ENQUEUE_LIMIT 16
|
|
|
|
class IpcMessage {
|
|
CTask* client;
|
|
I64 timestamp;
|
|
I64 type;
|
|
U64 payload;
|
|
I64 i64;
|
|
};
|
|
|
|
class @ipc
|
|
{
|
|
U0 (*InitQueue)(CTask* task);
|
|
IpcMessage* (*MsgRecv)();
|
|
U0 (*MsgSend)(CTask* task, IpcMessage* msg);
|
|
};
|
|
|
|
U0 @ipc_queue_init(CTask* task)
|
|
{ // Initialize a task's IpcMessage Queue
|
|
MemSetU32(task->pad, 0, 1);
|
|
if (!task->ipc) {
|
|
task->ipc = FifoI64New(IPC_QUEUE_SIZE, task->code_heap);
|
|
}
|
|
}
|
|
|
|
IpcMessage* @ipc_msg_recv()
|
|
{ // Receive a IpcMessage from current task's
|
|
// message queue.
|
|
U64 msg_ptr;
|
|
if (!FifoI64Cnt(Fs->ipc))
|
|
return FALSE;
|
|
FifoI64Rem(Fs->ipc, &msg_ptr);
|
|
return msg_ptr;
|
|
}
|
|
|
|
U0 @ipc_msg_send(
|
|
CTask* task,
|
|
IpcMessage* msg)
|
|
{ // Send a IpcMessage to a task (client or server)
|
|
if (FifoI64Cnt(task->ipc) > IPC_ENQUEUE_LIMIT) {
|
|
Free(msg);
|
|
return;
|
|
}
|
|
msg->timestamp = cnts.jiffies;
|
|
FifoI64Ins(task->ipc, msg);
|
|
}
|
|
|
|
@ipc Ipc;
|
|
|
|
Ipc.InitQueue = &@ipc_queue_init;
|
|
Ipc.MsgRecv = &@ipc_msg_recv;
|
|
Ipc.MsgSend = &@ipc_msg_send;
|
|
|
|
"ipc ";
|