Compare commits
No commits in common. "43a029fea2df2fc7283d1df3c87f9052b5f14850" and "49799466a176c4a06ff8fdb87ee1617538b692b7" have entirely different histories.
43a029fea2
...
49799466a1
5 changed files with 2 additions and 211 deletions
|
|
@ -1,5 +1,4 @@
|
|||
set(CORE_SRC
|
||||
list.c
|
||||
log.c
|
||||
hash_table.c
|
||||
http_server.c
|
||||
|
|
|
|||
|
|
@ -1,74 +1,7 @@
|
|||
#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;
|
||||
|
||||
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);
|
||||
struct sockaddr_in server_addr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,14 @@
|
|||
#ifndef HTTP_SERVER_H
|
||||
#define HTTP_SERVER_H
|
||||
|
||||
#include "list.h"
|
||||
#include <pthread.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct {
|
||||
uint16_t port;
|
||||
size_t workers_count;
|
||||
int32_t port;
|
||||
} 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);
|
||||
|
|
|
|||
100
core/src/list.c
100
core/src/list.c
|
|
@ -1,100 +0,0 @@
|
|||
#include "list.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
list_t *list_init(size_t type_size, size_t capacity) {
|
||||
list_t *list;
|
||||
|
||||
list = calloc(1, sizeof(list_t));
|
||||
if (!list) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
list->real_capacity = capacity * 2;
|
||||
|
||||
list->data = calloc(1, sizeof(type_size * list->real_capacity));
|
||||
if (!list) {
|
||||
free(list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
list->capacity = capacity;
|
||||
list->type_size = type_size;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
list_error_e list_get_last_error(list_t *list) {
|
||||
list_error_e error = list->error;
|
||||
|
||||
list->error = LIST_NONE;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
void list_resize(list_t *list, size_t new_capacity) {
|
||||
void *new_data = calloc(new_capacity * 2, list->type_size);
|
||||
|
||||
if (!new_data) {
|
||||
list->error = LIST_MEM;
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(new_data, list->data, list->type_size * list->capacity);
|
||||
free(list->data);
|
||||
list->data = new_data;
|
||||
}
|
||||
|
||||
void list_append(list_t *list, void *value) {
|
||||
if (list->capacity + 1 > list->real_capacity) {
|
||||
list_resize(list, list->real_capacity * 2);
|
||||
}
|
||||
|
||||
list->capacity++;
|
||||
list_set(list, list->capacity, value);
|
||||
}
|
||||
|
||||
void list_set(list_t *list, size_t idx, void *value) {
|
||||
if (idx > list->capacity) {
|
||||
list->error = LIST_OOR;
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(list->data + (idx * list->type_size), value, list->type_size);
|
||||
}
|
||||
|
||||
void *list_get(list_t *list, size_t idx) {
|
||||
if (idx <= list->capacity) {
|
||||
return &list->data[idx];
|
||||
}
|
||||
|
||||
list->error = LIST_OOR;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void list_remove(list_t *list, size_t idx) {
|
||||
if (idx > list->capacity) {
|
||||
list->error = LIST_OOR;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (idx == list->capacity) {
|
||||
list->capacity -= 1;
|
||||
}
|
||||
|
||||
if (idx < list->capacity) {
|
||||
memcpy(list->data + (idx * list->type_size),
|
||||
list->data + ((idx + 1) * list->type_size),
|
||||
(list->capacity - idx) * list->type_size);
|
||||
}
|
||||
}
|
||||
|
||||
size_t list_size(list_t *list) { return list->capacity; }
|
||||
|
||||
void list_deinit(list_t *list) {
|
||||
free(list->data);
|
||||
free(list);
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
#ifndef LIST_H
|
||||
#define LIST_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef enum {
|
||||
LIST_NONE = 0,
|
||||
LIST_MEM,
|
||||
LIST_OOR, // Out of range
|
||||
} list_error_e;
|
||||
|
||||
typedef struct {
|
||||
void *data;
|
||||
size_t type_size;
|
||||
size_t capacity;
|
||||
size_t real_capacity;
|
||||
|
||||
list_error_e error;
|
||||
} list_t;
|
||||
|
||||
list_t *list_init(size_t type_size, size_t capacity);
|
||||
list_error_e list_get_last_error(list_t *list);
|
||||
void list_resize(list_t *list, size_t new_capacity);
|
||||
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