diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index d72a421a3..655511094 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -251,21 +251,38 @@ void kernel_copydescriptors(struct task *source, struct task *target) } -unsigned int kernel_send(struct event_header *header) +unsigned int kernel_receive(unsigned int id, void *buffer, unsigned int count) { - struct task *task = &tasks[header->target]; - unsigned int count = task_writeall(task, header, header->length); + struct task *task = &tasks[id]; - kernel_unblocktask(task); + count = task_readall(task, buffer, count); + + if (!count) + kernel_blocktask(task); return count; } -unsigned int kernel_multicast(struct list *states, struct event_header *header) +unsigned int kernel_send(unsigned int id, void *buffer, unsigned int count) { + struct task *task = &tasks[id]; + + count = task_writeall(task, buffer, count); + + if (count) + kernel_unblocktask(task); + + return count; + +} + +unsigned int kernel_multicast(struct list *states, void *buffer, unsigned int count) +{ + + struct event_header *header = buffer; struct list_item *current; spinlock_acquire(&states->spinlock); @@ -277,13 +294,13 @@ unsigned int kernel_multicast(struct list *states, struct event_header *header) header->target = state->task->id; - kernel_send(header); + kernel_send(state->task->id, buffer, count); } spinlock_release(&states->spinlock); - return header->length; + return count; } @@ -296,7 +313,7 @@ unsigned int kernel_multicastdata(struct list *states, void *buffer, unsigned in event_createdata(header, EVENT_BROADCAST, 0); event_appenddata(header, count, buffer); - return kernel_multicast(states, header); + return kernel_multicast(states, header, header->length); } diff --git a/src/kernel/kernel.h b/src/kernel/kernel.h index 09d9aedd1..afc121962 100644 --- a/src/kernel/kernel.h +++ b/src/kernel/kernel.h @@ -16,8 +16,9 @@ void kernel_unblocktask(struct task *task); void kernel_schedule(struct core *core); struct service_descriptor *kernel_getdescriptor(struct task *task, unsigned int descriptor); void kernel_copydescriptors(struct task *source, struct task *target); -unsigned int kernel_send(struct event_header *header); -unsigned int kernel_multicast(struct list *states, struct event_header *header); +unsigned int kernel_receive(unsigned int id, void *buffer, unsigned int count); +unsigned int kernel_send(unsigned int id, void *buffer, unsigned int count); +unsigned int kernel_multicast(struct list *states, void *buffer, unsigned int count); unsigned int kernel_multicastdata(struct list *states, void *buffer, unsigned int count); unsigned int kernel_setupbinary(struct task *task, unsigned int sp); void kernel_setupinit(struct task *task); diff --git a/src/modules/console/main.c b/src/modules/console/main.c index b71592936..4e10c6dbe 100644 --- a/src/modules/console/main.c +++ b/src/modules/console/main.c @@ -19,8 +19,8 @@ void console_notifydata(struct console_interface *interface, unsigned char data) struct {struct event_header header; struct event_consoledata consoledata;} message; event_createconsoledata(&message.header, data); - kernel_multicast(&event.states, &message.header); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&event.states, &message.header, message.header.length); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } diff --git a/src/modules/event/main.c b/src/modules/event/main.c index 6f346c299..c5659ff20 100644 --- a/src/modules/event/main.c +++ b/src/modules/event/main.c @@ -7,12 +7,7 @@ static struct system_node root; static unsigned int root_read(struct system_node *self, struct system_node *current, struct service_state *state, void *buffer, unsigned int count, unsigned int offset) { - count = task_readall(state->task, buffer, count); - - if (!count) - kernel_blocktask(state->task); - - return count; + return kernel_receive(state->task->id, buffer, count); } @@ -30,9 +25,9 @@ static unsigned int root_write(struct system_node *self, struct system_node *cur header->source = state->task->id; if (header->target) - return kernel_send(header); + return kernel_send(header->target, header, header->length); else - return kernel_multicast(&self->states, header); + return kernel_multicast(&self->states, header, header->length); } diff --git a/src/modules/keyboard/main.c b/src/modules/keyboard/main.c index 0fc7d3915..6eb5dd516 100644 --- a/src/modules/keyboard/main.c +++ b/src/modules/keyboard/main.c @@ -19,8 +19,8 @@ void keyboard_notifypress(struct keyboard_interface *interface, unsigned char sc struct {struct event_header header; struct event_keypress keypress;} message; event_createkeypress(&message.header, scancode); - kernel_multicast(&event.states, &message.header); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&event.states, &message.header, message.header.length); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } @@ -30,8 +30,8 @@ void keyboard_notifyrelease(struct keyboard_interface *interface, unsigned char struct {struct event_header header; struct event_keyrelease keyrelease;} message; event_createkeyrelease(&message.header, scancode); - kernel_multicast(&event.states, &message.header); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&event.states, &message.header, message.header.length); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } diff --git a/src/modules/mouse/main.c b/src/modules/mouse/main.c index 86c794961..07f3dc7df 100644 --- a/src/modules/mouse/main.c +++ b/src/modules/mouse/main.c @@ -19,8 +19,8 @@ void mouse_notifymove(struct mouse_interface *interface, char relx, char rely) struct {struct event_header header; struct event_mousemove mousemove;} message; event_createmousemove(&message.header, relx, rely); - kernel_multicast(&event.states, &message.header); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&event.states, &message.header, message.header.length); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } @@ -30,8 +30,8 @@ void mouse_notifypress(struct mouse_interface *interface, unsigned int button) struct {struct event_header header; struct event_mousepress mousepress;} message; event_createmousepress(&message.header, button); - kernel_multicast(&event.states, &message.header); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&event.states, &message.header, message.header.length); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } @@ -41,8 +41,8 @@ void mouse_notifyrelease(struct mouse_interface *interface, unsigned int button) struct {struct event_header header; struct event_mouserelease mouserelease;} message; event_createmouserelease(&message.header, button); - kernel_multicast(&event.states, &message.header); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&event.states, &message.header, message.header.length); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } diff --git a/src/modules/timer/main.c b/src/modules/timer/main.c index 1a28d9644..a52c50c62 100644 --- a/src/modules/timer/main.c +++ b/src/modules/timer/main.c @@ -18,7 +18,7 @@ void timer_notifytick(struct timer_interface *interface, unsigned int counter) struct {struct event_header header; struct event_timertick timertick;} message; event_createtimertick(&message.header, counter); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&interface->event.states, &message.header, message.header.length); } diff --git a/src/modules/video/main.c b/src/modules/video/main.c index 3d53f52e8..7eec25f74 100644 --- a/src/modules/video/main.c +++ b/src/modules/video/main.c @@ -11,7 +11,7 @@ void video_notifymode(struct video_interface *interface, unsigned int w, unsigne struct {struct event_header header; struct event_videomode videomode;} message; event_createvideomode(&message.header, w, h, bpp); - kernel_multicast(&interface->event.states, &message.header); + kernel_multicast(&interface->event.states, &message.header, message.header.length); }