diff options
| author | Aargh Rai <aargh.rai+git@gmail.com> | 2026-07-24 09:32:54 +0530 |
|---|---|---|
| committer | Aargh Rai <aargh.rai+git@gmail.com> | 2026-07-24 09:32:54 +0530 |
| commit | 7d36403836511ab0745791ce98498cf5112633c1 (patch) | |
| tree | bb1f998e3ce8fc99a8611dc64d578ca269c56b01 | |
| parent | e6cead853d66b4ea9ea8d9c6dba33e5a1720a99d (diff) | |
| -rw-r--r-- | include/ipc/engine_message.h | 1 | ||||
| -rw-r--r-- | include/ipc/state.h | 1 | ||||
| -rw-r--r-- | src/ipc/engine_message.c | 15 | ||||
| -rw-r--r-- | src/main.c | 17 | ||||
| -rw-r--r-- | src/uci.c | 5 | ||||
| -rw-r--r-- | tests/main.c | 1 |
6 files changed, 36 insertions, 4 deletions
diff --git a/include/ipc/engine_message.h b/include/ipc/engine_message.h index a651bc2..2c1871b 100644 --- a/include/ipc/engine_message.h +++ b/include/ipc/engine_message.h @@ -45,6 +45,7 @@ typedef struct { } engine_messages_t; void engine_message_handler_init(engine_message_handler_t *handle); +void engine_message_handler_deinit(engine_message_handler_t *handle); void engine_message_handler_acquire(engine_message_handler_t *handle); void engine_message_handler_release(engine_message_handler_t *handle); bool engine_message_handler_can_pop(engine_message_handler_t *handle); diff --git a/include/ipc/state.h b/include/ipc/state.h index 6a4455d..fc12234 100644 --- a/include/ipc/state.h +++ b/include/ipc/state.h @@ -10,6 +10,7 @@ enum { EVENT_INIT, + EVENT_QUIT, EVENT_STATE_INITIALISED, EVENT_UCI_STATE_INITIALISED, EVENT_UCI_RUNNING, diff --git a/src/ipc/engine_message.c b/src/ipc/engine_message.c index 76814f4..c54a02e 100644 --- a/src/ipc/engine_message.c +++ b/src/ipc/engine_message.c @@ -16,6 +16,17 @@ void engine_message_handler_init(engine_message_handler_t *handle) { handle->popped_count = 0; } +void engine_message_handler_deinit(engine_message_handler_t *handle) { + engine_message_t *next, *message = handle->oldest_valid; + + int count = handle->count; + while (count-- > 0) { + next = message->next; + engine_message_deinit(message); + message = next; + } +} + void engine_message_handler_acquire(engine_message_handler_t *handle) { while (atomic_flag_test_and_set(&handler_busy)); } @@ -111,6 +122,10 @@ bool engine_message_is_ready(engine_message_t *message) { void engine_messages_deinit(engine_messages_t *messages) { assert(messages != NULL); + for (int i = 0; i < 10; i++) { + engine_message_handler_deinit(messages->data[i]); + free(messages->data[i]); + } free(messages->data); } @@ -8,6 +8,7 @@ #include "ipc/state.h" #include "ipc/threads.h" #include "ipc/uci.h" +#include "engine/ttable.h" #include "engine/magic.h" void *uci_thread_func(void* data) { @@ -17,6 +18,7 @@ void *uci_thread_func(void* data) { int main(int argc, char** argv) { magic_init(); + zobrist_init(); ipc_state_t ipc_state; ipc_state_init(&ipc_state); @@ -33,21 +35,29 @@ int main(int argc, char** argv) { waiting_for_go: engine_messages_refresh(&ipc_state.engine_messages); skip_refresh: - ipc_state_wait_for_event(&ipc_state, EVENT_ENGINE_GO); + bool is_stop, quit; + while ( + !ipc_state_is_event(&ipc_state, EVENT_ENGINE_GO) && + !(quit = ipc_state_is_event(&ipc_state, EVENT_QUIT)) + ); + if (quit) goto quit; engine_threads.running_count = ipc_state.uci_state.threads; ipc_state.engine_messages.count = ipc_state.uci_state.threads; - threads_reserve(&engine_threads, ipc_state.uci_state.threads); + threads_reserve(&engine_threads, engine_threads.running_count); threads_go(&engine_threads); ipc_state_set_event(&ipc_state, EVENT_UCI_RUNNING); - bool is_stop; while (1) { while ( !ipc_state_is_event(&ipc_state, EVENT_ENGINE_RUNNING) && + !(quit = ipc_state_is_event(&ipc_state, EVENT_QUIT)) && !(is_stop = ipc_state_is_event(&ipc_state, EVENT_ENGINE_STOP)) ); + if (quit) { + break; + } if (is_stop) { threads_cleanup(&engine_threads); ipc_state_set_event(&ipc_state, EVENT_UCI_RUNNING); @@ -57,6 +67,7 @@ skip_refresh: ipc_state_set_event(&ipc_state, EVENT_UCI_RUNNING); } +quit: ipc_state_deinit(&ipc_state); pthread_cancel(uci_thread); threads_deinit(&engine_threads); @@ -59,6 +59,7 @@ void handle_ipc(ipc_state_t *state) { assert(signal < UCI_SIGNAL_COUNT); if (signal == UCI_SIGNAL_NONE) return; if (signal == UCI_SIGNAL_QUIT) { + ipc_state_set_event(state, EVENT_QUIT); return; } if (signal == UCI_SIGNAL_GO) { @@ -151,7 +152,9 @@ void handle_ipc(ipc_state_t *state) { return; } if (signal == UCI_SIGNAL_STOP) { - printf("uci stopping\n"); + ipc_state_set_event(state, EVENT_ENGINE_STOP); + state->uci_state.signal = UCI_SIGNAL_NONE; + state->uci_state.current_state = UCI_STATE_IDLE; return; } } diff --git a/tests/main.c b/tests/main.c index 4ab84c6..ff27e1f 100644 --- a/tests/main.c +++ b/tests/main.c @@ -15,6 +15,7 @@ double diff_time(struct timespec a, struct timespec b) { int main() { magic_init(); + zobrist_init(); int i = 0; int return_type = 0; while (i < total_test_count) { |
