diff seobeo/os/s_linux_edge.c @ 33:c0f6c8c7829f

[Seobeo] Linux epoll. Set the client socket to be nonblocking so that it doesn't stop loading when two different threads handle different client calls. I might have problem with socket not being cleaned up properly so need to check that.
author MrJuneJune <me@mrjunejune.com>
date Fri, 10 Oct 2025 06:59:32 -0700
parents 875bb6e10db7
children 84672efec192
line wrap: on
line diff
--- a/seobeo/os/s_linux_edge.c	Thu Oct 09 07:03:36 2025 -0700
+++ b/seobeo/os/s_linux_edge.c	Fri Oct 10 06:59:32 2025 -0700
@@ -5,27 +5,35 @@
 void  *Seobeo_Web_Edge_Worker(void *vargs)
 {
   WorkerArgs *args = vargs;
-  struct epoll_event events[64];
-  while (1) {
-    int n = epoll_wait(args->evfd, events, 64, -1);
+  uint32 max_events = 64;
+  struct epoll_event events[max_events];
+  while (1)
+  {
+    int n = epoll_wait(args->evfd, events, max_events, -1);
     if (n < 0) continue;
-    for (int i = 0; i < n; i++) {
-      Seobeo_PHandle h = events[i].data.ptr;
-      if (h == args->srv) {
-        // new connection
+
+    for (int i = 0; i < n; i++)
+    {
+      Seobeo_PHandle socket_fd = events[i].data.ptr;
+      // when server....
+      if (socket_fd == args->srv)
+      {
         Seobeo_PHandle cli =
-          Seobeo_Stream_Handle_Server_Accept(args->srv);
+          Seobeo_Stream_Handle_Server_Accept(socket_fd);
         if (!cli) continue;
-        struct epoll_event ev = {
-          .events   = EPOLLIN,
+
+
+        struct epoll_event client_ev = {
+          .events = EPOLLIN | EPOLLET,  
           .data.ptr = cli
         };
         epoll_ctl(args->evfd, EPOLL_CTL_ADD,
-                  cli->socket, &ev);
-      } else {
-        Seobeo_Web_HandleClientRequest(h, args->cache); // This frees
-        epoll_ctl(args->evfd, EPOLL_CTL_DEL,
-                  h->socket, NULL);
+                  cli->socket, &client_ev);
+      }
+      // when client....
+      else
+      {
+        Seobeo_Web_HandleClientRequest(socket_fd, args->cache); // This frees
       }
     }
   }
@@ -39,7 +47,7 @@
 {
   int epfd = epoll_create1(0);
   struct epoll_event ev = {
-    .events   = EPOLLIN | EPOLLONESHOT,
+    .events   = EPOLLIN,
     .data.ptr = p_server_handle
   };
   epoll_ctl(epfd, EPOLL_CTL_ADD,
@@ -47,7 +55,7 @@
 
   pthread_attr_t attr;
   pthread_attr_init(&attr);
-  pthread_attr_setstacksize(&attr, 100 * 1024 * 1024); // 100 MB
+  pthread_attr_setstacksize(&attr, 5 * 1024 * 1024); // 5 MB
 
   pthread_t  threads[thread_count];
   for (int i = 0; i < thread_count; i++)