summaryrefslogtreecommitdiff
path: root/include/ipc/engine_message.h
blob: a651bc22bdfa4d07bcec5cd8c0aa1cf9055c1b7e (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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