Skip to content

Commit

Permalink
more work
Browse files Browse the repository at this point in the history
Signed-off-by: Jens Nyberg <jens.nyberg@gmail.com>
  • Loading branch information
jezze committed Nov 5, 2018
1 parent 9add2f6 commit da09fb0
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 32 deletions.
33 changes: 25 additions & 8 deletions src/kernel/kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;

}

Expand All @@ -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);

}

Expand Down
5 changes: 3 additions & 2 deletions src/kernel/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/modules/console/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}

Expand Down
11 changes: 3 additions & 8 deletions src/modules/event/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}

Expand All @@ -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);

}

Expand Down
8 changes: 4 additions & 4 deletions src/modules/keyboard/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}

Expand All @@ -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);

}

Expand Down
12 changes: 6 additions & 6 deletions src/modules/mouse/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}

Expand All @@ -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);

}

Expand All @@ -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);

}

Expand Down
2 changes: 1 addition & 1 deletion src/modules/timer/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}

Expand Down
2 changes: 1 addition & 1 deletion src/modules/video/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}

Expand Down

0 comments on commit da09fb0

Please sign in to comment.