view seobeo/os/s_linux_edge.c @ 34:6c322f9c2cb9

[Birthday] I didn't have nay time to buy birhtday present so w/e/
author MrJuneJune <me@mrjunejune.com>
date Sat, 11 Oct 2025 15:07:07 -0700
parents c0f6c8c7829f
children 84672efec192
line wrap: on
line source

#include <sys/epoll.h>
#include "seobeo/seobeo.h"


void  *Seobeo_Web_Edge_Worker(void *vargs)
{
  WorkerArgs *args = vargs;
  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 socket_fd = events[i].data.ptr;
      // when server....
      if (socket_fd == args->srv)
      {
        Seobeo_PHandle cli =
          Seobeo_Stream_Handle_Server_Accept(socket_fd);
        if (!cli) continue;


        struct epoll_event client_ev = {
          .events = EPOLLIN | EPOLLET,  
          .data.ptr = cli
        };
        epoll_ctl(args->evfd, EPOLL_CTL_ADD,
                  cli->socket, &client_ev);
      }
      // when client....
      else
      {
        Seobeo_Web_HandleClientRequest(socket_fd, args->cache); // This frees
      }
    }
  }
  return NULL;
}

void  Seobeo_Web_Edge(
    Seobeo_PHandle p_server_handle,
    int            thread_count,
    Dowa_PHashMap   p_html_cache)
{
  int epfd = epoll_create1(0);
  struct epoll_event ev = {
    .events   = EPOLLIN,
    .data.ptr = p_server_handle
  };
  epoll_ctl(epfd, EPOLL_CTL_ADD,
            p_server_handle->socket, &ev);

  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setstacksize(&attr, 5 * 1024 * 1024); // 5 MB

  pthread_t  threads[thread_count];
  for (int i = 0; i < thread_count; i++)
  {
    WorkerArgs *args = malloc(sizeof(WorkerArgs));
    *args = (WorkerArgs){ p_server_handle, p_html_cache, epfd };

    pthread_create(&threads[i], NULL, Seobeo_Web_Edge_Worker, args);
  }
  for (int i = 0; i < thread_count; i++)
  {
    pthread_join(threads[i], NULL);
  }
  return;
}