WIP: pth transistion, 3rd step, commands basically ported
[rxpd] / src / rxpd_socket.c
index add7f7bf979ea1b43195dec7040a524b8dba0b46..e8a1e9cf3efd3a444bee1a89f6d78f01d66df846 100644 (file)
@@ -62,7 +62,7 @@ rxpd_socket_new_tcp4 (struct rxpd_base* base, const char* addr, unsigned short p
 
   self->rxpd_socket_addr = rxpd_socket_tcp4addr;
 
-  event_set (&self->ev, self->fd, EV_READ, rxpd_socket_accept, self);
+  self->accepter = NULL;
   llist_insert_tail (&base->sockets, &self->node);
 
   rxpd_log (base, LOG_INFO, "Listening on tcp4:%d\n", port);
@@ -100,35 +100,50 @@ rxpd_socket_delete (struct rxpd_socket* self)
 }
 
 struct rxpd_socket*
-rxpd_socket_schedule (struct rxpd_socket* self)
+rxpd_socket_join (struct rxpd_socket* self)
 {
-  if (self)
-    {
-      event_add (&self->ev, NULL);
-    }
+  pth_join (self->accepter, NULL);
+  self->accepter = NULL;
   return self;
 }
 
 struct rxpd_socket*
-rxpd_socket_suspend (struct rxpd_socket* self)
+rxpd_socket_spawn (struct rxpd_socket* self)
 {
   if (self)
     {
-      event_del (&self->ev);
+      if (self->accepter)
+        rxpd_die ("socket thread already spawned\n");
+
+      self->accepter = pth_spawn (PTH_ATTR_DEFAULT, rxpd_socket_accept, self);
+
+      if (!self->accepter)
+        rxpd_die ("failed spawning thread\n");
     }
   return self;
 }
 
-void
-rxpd_socket_accept (int fd, short event, void* ptr)
+void *
+rxpd_socket_accept (void* ptr)
 {
-  (void) event;
   struct rxpd_socket* self = ptr;
 
-  struct rxpd_connection* conn =
-    rxpd_connection_new (self, fd);
+  pth_event_t ev = pth_event (PTH_EVENT_FD|PTH_UNTIL_FD_READABLE, self->fd);
+
+  rxpd_log (NULL, LOG_NOTICE, "pre ACCEPT\n");
+
+  // TODO cancel thread to leave the loop?
+  while (pth_wait (ev))
+    {
+      rxpd_log (NULL, LOG_NOTICE, "ACCEPT\n");
+
+      struct rxpd_connection* conn =
+        rxpd_connection_new (self);
+      rxpd_connection_spawn (conn);
+    }
+
+  rxpd_log (NULL, LOG_NOTICE, "closed\n");
 
-  rxpd_connection_schedule (conn);
-  rxpd_socket_schedule (self);
+  return NULL;
 }