diff options
Diffstat (limited to 'include/ipc')
| -rw-r--r-- | include/ipc/engine_message.h | 67 | ||||
| -rw-r--r-- | include/ipc/go_args.h | 25 | ||||
| -rw-r--r-- | include/ipc/moves.h | 19 | ||||
| -rw-r--r-- | include/ipc/state.h | 42 | ||||
| -rw-r--r-- | include/ipc/threads.h | 9 | ||||
| -rw-r--r-- | include/ipc/uci.h | 9 |
6 files changed, 171 insertions, 0 deletions
diff --git a/include/ipc/engine_message.h b/include/ipc/engine_message.h new file mode 100644 index 0000000..a651bc2 --- /dev/null +++ b/include/ipc/engine_message.h @@ -0,0 +1,67 @@ +#ifndef ENGINE_MESSAGE_H +#define ENGINE_MESSAGE_H + +#include "ipc/moves.h" +#include <stdatomic.h> + +typedef struct engine_message { + atomic_int ready; + + int depth; + int seldepth; + int multipv; + int score_cp; + int nodes; + int nps; + int hashfull; + int tbhits; + int time; + + int mate; + bool node_limit; + ipc_moves_t pv; + + ipc_move_t best_move; + ipc_move_t ponder; + + struct engine_message *next; +} engine_message_t; + +typedef struct { + engine_message_t *oldest_valid; + engine_message_t *newest_valid; + int count; + + // mainly for debugging purposes + int popped_count; + int pushed_count; + +} engine_message_handler_t; + +typedef struct { + engine_message_handler_t **data; + int count; + int capacity; +} engine_messages_t; + +void engine_message_handler_init(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); +engine_message_t *engine_message_handler_pop( + engine_message_handler_t *handle +); +engine_message_t *engine_message_handler_push( + engine_message_handler_t *handle +); + +void engine_messages_init(engine_messages_t *messages); +void engine_messages_deinit(engine_messages_t *messages); + +void engine_message_init(engine_message_t *message); +void engine_messages_refresh(engine_messages_t *messages); +void engine_message_mark_ready(engine_message_t *message); +bool engine_message_is_ready(engine_message_t *message); +void engine_message_deinit(engine_message_t *message); + +#endif // ENGINE_MESSAGE_H diff --git a/include/ipc/go_args.h b/include/ipc/go_args.h new file mode 100644 index 0000000..7121255 --- /dev/null +++ b/include/ipc/go_args.h @@ -0,0 +1,25 @@ +#ifndef GO_ARGS_H +#define GO_ARGS_H + +#include "ipc/moves.h" +#include "ipc/engine_message.h" + +typedef struct { + ipc_moves_t searchmoves; + bool ponder; + int wtime; + int btime; + int winc; + int binc; + int movestogo; + int depth; + int nodes; + int mate; + int movetime; + bool infinite; + int perft; +} go_args_t; + +bool should_continue(engine_message_t *message, go_args_t *go); + +#endif // GO_ARGS_H diff --git a/include/ipc/moves.h b/include/ipc/moves.h new file mode 100644 index 0000000..f08c424 --- /dev/null +++ b/include/ipc/moves.h @@ -0,0 +1,19 @@ +#ifndef IPC_MOVES_H +#define IPC_MOVES_H + +typedef struct { + int from; + int to; +} ipc_move_t; + +typedef struct { + ipc_move_t *data; + int count; + int capacity; +} ipc_moves_t; + +void ipc_moves_init(ipc_moves_t *moves); +void ipc_moves_deinit(ipc_moves_t *moves); +void add_ipc_move(ipc_moves_t *moves, ipc_move_t move); + +#endif // IPC_MOVES_H diff --git a/include/ipc/state.h b/include/ipc/state.h new file mode 100644 index 0000000..6a4455d --- /dev/null +++ b/include/ipc/state.h @@ -0,0 +1,42 @@ +#ifndef IPC_STATE_H +#define IPC_STATE_H + +#include <stdatomic.h> + +#include "bitboard.h" +#include "ipc/moves.h" +#include "ipc/engine_message.h" +#include "uci/state.h" + +enum { + EVENT_INIT, + EVENT_STATE_INITIALISED, + EVENT_UCI_STATE_INITIALISED, + EVENT_UCI_RUNNING, + EVENT_UCI_STOP, + EVENT_UCI_QUIT, + EVENT_ENGINE_GO, + EVENT_ENGINE_RUNNING, + EVENT_ENGINE_STOP, + + EVENTS_COUNT +}; +typedef struct { + atomic_int event; + + engine_messages_t engine_messages; + uci_state_t uci_state; + + // reset on new game + position_t from_position; + ipc_moves_t moves; +} ipc_state_t; + +void ipc_state_init(ipc_state_t *state); +void ipc_state_deinit(ipc_state_t *state); +void ipc_state_game_reset(ipc_state_t *state); +void ipc_state_wait_for_event(ipc_state_t *state, size_t event); +bool ipc_state_is_event(ipc_state_t *state, size_t event); +void ipc_state_set_event(ipc_state_t *state, size_t event); + +#endif // IPC_STATE_H diff --git a/include/ipc/threads.h b/include/ipc/threads.h new file mode 100644 index 0000000..2d76459 --- /dev/null +++ b/include/ipc/threads.h @@ -0,0 +1,9 @@ +#ifndef IPC_THREADS +#define IPC_THREADS + +#include "engine/threads.h" +#include "ipc/state.h" + +void threads_link(struct threads *handler, ipc_state_t *ipc_state); + +#endif // IPC_THREADS diff --git a/include/ipc/uci.h b/include/ipc/uci.h new file mode 100644 index 0000000..cbe98f2 --- /dev/null +++ b/include/ipc/uci.h @@ -0,0 +1,9 @@ +#ifndef UCI_H +#define UCI_H + +#include "ipc/state.h" + +void *uci(ipc_state_t *state); +void handle_ipc(ipc_state_t *state); + +#endif // UCI_H |
