feat: added list

This commit is contained in:
KamilM1205 2026-04-05 00:43:41 +04:00
parent 23869d0e8f
commit 43a029fea2
4 changed files with 82 additions and 2 deletions

View file

@ -1,7 +1,74 @@
#include "http_server.h"
#include "thread_util.h"
#include <netinet/in.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
void worker() {
// TODO: wait for data in queue
// TODO: parse url in search route handler in hash table
}
static void prepare_workers(http_server_p server, http_server_config_t config) {
if (config.workers_count == 0) {
server->workers_count = get_core_count();
} else {
server->workers_count = config.workers_count;
}
server->workers = calloc(server->workers_count, sizeof(pthread_t));
for (size_t i = 0; i < server->workers_count; i++) {
pthread_create(&server->workers[i], NULL, (void *)&worker, NULL);
}
}
static int32_t initialize_socket(http_server_p server,
http_server_config_t *config) {
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(struct sockaddr_in));
if ((server->socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(config->port);
if (bind(server->socket_fd, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr_in)) < 0) {
return -1;
}
return 0;
}
http_server_p http_server_init(http_server_config_t config) {
http_server_p server;
struct sockaddr_in server_addr;
server = calloc(1, sizeof(http_server_t));
if (!initialize_socket(server, &config)) {
return NULL;
}
return server;
}
void http_server_stop(http_server_p server) {
// TODO: Make sure socket was properly closed before closing descriptor
for (size_t i = 0; i < server->workers_count; i++) {
pthread_cancel(server->workers[i]);
pthread_join(server->workers[i], NULL);
}
free(server->workers);
close(server->socket_fd);
free(server);
}

View file

@ -1,14 +1,24 @@
#ifndef HTTP_SERVER_H
#define HTTP_SERVER_H
#include "list.h"
#include <pthread.h>
#include <stddef.h>
#include <stdint.h>
typedef struct {
int32_t port;
uint16_t port;
size_t workers_count;
} http_server_config_t;
typedef struct {
int32_t socket_fd;
pthread_t *workers;
size_t workers_count;
// Requests queue
list_t queue_list;
pthread_mutex_t queue_mt;
} http_server_t, *http_server_p;
http_server_p http_server_init(http_server_config_t config);

View file

@ -92,6 +92,8 @@ void list_remove(list_t *list, size_t idx) {
}
}
size_t list_size(list_t *list) { return list->capacity; }
void list_deinit(list_t *list) {
free(list->data);
free(list);

View file

@ -25,6 +25,7 @@ void list_append(list_t *list, void *value);
void list_set(list_t *list, size_t idx, void *value);
void *list_get(list_t *list, size_t idx);
void list_remove(list_t *list, size_t idx);
size_t list_size(list_t *list);
void list_deinit(list_t *list);
#endif // !LIST_H