Mercurial
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++)