feat: added list
This commit is contained in:
parent
23869d0e8f
commit
43a029fea2
4 changed files with 82 additions and 2 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue