Update logger to use format

This commit is contained in:
2022-12-29 11:09:45 +01:00
parent 5c72a0cb60
commit f9b3cc29ab
8 changed files with 57 additions and 32 deletions

View File

@ -141,8 +141,7 @@ int client_request_handler(client_ctx_t *cctx) {
strcpy(host, host_ptr); strcpy(host, host_ptr);
} }
sprintf(log_req_prefix, "[%s%*s%s]%s", BLD_STR, INET6_ADDRSTRLEN, host, CLR_STR, cctx->log_prefix); logger_set_prefix("[%s%*s%s]%s", BLD_STR, INET6_ADDRSTRLEN, host, CLR_STR, cctx->log_prefix);
logger_set_prefix(log_req_prefix);
info(BLD_STR "%s %s", req.method, req.uri); info(BLD_STR "%s %s", req.method, req.uri);
conf = get_host_config(host); conf = get_host_config(host);

View File

@ -8,15 +8,21 @@
#include <pthread.h> #include <pthread.h>
#include <signal.h> #include <signal.h>
typedef struct {
mpmc_t *ctx;
int worker_id;
} mpmc_arg_t;
static void *mpmc_worker(void *arg); static void *mpmc_worker(void *arg);
int mpmc_init(mpmc_t *ctx, int n_workers, int buf_size, void (*consumer)(void *obj), const char *prefix) { int mpmc_init(mpmc_t *ctx, int n_workers, int buf_size, void (*consumer)(void *obj), const char *name) {
ctx->alive = 1; ctx->alive = 1;
ctx->n_workers = n_workers; ctx->n_workers = n_workers;
ctx->size = buf_size, ctx->max_size = buf_size; ctx->size = buf_size, ctx->max_size = buf_size;
ctx->rd = 0, ctx->wr = 0; ctx->rd = 0, ctx->wr = 0;
ctx->buffer = NULL, ctx->workers = NULL; ctx->buffer = NULL, ctx->workers = NULL;
ctx->consumer = consumer; ctx->consumer = consumer;
ctx->name = name;
if (sem_init(&ctx->free, 0, ctx->size) != 0 || if (sem_init(&ctx->free, 0, ctx->size) != 0 ||
sem_init(&ctx->used, 0, 0) != 0 || sem_init(&ctx->used, 0, 0) != 0 ||
@ -61,9 +67,9 @@ int mpmc_queue(mpmc_t *ctx, void *obj) {
} }
} }
// lock rd field // lock wr field
try_again_2: try_again_2:
if (sem_wait(&ctx->lck_rd) != 0) { if (sem_wait(&ctx->lck_wr) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_2; goto try_again_2;
@ -73,11 +79,11 @@ int mpmc_queue(mpmc_t *ctx, void *obj) {
} }
} }
int p = ctx->rd; int p = ctx->wr;
ctx->rd = (ctx->rd + 1) % ctx->size; ctx->wr = (ctx->wr + 1) % ctx->size;
// unlock rd field // unlock wr field
sem_post(&ctx->lck_rd); sem_post(&ctx->lck_wr);
// fill buffer with object // fill buffer with object
ctx->buffer[p] = obj; ctx->buffer[p] = obj;
@ -90,6 +96,11 @@ int mpmc_queue(mpmc_t *ctx, void *obj) {
static void *mpmc_worker(void *arg) { static void *mpmc_worker(void *arg) {
mpmc_t *ctx = arg; mpmc_t *ctx = arg;
int id;
for (id = 0; id < ctx->n_workers && ctx->workers[id] != pthread_self(); id++);
logger_set_name("%s/%i", ctx->name, id);
while (ctx->alive) { while (ctx->alive) {
// wait for buffer to be filled // wait for buffer to be filled
if (sem_wait(&ctx->used) != 0) { if (sem_wait(&ctx->used) != 0) {
@ -103,8 +114,8 @@ static void *mpmc_worker(void *arg) {
} }
} }
// lock wr field // lock rd field
if (sem_wait(&ctx->lck_wr) != 0) { if (sem_wait(&ctx->lck_rd) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
sem_post(&ctx->used); sem_post(&ctx->used);
@ -117,11 +128,11 @@ static void *mpmc_worker(void *arg) {
} }
} }
int p = ctx->wr; int p = ctx->rd;
ctx->wr = (ctx->wr + 1) % ctx->size; ctx->rd = (ctx->rd + 1) % ctx->size;
// unlock wr field // unlock rd field
sem_post(&ctx->lck_wr); sem_post(&ctx->lck_rd);
// consume object // consume object
ctx->consumer(ctx->buffer[p]); ctx->consumer(ctx->buffer[p]);

View File

@ -13,9 +13,10 @@ typedef struct {
void **buffer; void **buffer;
pthread_t *workers; pthread_t *workers;
void (*consumer)(void *obj); void (*consumer)(void *obj);
const char* name;
} mpmc_t; } mpmc_t;
int mpmc_init(mpmc_t *ctx, int n_workers, int buf_size, void (*consumer)(void *obj), const char *prefix); int mpmc_init(mpmc_t *ctx, int n_workers, int buf_size, void (*consumer)(void *obj), const char *name);
int mpmc_queue(mpmc_t *ctx, void *obj); int mpmc_queue(mpmc_t *ctx, void *obj);

View File

@ -130,6 +130,7 @@ int sock_close(sock *s) {
close(s->socket); close(s->socket);
s->socket = 0; s->socket = 0;
s->enc = 0; s->enc = 0;
errno = 0;
return 0; return 0;
} }

View File

@ -162,10 +162,13 @@ static int logger_remaining(void) {
return val; return val;
} }
void logger_set_name(const char *restrict name) { void logger_set_name(const char *restrict format, ...) {
va_list args;
if (key_name == -1) { if (key_name == -1) {
// not initialized // not initialized
strncpy(global_name, name, sizeof(global_name)); va_start(args, format);
vsnprintf(global_name, sizeof(global_name), format, args);
} else { } else {
int ret; int ret;
void *ptr = pthread_getspecific(key_name); void *ptr = pthread_getspecific(key_name);
@ -177,14 +180,22 @@ void logger_set_name(const char *restrict name) {
return; return;
} }
} }
strncpy(ptr, name, LOG_NAME_LEN);
va_start(args, format);
vsnprintf(ptr, LOG_NAME_LEN, format, args);
} }
// cleanup
va_end(args);
} }
void logger_set_prefix(const char *restrict prefix) { void logger_set_prefix(const char *restrict format, ...) {
va_list args;
if (key_prefix == -1) { if (key_prefix == -1) {
// not initialized // not initialized
strncpy(global_prefix, prefix, sizeof(global_prefix)); va_start(args, format);
vsnprintf(global_prefix, sizeof(global_prefix), format, args);
} else { } else {
int ret; int ret;
void *ptr = pthread_getspecific(key_prefix); void *ptr = pthread_getspecific(key_prefix);
@ -196,8 +207,12 @@ void logger_set_prefix(const char *restrict prefix) {
return; return;
} }
} }
strncpy(ptr, prefix, LOG_PREFIX_LEN); va_start(args, format);
vsnprintf(ptr, LOG_PREFIX_LEN, format, args);
} }
// cleanup
va_end(args);
} }
static void *logger_thread(void *arg) { static void *logger_thread(void *arg) {

View File

@ -29,9 +29,9 @@ typedef unsigned char log_lvl_t;
void logmsgf(log_lvl_t level, const char *restrict format, ...); void logmsgf(log_lvl_t level, const char *restrict format, ...);
void logger_set_name(const char *restrict name); void logger_set_name(const char *restrict format, ...);
void logger_set_prefix(const char *restrict prefix); void logger_set_prefix(const char *restrict format, ...);
int logger_init(void); int logger_init(void);

View File

@ -19,7 +19,7 @@ static mpmc_t mpmc_ctx;
static void tcp_acceptor_func(client_ctx_t *ctx); static void tcp_acceptor_func(client_ctx_t *ctx);
int tcp_acceptor_init(int n_workers, int buf_size) { int tcp_acceptor_init(int n_workers, int buf_size) {
return mpmc_init(&mpmc_ctx, n_workers, buf_size, (void (*)(void *)) tcp_acceptor_func, "tcp/a"); return mpmc_init(&mpmc_ctx, n_workers, buf_size, (void (*)(void *)) tcp_acceptor_func, "tcp_a");
} }
int tcp_accept(client_ctx_t *ctx) { int tcp_accept(client_ctx_t *ctx) {
@ -36,7 +36,6 @@ void tcp_acceptor_destroy(void) {
static void tcp_acceptor_func(client_ctx_t *ctx) { static void tcp_acceptor_func(client_ctx_t *ctx) {
struct sockaddr_in6 server_addr; struct sockaddr_in6 server_addr;
char log_client_prefix[256];
inet_ntop(ctx->socket.addr.ipv6.sin6_family, &ctx->socket.addr.ipv6.sin6_addr, ctx->_c_addr, sizeof(ctx->_c_addr)); inet_ntop(ctx->socket.addr.ipv6.sin6_family, &ctx->socket.addr.ipv6.sin6_addr, ctx->_c_addr, sizeof(ctx->_c_addr));
if (strncmp(ctx->_c_addr, "::ffff:", 7) == 0) { if (strncmp(ctx->_c_addr, "::ffff:", 7) == 0) {
@ -54,12 +53,11 @@ static void tcp_acceptor_func(client_ctx_t *ctx) {
ctx->s_addr = ctx->_s_addr; ctx->s_addr = ctx->_s_addr;
} }
sprintf(log_client_prefix, "[%s%4i%s]%s[%*s][%5i]%s", (int) ctx->socket.enc ? HTTPS_STR : HTTP_STR, sprintf(ctx->log_prefix, "[%s%4i%s]%s[%*s][%5i]%s", (int) ctx->socket.enc ? HTTPS_STR : HTTP_STR,
ntohs(server_addr.sin6_port), CLR_STR, /*color_table[0]*/ "", INET6_ADDRSTRLEN, ctx->addr, ntohs(server_addr.sin6_port), CLR_STR, /*color_table[0]*/ "", INET6_ADDRSTRLEN, ctx->addr,
ntohs(ctx->socket.addr.ipv6.sin6_port), CLR_STR); ntohs(ctx->socket.addr.ipv6.sin6_port), CLR_STR);
sprintf(ctx->log_prefix, "[%*s]%s", INET6_ADDRSTRLEN, ctx->s_addr, log_client_prefix); logger_set_prefix("[%*s]%s", INET6_ADDRSTRLEN, ctx->s_addr, ctx->log_prefix);
logger_set_prefix(ctx->log_prefix);
int ret; int ret;
char buf[1024]; char buf[1024];
@ -117,7 +115,7 @@ static void tcp_acceptor_func(client_ctx_t *ctx) {
client->_errno = errno; client->_errno = errno;
client->_ssl_error = ERR_get_error(); client->_ssl_error = ERR_get_error();
if (ret <= 0) { if (ret <= 0) {
error("Unable to perform handshake: %s", sock_strerror(client)); info("Unable to perform handshake: %s", sock_strerror(client));
tcp_close(ctx); tcp_close(ctx);
return; return;
} }

View File

@ -11,7 +11,7 @@ static mpmc_t mpmc_ctx;
static void tcp_closer_func(client_ctx_t *ctx); static void tcp_closer_func(client_ctx_t *ctx);
int tcp_closer_init(int n_workers, int buf_size) { int tcp_closer_init(int n_workers, int buf_size) {
return mpmc_init(&mpmc_ctx, n_workers, buf_size, (void (*)(void *)) tcp_closer_func, "tcp/c"); return mpmc_init(&mpmc_ctx, n_workers, buf_size, (void (*)(void *)) tcp_closer_func, "tcp_c");
} }
int tcp_close(client_ctx_t *ctx) { int tcp_close(client_ctx_t *ctx) {
@ -27,7 +27,7 @@ void tcp_closer_destroy(void) {
} }
static void tcp_closer_func(client_ctx_t *ctx) { static void tcp_closer_func(client_ctx_t *ctx) {
logger_set_prefix(ctx->log_prefix); logger_set_prefix("[%*s]%s", INET6_ADDRSTRLEN, ctx->s_addr, ctx->log_prefix);
sock_close(&ctx->socket); sock_close(&ctx->socket);