pachi_py/pachi/distributed/protocol.h (57 lines of code) (raw):
#ifndef PACHI_DISTRIBUTED_PROTOCOL_H
#define PACHI_DISTRIBUTED_PROTOCOL_H
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif
#include "board.h"
/* Each slave thread maintains a ring of 256 buffers holding
* incremental stats received from the slave. The oldest
* buffer is recycled to hold stats sent to the slave and
* received the next reply. */
#define BUFFERS_PER_SLAVE_BITS 8
#define BUFFERS_PER_SLAVE (1 << BUFFERS_PER_SLAVE_BITS)
struct slave_state;
typedef void (*buffer_hook)(void *buf, int size);
typedef void (*state_alloc_hook)(struct slave_state *sstate);
typedef int (*getargs_hook)(void *buf, struct slave_state *sstate, int cmd_id);
struct buf_state {
void *buf;
/* All buffers have the same physical size. size is the
* number of valid bytes. It is set only when the buffer
* is actually in the receive queueue. */
int size;
int queue_index;
int owner;
};
struct slave_state {
int max_buf_size;
int thread_id;
struct in_addr client; // for debugging only
state_alloc_hook alloc_hook;
buffer_hook insert_hook;
getargs_hook args_hook;
/* Index in received_queue of most recent processed
* buffer, -1 if none processed yet. */
int last_processed;
/* --- PRIVATE DATA for protocol.c --- */
struct buf_state b[BUFFERS_PER_SLAVE];
int newest_buf;
int slave_sock;
/* --- PRIVATE DATA for merge.c --- */
/* Hash table of incremental stats. */
struct incr_stats *stats_htable;
int stats_hbits;
int stats_id;
/* Hash indices updated by stats merge. */
int *merged;
int max_merged_nodes;
};
extern struct slave_state default_sstate;
void protocol_lock(void);
void protocol_unlock(void);
void logline(struct in_addr *client, char *prefix, char *s);
void clear_receive_queue(void);
void update_cmd(struct board *b, char *cmd, char *args, bool new_id);
void new_cmd(struct board *b, char *cmd, char *args);
void get_replies(double time_limit, int min_replies);
void protocol_init(char *slave_port, char *proxy_port, int max_slaves);
extern int reply_count;
extern char **gtp_replies;
extern int active_slaves;
/* All binary buffers received from all slaves in current move are in
* receive_queue[0..queue_length-1] */
extern struct buf_state **receive_queue;
extern int queue_length;
/* Queue age is incremented each time the queue is emptied. */
extern int queue_age;
/* Max size of all gtp commands for one game.
* 60 chars for the first line of genmoves plus 100 lines
* of 30 chars each for the stats at last move. */
#define CMDS_SIZE (60*MAX_GAMELEN + 30*100)
/* Max size for one line of reply or slave log. */
#define BSIZE 4096
#endif