summaryrefslogtreecommitdiff
path: root/src/ipc/state.c
blob: 02ba38bd74f0f958654024ef0798755af490d598 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <string.h>
#include <assert.h>

#define IPC_INTERNAL
#include "ipc/state.h"

void ipc_state_init(ipc_state_t *state) {
  // done by main.c in the loop
  // engine_messages_init(&state->engine_messages);
  uci_state_init(&state->uci_state);
  state->from_position = (position_t) {0};
  ipc_moves_init(&state->moves);
  state->uci_state.moves = &state->moves;
  atomic_init(&state->event, EVENT_INIT);
}

void ipc_state_deinit(ipc_state_t *state) {
  engine_messages_deinit(&state->engine_messages);
  uci_state_deinit(&state->uci_state);
  ipc_moves_deinit(&state->moves);
}

void ipc_state_game_reset(ipc_state_t *state) {
  state->from_position = (position_t) {0};
  state->moves.count = 0;
}

void ipc_state_wait_for_event(ipc_state_t *state, size_t event) {
  assert(event < EVENTS_COUNT);
  while (!ipc_state_is_event(state, event));
}

bool ipc_state_is_event(ipc_state_t *state, size_t event) {
  assert(event < EVENTS_COUNT);
  return atomic_load(&state->event) == event;
}

void ipc_state_set_event(ipc_state_t *state, size_t event) {
  assert(event < EVENTS_COUNT);
  atomic_store(&state->event, event);
}