00001
00009
00010
00011
00012
00013
00014 #include <stdlib.h>
00015
00016 #include <l4/sys/ipc.h>
00017 #include <l4/sys/syscalls.h>
00018 #include <l4/log/l4log.h>
00019 #include <l4/names/libnames.h>
00020 #include <l4/events/events.h>
00021
00022 #include "events.h"
00023 #include "globals.h"
00024 #include "omega0_proto.h"
00025
00026 int use_events;
00027
00028 static l4_threadid_t omega0_service_id;
00029 l4_threadid_t events_thread_id;
00030
00031 static void
00032 events_init_and_wait(void)
00033 {
00034 l4events_ch_t event_ch = L4EVENTS_EXIT_CHANNEL;
00035 l4events_nr_t event_nr = L4EVENTS_NO_NR;
00036 l4events_event_t event;
00037
00038 l4events_init();
00039 l4events_register(event_ch, 10);
00040
00041 for (;;)
00042 {
00043 int res;
00044 l4_msgdope_t result;
00045 l4_threadid_t tid;
00046 l4_umword_t dw0, dw1;
00047
00048 res = l4events_give_ack_and_receive(&event_ch, &event, &event_nr,
00049 L4_IPC_NEVER, L4EVENTS_RECV_ACK);
00050 if (res != L4EVENTS_OK)
00051 continue;
00052
00053 tid = *(l4_taskid_t*)event.str;
00054
00055 res = l4_ipc_call(omega0_service_id,
00056 L4_IPC_SHORT_MSG, OMEGA0_DETACH_ALL, tid.id.task,
00057 L4_IPC_SHORT_MSG, &dw0, &dw1, L4_IPC_NEVER, &result);
00058 }
00059 }
00060
00061 void
00062 init_events(void)
00063 {
00064 l4_threadid_t pager = L4_INVALID_ID, preempter = L4_INVALID_ID;
00065 void *stack;
00066 l4_umword_t dummy;
00067
00068 omega0_service_id = events_thread_id = l4_myself();
00069
00070 l4_thread_ex_regs_flags(l4_myself(), -1, -1, &preempter, &pager,
00071 &dummy, &dummy, &dummy, L4_THREAD_EX_REGS_NO_CANCEL);
00072 if (l4_is_invalid_id(pager))
00073 return;
00074
00075 if (!(stack = malloc(STACKSIZE)))
00076 {
00077 LOGl("error getting %d bytes of memory", STACKSIZE);
00078 return;
00079 }
00080
00081 events_thread_id.id.lthread = 1;
00082 l4_thread_ex_regs(events_thread_id,
00083 (l4_umword_t)events_init_and_wait,
00084 (l4_umword_t)stack + STACKSIZE,
00085 &preempter, &pager, &dummy, &dummy, &dummy);
00086
00087 names_register_thread_weak("omega0.events", events_thread_id);
00088 }