00001
00002
00011
00012
00013
00014
00015
00016 #include <l4/log/l4log.h>
00017 #include <l4/events/events.h>
00018 #include <l4/generic_io/generic_io-client.h>
00019 #include <l4/thread/thread.h>
00020 #include <l4/sys/syscalls.h>
00021
00022 #include "events.h"
00023 #include "omega0lib.h"
00024
00025 static l4_threadid_t l4io_service_id = L4_INVALID_ID;
00026 l4_threadid_t events_thread_id = L4_INVALID_ID;
00027
00028 static void
00029 events_init_and_wait(void *dummy)
00030 {
00031 l4events_ch_t event_ch = L4EVENTS_EXIT_CHANNEL;
00032 l4events_nr_t event_nr = L4EVENTS_NO_NR;
00033 l4events_event_t event;
00034 CORBA_Environment _env = dice_default_environment;
00035
00036
00037 l4events_init();
00038 l4events_register(event_ch, 14);
00039
00040
00041 for (;;)
00042 {
00043 l4_taskid_t tid;
00044 int ret, res;
00045
00046
00047 res = l4events_give_ack_and_receive(&event_ch, &event, &event_nr,
00048 L4_IPC_NEVER, L4EVENTS_RECV_ACK);
00049 if (res != L4EVENTS_OK)
00050 continue;
00051
00052 tid = *(l4_taskid_t*)event.str;
00053
00054
00055
00056 ret = l4_io_release_client_call(&l4io_service_id, &tid, &_env);
00057 if (DICE_HAS_EXCEPTION(&_env))
00058 LOG_Error("handle exit event: call to service thread failed " \
00059 "(exc %d)!", DICE_EXCEPTION_MAJOR(&_env));
00060 ret = l4_io_unregister_client_call(&l4io_service_id, &tid, &_env);
00061 if (DICE_HAS_EXCEPTION(&_env))
00062 LOG_Error("handle exit event: call to service thread failed " \
00063 "(exc %d)!", DICE_EXCEPTION_MAJOR(&_env));
00064
00065 #ifndef ARCH_arm
00066
00067
00068 OMEGA0_free_resources(tid);
00069 #endif
00070 }
00071 }
00072
00073 void
00074 init_events(void)
00075 {
00076 static int events_init_done;
00077
00078 if (!events_init_done)
00079 {
00080 l4io_service_id = l4_myself();
00081 l4thread_t t = l4thread_create_long(L4THREAD_INVALID_ID,
00082 events_init_and_wait,
00083 ".events", L4THREAD_INVALID_SP,
00084 L4THREAD_DEFAULT_SIZE,
00085 L4THREAD_DEFAULT_PRIO,
00086 0, L4THREAD_CREATE_ASYNC);
00087
00088 events_thread_id = l4thread_l4_id(t);
00089 events_init_done = 1;
00090 }
00091 }