fix(lnm): seemingly fix performance regression
							parent
							
								
									58a8645c6c
								
							
						
					
					
						commit
						a0954e8d07
					
				| 
						 | 
				
			
			@ -6,7 +6,7 @@
 | 
			
		|||
 | 
			
		||||
#include "lnm/common.h"
 | 
			
		||||
 | 
			
		||||
#define LNM_LOOP_BUF_SIZE 4096
 | 
			
		||||
#define LNM_LOOP_BUF_SIZE 2048
 | 
			
		||||
#define LNM_LOOP_INITIAL_CONNS 16
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -341,11 +341,9 @@ void lnm_http_loop_process(lnm_http_conn *conn) {
 | 
			
		|||
    http_loop_state = ctx->state;
 | 
			
		||||
 | 
			
		||||
    process_fns[http_loop_state](conn);
 | 
			
		||||
  } while ((conn->state == loop_state) &&
 | 
			
		||||
           (conn->state == state_map[http_loop_state]) &&
 | 
			
		||||
  } while ((conn->state == state_map[ctx->state]) &&
 | 
			
		||||
           (http_loop_state != ctx->state));
 | 
			
		||||
 | 
			
		||||
  // Check required to prevent overwriting manually set event loop state
 | 
			
		||||
  conn->state =
 | 
			
		||||
      conn->state == loop_state ? state_map[http_loop_state] : conn->state;
 | 
			
		||||
  conn->state = conn->state == loop_state ? state_map[ctx->state] : conn->state;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ lnm_err lnm_loop_accept(lnm_loop *l) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
lnm_err lnm_loop_setup(lnm_loop *l, uint16_t port) {
 | 
			
		||||
  int listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
 | 
			
		||||
  int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
 | 
			
		||||
 | 
			
		||||
  if (listen_fd < 0) {
 | 
			
		||||
    return lnm_err_failed_network;
 | 
			
		||||
| 
						 | 
				
			
			@ -105,6 +105,9 @@ lnm_err lnm_loop_setup(lnm_loop *l, uint16_t port) {
 | 
			
		|||
    return lnm_err_failed_network;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int flags = fcntl(listen_fd, F_GETFL);
 | 
			
		||||
  fcntl(listen_fd, F_SETFL, flags | O_NONBLOCK);
 | 
			
		||||
 | 
			
		||||
  l->listen_fd = listen_fd;
 | 
			
		||||
 | 
			
		||||
  return lnm_err_ok;
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +119,7 @@ lnm_err lnm_loop_run(lnm_loop *l) {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  struct pollfd *poll_args =
 | 
			
		||||
      malloc((LNM_LOOP_INITIAL_CONNS + 1) * sizeof(struct pollfd));
 | 
			
		||||
      calloc(LNM_LOOP_INITIAL_CONNS + 1, sizeof(struct pollfd));
 | 
			
		||||
  size_t poll_args_cap = LNM_LOOP_INITIAL_CONNS + 1;
 | 
			
		||||
 | 
			
		||||
  if (poll_args == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +131,7 @@ lnm_err lnm_loop_run(lnm_loop *l) {
 | 
			
		|||
  poll_args[0].events = POLLIN;
 | 
			
		||||
 | 
			
		||||
  while (1) {
 | 
			
		||||
    size_t poll_args_len = 1;
 | 
			
		||||
    nfds_t poll_args_len = 1;
 | 
			
		||||
 | 
			
		||||
    // Add all open connections to the poll command
 | 
			
		||||
    for (size_t i = 0; i < l->conns.len && poll_args_len < l->conns.open + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +179,7 @@ lnm_err lnm_loop_run(lnm_loop *l) {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if (poll_args_cap < l->conns.open + 1) {
 | 
			
		||||
      struct pollfd *buf = malloc((l->conns.open + 1) * sizeof(struct pollfd));
 | 
			
		||||
      struct pollfd *buf = calloc(l->conns.open + 1, sizeof(struct pollfd));
 | 
			
		||||
 | 
			
		||||
      if (buf == NULL) {
 | 
			
		||||
        return lnm_err_failed_alloc;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,8 @@ void lnm_loop_conn_io_req(lnm_loop *l, lnm_loop_conn *conn) {
 | 
			
		|||
 | 
			
		||||
void lnm_loop_conn_io_res(lnm_loop *l, lnm_loop_conn *conn) {
 | 
			
		||||
  do {
 | 
			
		||||
    l->data_write(conn);
 | 
			
		||||
 | 
			
		||||
    ssize_t res;
 | 
			
		||||
 | 
			
		||||
    do {
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +51,7 @@ void lnm_loop_conn_io_res(lnm_loop *l, lnm_loop_conn *conn) {
 | 
			
		|||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (res <= 0) {
 | 
			
		||||
    if (res < 0) {
 | 
			
		||||
      conn->state = lnm_loop_state_end;
 | 
			
		||||
 | 
			
		||||
      return;
 | 
			
		||||
| 
						 | 
				
			
			@ -59,8 +61,6 @@ void lnm_loop_conn_io_res(lnm_loop *l, lnm_loop_conn *conn) {
 | 
			
		|||
    // writer function more space to work with
 | 
			
		||||
    memmove(conn->w.buf, &conn->w.buf[res], conn->w.size - res);
 | 
			
		||||
    conn->w.size -= res;
 | 
			
		||||
 | 
			
		||||
    l->data_write(conn);
 | 
			
		||||
  } while (conn->state == lnm_loop_state_res);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue