diff --git a/core/src/http_server.c b/core/src/http_server.c index 75d76ab..effc413 100644 --- a/core/src/http_server.c +++ b/core/src/http_server.c @@ -1,7 +1,74 @@ #include "http_server.h" +#include "thread_util.h" +#include +#include +#include +#include #include +#include + +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); } diff --git a/core/src/http_server.h b/core/src/http_server.h index b61f07e..e3b4628 100644 --- a/core/src/http_server.h +++ b/core/src/http_server.h @@ -1,14 +1,24 @@ #ifndef HTTP_SERVER_H #define HTTP_SERVER_H +#include "list.h" +#include +#include #include 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); diff --git a/core/src/list.c b/core/src/list.c index dcf9430..8c91efa 100644 --- a/core/src/list.c +++ b/core/src/list.c @@ -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); diff --git a/core/src/list.h b/core/src/list.h index 7ffcf34..22b82c1 100644 --- a/core/src/list.h +++ b/core/src/list.h @@ -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