55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
#ifndef LNM_LOOP
|
|
#define LNM_LOOP
|
|
|
|
#include <stdatomic.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "lnm/common.h"
|
|
|
|
#define LNM_LOOP_BUF_SIZE 2048
|
|
|
|
typedef enum {
|
|
lnm_loop_state_req = 0,
|
|
lnm_loop_state_res,
|
|
lnm_loop_state_end,
|
|
} lnm_loop_state;
|
|
|
|
typedef struct lnm_loop_conn {
|
|
int fd;
|
|
lnm_loop_state state;
|
|
void *ctx;
|
|
struct {
|
|
char buf[LNM_LOOP_BUF_SIZE];
|
|
size_t size;
|
|
size_t read;
|
|
} r;
|
|
struct {
|
|
char buf[LNM_LOOP_BUF_SIZE];
|
|
size_t size;
|
|
} w;
|
|
} lnm_loop_conn;
|
|
|
|
typedef struct lnm_loop {
|
|
int listen_fd;
|
|
int epoll_fd;
|
|
atomic_int open;
|
|
void *gctx;
|
|
lnm_err (*ctx_init)(void **out, void *gctx);
|
|
void (*ctx_free)(void *ctx);
|
|
void (*data_read)(lnm_loop_conn *conn);
|
|
void (*data_write)(lnm_loop_conn *conn);
|
|
} lnm_loop;
|
|
|
|
lnm_err lnm_loop_init(lnm_loop **out, void *gctx,
|
|
lnm_err (*ctx_init)(void **out, void *gctx),
|
|
void (*ctx_free)(void *ctx),
|
|
void (*data_read)(lnm_loop_conn *conn),
|
|
void (*data_write)(lnm_loop_conn *conn));
|
|
|
|
lnm_err lnm_loop_setup(lnm_loop *l, uint16_t port);
|
|
|
|
lnm_err lnm_loop_run(lnm_loop *l, int thread_count);
|
|
|
|
#endif
|