aboutsummaryrefslogtreecommitdiff
path: root/src/main.odin
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2022-01-22 18:59:40 +0100
committerDaniel Gavin <danielgavin5@hotmail.com>2022-01-22 18:59:40 +0100
commit165fdbc58c647f97dbdb3b5903b4826b022f02f9 (patch)
tree89ff1ff9ec88f0d0c615067b5b32fb97ed39342b /src/main.odin
parent989345d0438429ae719287f9c7343f87b558f7e3 (diff)
Move the std in reading to be async with it's own seperate thread.
Diffstat (limited to 'src/main.odin')
-rw-r--r--src/main.odin47
1 files changed, 19 insertions, 28 deletions
diff --git a/src/main.odin b/src/main.odin
index 6ac8f2e..7966c1f 100644
--- a/src/main.odin
+++ b/src/main.odin
@@ -10,6 +10,7 @@ import "core:strconv"
import "core:thread"
import "core:encoding/json"
import "core:reflect"
+import "core:sync"
import "core:intrinsics"
@@ -17,8 +18,6 @@ import "shared:index"
import "shared:server"
import "shared:common"
-
-
os_read :: proc(handle: rawptr, data: []byte) -> (int, int) {
ptr := cast(^os.Handle)handle;
a, b := os.read(ptr^, data);
@@ -36,6 +35,7 @@ os_write :: proc(handle: rawptr, data: []byte) -> (int, int) {
verbose_logger: log.Logger;
file_logger: log.Logger;
file_logger_init: bool;
+request_thread: ^thread.Thread;
run :: proc(reader: ^server.Reader, writer: ^server.Writer) {
common.config.collections = make(map[string]string);
@@ -44,8 +44,23 @@ run :: proc(reader: ^server.Reader, writer: ^server.Writer) {
common.config.running = true;
- for common.config.running {
+ request_thread_data := server.RequestThreadData {
+ reader = reader,
+ writer = writer,
+ };
+
+ sync.mutex_init(&server.requests_mutex);
+ sync.semaphore_init(&server.requests_sempahore);
+
+ server.requests = make([dynamic]server.Request, context.allocator);
+ server.notifications = make([dynamic]server.RequestNotification, context.allocator);
+ server.deletings = make([dynamic]server.Request, context.allocator);
+
+
+ request_thread = thread.create_and_start_with_data(cast(rawptr)&request_thread_data, server.thread_request_main);
+
+ for common.config.running {
if common.config.file_log {
if !file_logger_init {
if fh, err := os.open("log.txt"); err == 0 {
@@ -58,32 +73,8 @@ run :: proc(reader: ^server.Reader, writer: ^server.Writer) {
} else {
context.logger = log.Logger {nil, nil, log.Level.Debug, nil};
}
- a: int;
- b: int;
-
- header, success := server.read_and_parse_header(reader);
-
- if (!success) {
- log.error("Failed to read and parse header");
- return;
- }
-
- value: json.Value;
- value, success = server.read_and_parse_body(reader, header);
-
- if (!success) {
- log.error("Failed to read and parse body");
- return;
- }
-
- success = server.handle_request(value, &common.config, writer);
-
- if (!success) {
- log.error("Unrecoverable handle request");
- return;
- }
- free_all(context.temp_allocator);
+ server.consume_requests(&common.config, writer);
}
for k, v in common.config.collections {