diff seobeo/os/s_macos_edge.c @ 7:114cad94008f

[Seobeo] Updated to support thread and edge server calls.
author June Park <parkjune1995@gmail.com>
date Mon, 29 Sep 2025 17:00:38 -0700
parents
children fb2cff495a60
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/seobeo/os/s_macos_edge.c	Mon Sep 29 17:00:38 2025 -0700
@@ -0,0 +1,70 @@
+#include <sys/event.h>
+#include "seobeo/seobeo.h"
+
+
+void *Seobeo_Web_Edge_Worker(void *vargs)
+{
+  WorkerArgs *args = vargs;
+  struct kevent evlist[64];
+  while (1) {
+    int ne = kevent(args->evfd, NULL, 0, evlist, 64, NULL);
+    if (ne < 0) continue;
+    for (int i = 0; i < ne; i++) {
+      Seobeo_PHandle h = evlist[i].udata;
+      if (h == args->srv) {
+        Seobeo_PHandle cli =
+          Seobeo_Stream_Handle_Accept(args->srv);
+        if (!cli) continue;
+        struct kevent kev = {
+          .ident  = cli->socket,
+          .filter = EVFILT_READ,
+          .flags  = EV_ADD,
+          .udata  = cli
+        };
+        kevent(args->evfd, &kev, 1, NULL, 0, NULL);
+      } else {
+        Seobeo_Web_HandleClientRequest(h, args->cache);
+        struct kevent kev = {
+          .ident  = h->socket,
+          .filter = EVFILT_READ,
+          .flags  = EV_DELETE,
+        };
+        kevent(args->evfd, &kev, 1, NULL, 0, NULL);
+        Seobeo_Handle_Destroy(h);
+      }
+    }
+  }
+  return NULL;
+}
+
+void  Seobeo_Web_Edge(
+    Seobeo_PHandle p_server_handle,
+    int            thread_count,
+    Dowa_PHashMap  p_html_cache)
+{
+  int kq = kqueue();
+  struct kevent kev = {
+    .ident  = p_server_handle->socket,
+    .filter = EVFILT_READ,
+    .flags  = EV_ADD,
+    .udata  = p_server_handle
+  };
+  kevent(kq, &kev, 1, NULL, 0, NULL);
+
+  pthread_attr_t attr;
+  pthread_attr_init(&attr);
+  pthread_attr_setstacksize(&attr, 100 * 1024 * 1024); // 100 MB
+
+  pthread_t  threads[thread_count];
+  WorkerArgs args = { p_server_handle, p_html_cache, kq };
+  for (int i = 0; i < thread_count; i++)
+  {
+    pthread_create(&threads[i], NULL,
+                   Seobeo_Web_Edge_Worker, &args);
+  }
+  for (int i = 0; i < thread_count; i++)
+  {
+    pthread_join(threads[i], NULL);
+  }
+  return;
+}