]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/libevent/lib/src/event.cc
update
[l4.git] / l4 / pkg / libevent / lib / src / event.cc
index ef9aa8e6324cb2624d086aef6382072a804e8702..7935a19464fbed36f11e023d09883d23248a80f7 100644 (file)
 
 namespace Event {
 
-void
-Event::attach_thread(pthread_t thread)
+
+int
+Event::wait()
 {
-  if (!thread)
-    thread = pthread_self();
-  L4::Cap<L4::Thread> t(pthread_getl4cap(thread));
-  _l4thread = t;
-  attach();
+  pthread_mutex_lock(&_wait_lock);
+
+  attach(pthread_l4_getcap(pthread_self()));
+
+  int ret = l4_error(_irq->receive());
+
+  pthread_mutex_unlock(&_wait_lock);
+  return ret;
 }
 
-Event::~Event()
+Event_loop::Event_loop(L4::Cap<L4::Irq> irq, int prio)
+  : Event_base(irq), _pthread(0)
 {
-  if (_pthread)
-    pthread_cancel(_pthread);
+  pthread_attr_t a;
+  pthread_attr_init(&a);
+  if (prio != -1)
+    {
+      sched_param sp;
+      sp.sched_priority = prio;
+      pthread_attr_setschedpolicy(&a, SCHED_L4);
+      pthread_attr_setschedparam(&a, &sp);
+      pthread_attr_setinheritsched(&a, PTHREAD_EXPLICIT_SCHED);
+    }
+  else
+    pthread_attr_setinheritsched(&a, PTHREAD_INHERIT_SCHED);
 
-  if (_irq.is_valid())
+  if (pthread_create(&_pthread, &a, event_loop, this))
     {
-      _irq->detach();
-      L4Re::Util::cap_alloc.free(_irq, L4Re::This_task);
+      _irq = L4::Cap<void>::Invalid;
+      return;
     }
 }
 
+void
+Event_loop::start()
+{
+  attach(pthread_l4_getcap(_pthread));
+}
+
+Event_loop::~Event_loop()
+{
+  if (_pthread)
+    pthread_cancel(_pthread);
+}
+
 void *
-Event::event_loop(void *data)
+Event_loop::event_loop(void *data)
 {
-  Event *e = reinterpret_cast<Event *>(data);
+  Event_loop *e = reinterpret_cast<Event_loop *>(data);
   while (1)
     {
       l4_msgtag_t res = e->_irq->receive(L4_IPC_NEVER);
       if (l4_ipc_error(res, l4_utcb()))
         continue;
 
-      e->_event_func(data);
+      e->handle();
     }
   return 0;
 }