#ifndef LANDER_EVENT_LOOP #define LANDER_EVENT_LOOP #include #include #include #include "http_req.h" #include "trie.h" // Size of the read and write buffers for each connection, in bytes #define EVENT_LOOP_BUFFER_SIZE 1024 typedef struct event_loop_gctx { Trie *trie; } event_loop_gctx; event_loop_gctx *event_loop_gctx_init(); typedef struct event_loop_ctx { http_request req; event_loop_gctx *g; } event_loop_ctx; event_loop_ctx *event_loop_ctx_init(event_loop_gctx *g); void event_loop_ctx_free(event_loop_ctx *ctx); /** * Represents an active connection managed by the event loop */ typedef enum { event_loop_conn_state_req = 0, event_loop_conn_state_res = 1, event_loop_conn_state_end = 2, } event_loop_conn_state; typedef struct event_loop_conn { int fd; event_loop_conn_state state; // buffer for reading size_t rbuf_size; size_t rbuf_read; uint8_t rbuf[EVENT_LOOP_BUFFER_SIZE]; // buffer for writing size_t wbuf_size; size_t wbuf_sent; uint8_t wbuf[EVENT_LOOP_BUFFER_SIZE]; // If true, the server will close the connection after the final write buffer // has been written bool close_after_write; event_loop_ctx *ctx; } event_loop_conn; /* * Initialize a new event_loop_conn struct */ event_loop_conn *event_loop_conn_init(event_loop_gctx *g); void event_loop_conn_free(event_loop_conn *conn); /* * Process data on a connection */ void event_loop_conn_io(event_loop_conn *conn); /* * Main struct object representing the event loop */ typedef struct event_loop { event_loop_conn **connections; size_t connection_count; event_loop_gctx *gctx; } event_loop; /* * Initialize a new event_loop struct */ event_loop *event_loop_init(event_loop_gctx *g); /* * Place a new connection into the event loop's internal array. * * Returns -1 if the internal realloc failed */ int event_loop_put(event_loop *loop, event_loop_conn *conn); /** * Accept a new connection for the given file descriptor. */ int event_loop_accept(event_loop *loop, int fd); /* * Run the event loop. This function never returns. */ void event_loop_run(event_loop *el, int port); #endif