libevent: intro basic event and signals support
authorAlexis Laferrière <alexis.laf@xymus.net>
Wed, 12 Oct 2016 19:07:50 +0000 (15:07 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Thu, 13 Oct 2016 18:12:08 +0000 (14:12 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/libevent.nit

index 15a7266..39b9316 100644 (file)
@@ -65,6 +65,14 @@ in "C" `{
        {
                ConnectionFactory_accept_connection(ctx, listener, fd, addrin, socklen);
        }
+
+       // Callback forwarded to 'EventCallback.callback'
+       static void signal_cb(evutil_socket_t fd, short events, void *data)
+       {
+               EventCallback handler = data;
+               EventCallback_callback(handler, events);
+       }
+
 #endif
 
 `}
@@ -96,6 +104,38 @@ extern class NativeEventBase `{ struct event_base * `}
        redef fun free `{ event_base_free(self); `}
 end
 
+# Event, libevent's basic unit of operation
+extern class NativeEvent `{ struct event * `}
+
+       # Add to the set of pending events
+       #
+       # TODO support timeout
+       fun add `{ event_add(self, NULL); `}
+
+       # Remove from the set of monitored events
+       fun del `{ event_del(self); `}
+
+       redef fun free `{ event_free(self); `}
+end
+
+# Signal event
+extern class NativeEvSignal
+       super NativeEvent
+
+       new (base: NativeEventBase, signal: Int, handler: EventCallback)
+       import EventCallback.callback `{
+               EventCallback_incr_ref(handler);
+               return evsignal_new(base, signal, signal_cb, handler);
+       `}
+end
+
+# Receiver of event callbacks
+interface EventCallback
+
+       # Callback on an event
+       fun callback(events: Int) do end
+end
+
 # Spawned to manage a specific connection
 #
 # TODO, use polls