kernel: msg: implement asynchronous event messages

This commit is contained in:
2026-03-24 18:32:33 +00:00
parent 110f625f04
commit 89d02c72ee
7 changed files with 178 additions and 56 deletions

View File

@@ -98,11 +98,18 @@ static struct msg *get_next_msg(
while (cur) {
struct msg *msg = BTREE_CONTAINER(struct msg, msg_node, cur);
spin_lock_irqsave(&msg->msg_lock, lock_flags);
if (msg->msg_status == KMSG_WAIT_RECEIVE) {
switch (msg->msg_status) {
case KMSG_WAIT_RECEIVE:
msg->msg_status = KMSG_WAIT_REPLY;
msg->msg_sender_port->p_status = PORT_REPLY_BLOCKED;
channel->c_msg_waiting--;
return msg;
case KMSG_ASYNC:
btree_delete(&channel->c_msg, &msg->msg_node);
channel->c_msg_waiting--;
return msg;
default:
break;
}
spin_unlock_irqrestore(&msg->msg_lock, *lock_flags);
@@ -146,24 +153,22 @@ extern kern_status_t channel_recv_msg(
&channel->c_base,
CHANNEL_SIGNAL_MSG_RECEIVED);
}
#if 0
wait_item_init(&waiter, self);
for (;;) {
thread_wait_begin(&waiter, &channel->c_wq);
msg = get_next_msg(channel, &msg_lock_flags);
if (msg) {
break;
}
object_unlock_irqrestore(&channel->c_base, *irq_flags);
schedule(SCHED_NORMAL);
object_lock_irqsave(&channel->c_base, irq_flags);
}
thread_wait_end(&waiter, &channel->c_wq);
#endif
/* msg is now set to the next message to process */
if (msg->msg_type != KERN_MSG_TYPE_DATA) {
/* event messages as asynchronous */
out_msg->msg_id = msg->msg_id;
out_msg->msg_type = msg->msg_type;
out_msg->msg_event = msg->msg_event;
out_msg->msg_sender = msg->msg_sender_thread->tr_parent->t_id;
out_msg->msg_endpoint = msg->msg_sender_port->p_base.ob_id;
spin_unlock_irqrestore(&msg->msg_lock, msg_lock_flags);
msg_free(msg);
return KERN_OK;
}
struct task *sender = msg->msg_sender_thread->tr_parent;
struct task *receiver = self->tr_parent;
@@ -218,6 +223,7 @@ extern kern_status_t channel_recv_msg(
}
out_msg->msg_id = msg->msg_id;
out_msg->msg_type = msg->msg_type;
out_msg->msg_sender = msg->msg_sender_thread->tr_parent->t_id;
out_msg->msg_endpoint = msg->msg_sender_port->p_base.ob_id;