]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/l4re_c/lib/src/event_buffer.cc
update
[l4.git] / l4 / pkg / l4re_c / lib / src / event_buffer.cc
index cdb9f42b511df28de0299eb472c8d48554079ed4..da52c88b41102b20454fcb85908e4332de4741f7 100644 (file)
 
 using L4Re::Util::Event_buffer_consumer;
 
-static inline Event_buffer_consumer *cast(l4re_event_buffer_consumer_t *e)
+static inline Event_buffer_consumer *cast(l4re_event_buffer_consumer_t *e) throw()
 {
   (void)sizeof(char[sizeof(e->_obj_buf) - sizeof(Event_buffer_consumer)]);
   return (Event_buffer_consumer *)e->_obj_buf;
 }
 
-inline void *operator new(size_t, void *a) { return a; }
+inline void *operator new(size_t, void *a) throw() { return a; }
 
 L4_CV long
 l4re_event_buffer_attach(l4re_event_buffer_consumer_t *evbuf,
@@ -55,22 +55,23 @@ l4re_event_buffer_next(l4re_event_buffer_consumer_t *evbuf) L4_NOTHROW
 
 L4_CV void
 l4re_event_buffer_consumer_foreach_available_event
-  (l4re_event_buffer_consumer_t *evbuf,
-   L4_CV void (*cb)(l4re_event_t *ev)) L4_NOTHROW
+  (l4re_event_buffer_consumer_t *evbuf, void *data,
+   l4re_event_buffer_cb_t *cb)
 {
-  void (*_cb)(L4Re::Event_buffer::Event*)
-    = (void (*)(L4Re::Event_buffer::Event*))cb;
-  cast(evbuf)->foreach_available_event(_cb);
+  typedef void Cb(L4Re::Event_buffer::Event*, void *);
+
+  Cb *_cb = (Cb*)cb;
+  cast(evbuf)->foreach_available_event(_cb, data);
 }
 
 L4_CV void
 l4re_event_buffer_consumer_process(l4re_event_buffer_consumer_t *evbuf,
-                                   l4_cap_idx_t irq, l4_cap_idx_t thread,
-                                   L4_CV void (*cb)(l4re_event_t *ev)) L4_NOTHROW
+                                   l4_cap_idx_t irq, l4_cap_idx_t thread, void *data,
+                                   l4re_event_buffer_cb_t *cb)
 {
   L4::Cap<L4::Irq> i(irq);
   L4::Cap<L4::Thread> t(thread);
-  void (*_cb)(L4Re::Event_buffer::Event*)
-    = (void (*)(L4Re::Event_buffer::Event*))cb;
-  cast(evbuf)->process(i, t, _cb);
+  void (*_cb)(L4Re::Event_buffer::Event*, void *)
+    = (void (*)(L4Re::Event_buffer::Event*, void *))cb;
+  cast(evbuf)->process(i, t, _cb, data);
 }