main.c (4204B)
1 #include "hex_server.h" 2 3 struct opts opts = { 4 .board_size = 11, 5 .game_secs = 300, 6 .agent_threads = 4, 7 .agent_mem_mib= 1024, 8 }; 9 10 static char const *optstr = "hva:A:b:B:d:s:t:m:"; 11 12 static void 13 usage(int argc, char **argv) 14 { 15 (void) argc; 16 17 fprintf(stderr, "Usage: %s [-hv] -a <agent1> -A <agent1-uid> -b <agent2> -B <agent2-uid>\n", argv[0]); 18 fprintf(stderr, "\n"); 19 fprintf(stderr, "\t-h :\n\t\tdisplays this help information\n"); 20 fprintf(stderr, "\t-v :\n\t\tenabled verbose logging\n"); 21 fprintf(stderr, "\t-a :\n\t\tthe command for the first agent (required)\n"); 22 fprintf(stderr, "\t-A :\n\t\tthe uid for the first agent (required)\n"); 23 fprintf(stderr, "\t-b :\n\t\tthe command for the second agent (required)\n"); 24 fprintf(stderr, "\t-B :\n\t\tthe uid for the second agent (required)\n"); 25 fprintf(stderr, "\t-d :\n\t\tthe dimensions for the game board (default: 11)\n"); 26 fprintf(stderr, "\t-s :\n\t\tthe game timer, in seconds (default: 300 secs)\n"); 27 fprintf(stderr, "\t-t :\n\t\tthe per-agent hard thread limit (default: 4 threads)\n"); 28 fprintf(stderr, "\t-m :\n\t\tthe per-agent hard memory limit, in MiB (default: 1024 MiB)\n"); 29 fprintf(stderr, "\n"); 30 } 31 32 static bool 33 parse_args(int argc, char **argv) 34 { 35 int opt; 36 while ((opt = getopt(argc, argv, optstr)) != -1) { 37 switch (opt) { 38 case 'v': 39 opts.verbose = true; 40 break; 41 42 case 'a': 43 opts.agent_1 = optarg; 44 break; 45 46 case 'A': 47 if (!(opts.agent_1_uid = strtoul(optarg, NULL, 0))) 48 return false; 49 break; 50 51 case 'b': 52 opts.agent_2 = optarg; 53 break; 54 55 case 'B': 56 if (!(opts.agent_2_uid = strtoul(optarg, NULL, 0))) 57 return false; 58 break; 59 60 case 'd': 61 if (!(opts.board_size = strtoull(optarg, NULL, 0))) 62 return false; 63 break; 64 65 case 's': 66 if (!(opts.game_secs = strtoull(optarg, NULL, 0))) 67 return false; 68 break; 69 70 case 't': 71 if (!(opts.agent_threads = strtoull(optarg, NULL, 0))) 72 return false; 73 break; 74 75 case 'm': 76 if (!(opts.agent_mem_mib = strtoull(optarg, NULL, 0))) 77 return false; 78 break; 79 80 default: 81 return false; 82 } 83 } 84 85 if (!opts.agent_1 || !opts.agent_1_uid || !opts.agent_2 || !opts.agent_2_uid) 86 return false; 87 88 return true; 89 } 90 91 int 92 main(int argc, char **argv) 93 { 94 if (!parse_args(argc, argv)) { 95 usage(argc, argv); 96 exit(EXIT_FAILURE); 97 } 98 99 struct board_state *board = board_alloc(opts.board_size); 100 if (!board) { 101 errlog("Failed to allocate board of size %" PRIu32 "\n", opts.board_size); 102 exit(EXIT_FAILURE); 103 } 104 105 struct server_state state = { 106 .black_agent = { 107 .player = HEX_PLAYER_BLACK, 108 .agent = opts.agent_1, 109 .agent_uid = opts.agent_1_uid, 110 .logfile = HEX_AGENT_LOGFILE_TEMPLATE, 111 .timer = { .tv_sec = opts.game_secs, .tv_nsec = 0, }, 112 .sock_addrlen = sizeof(struct sockaddr_storage), 113 }, 114 .white_agent = { 115 .player = HEX_PLAYER_WHITE, 116 .agent = opts.agent_2, 117 .agent_uid = opts.agent_2_uid, 118 .logfile = HEX_AGENT_LOGFILE_TEMPLATE, 119 .timer = { .tv_sec = opts.game_secs, .tv_nsec = 0, }, 120 .sock_addrlen = sizeof(struct sockaddr_storage), 121 }, 122 .board = board, 123 }; 124 125 if (!server_init(&state)) { 126 errlog("Failed to initialise server state\n"); 127 exit(EXIT_FAILURE); 128 } 129 130 if (!server_spawn_agent(&state, &state.black_agent)) { 131 errlog("Failed to spawn black user agent: %s\n", state.black_agent.agent); 132 exit(EXIT_FAILURE); 133 } 134 135 if (!server_spawn_agent(&state, &state.white_agent)) { 136 errlog("Failed to spawn white user agent: %s\n", state.white_agent.agent); 137 exit(EXIT_FAILURE); 138 } 139 140 struct statistics stats; 141 server_run(&state, &stats); 142 143 server_wait_all_agents(&state); 144 145 server_free(&state); 146 147 board_free(board); 148 149 fprintf(stdout, "agent_1,agent_1_won,agent_1_rounds,agent_1_secs,agent_1_err,agent_1_logfile,agent_2,agent_2_won,agent_2_rounds,agent_2_secs,agent_2_err,agent_2_logfile,\n"); 150 fprintf(stdout, 151 "%s,%i,%u,%f,%s,%s,%s,%i,%u,%f,%s,%s,\n", 152 stats.agent_1, stats.agent_1_won, stats.agent_1_rounds, stats.agent_1_secs, hexerrorstr(stats.agent_1_err), state.black_agent.logfile, 153 stats.agent_2, stats.agent_2_won, stats.agent_2_rounds, stats.agent_2_secs, hexerrorstr(stats.agent_2_err), state.white_agent.logfile); 154 155 exit(EXIT_SUCCESS); 156 } 157 158 #include "server.c" 159 #include "board.c" 160 #include "utils.c"