diff --git a/src/syzygy/tbcore.cpp b/src/syzygy/tbcore.cpp index 888f41c4..3d24e064 100644 --- a/src/syzygy/tbcore.cpp +++ b/src/syzygy/tbcore.cpp @@ -7,6 +7,7 @@ a particular engine, provided the engine is written in C or C++. */ +#include // For std::memset #include #include #include @@ -41,8 +42,6 @@ static TBHashEntry TB_hash[1 << TBHASHBITS][HSHMAX]; static DTZTableEntry DTZ_table[DTZ_ENTRIES]; static uint64_t calc_key_from_pcs(int *pcs, bool mirror); -static void free_wdl_entry(TBEntry *entry); -static void free_dtz_entry(TBEntry *entry); static FD open_tb(const std::string& str, const std::string& suffix) { @@ -470,17 +469,57 @@ static int binomial[5][64]; static int pawnidx[5][24]; static int pfactor[5][4]; +void free_wdl_entry(TBEntry_piece* entry) +{ + unmap_file(entry->data, entry->mapping); + + free(entry->precomp[0]); + free(entry->precomp[1]); +} + +void free_wdl_entry(TBEntry_pawn* entry) +{ + unmap_file(entry->data, entry->mapping); + + for (int f = 0; f < 4; f++) + { + free(entry->file[f].precomp[0]); + free(entry->file[f].precomp[1]); + } +} + +void free_dtz_entry(TBEntry* entry) +{ + unmap_file(entry->data, entry->mapping); + + if (!entry->has_pawns) + free(((DTZEntry_piece*)entry)->precomp); + else + for (int f = 0; f < 4; f++) + free(((DTZEntry_pawn*)entry)->file[f].precomp); + + free(entry); +} + void Tablebases::init(const std::string& path) { for (int i = 0; i < TBnum_piece; i++) - free_wdl_entry((TBEntry*)&TB_piece[i]); + free_wdl_entry(&TB_piece[i]); for (int i = 0; i < TBnum_pawn; i++) - free_wdl_entry((TBEntry*)&TB_pawn[i]); + free_wdl_entry(&TB_pawn[i]); for (int i = 0; i < DTZ_ENTRIES; i++) if (DTZ_table[i].entry) + { free_dtz_entry(DTZ_table[i].entry); + DTZ_table[i].entry = nullptr; + } + + TBnum_piece = TBnum_pawn = 0; + MaxCardinality = 0; + + std::memset(TB_hash, 0, sizeof(TB_hash)); if (path.empty() || path == "") return; @@ -522,18 +561,6 @@ void Tablebases::init(const std::string& path) while (std::getline(ss, token, SEP_CHAR)) paths.push_back(token); - TBnum_piece = TBnum_pawn = 0; - MaxCardinality = 0; - - for (int i = 0; i < (1 << TBHASHBITS); i++) - for (int j = 0; j < HSHMAX; j++) { - TB_hash[i][j].key = 0; - TB_hash[i][j].ptr = nullptr; - } - - for (int i = 0; i < DTZ_ENTRIES; i++) - DTZ_table[i].entry = nullptr; - const std::string K("K"); for (PieceType p1 = PAWN; p1 < KING; ++p1) @@ -1405,47 +1432,6 @@ void load_dtz_table(const std::string& str, uint64_t key1, uint64_t key2) DTZ_table[0].entry = ptr3; } -static void free_wdl_entry(TBEntry *entry) -{ - unmap_file(entry->data, entry->mapping); - - if (!entry->has_pawns) { - TBEntry_piece *ptr = (TBEntry_piece *)entry; - free(ptr->precomp[0]); - - if (ptr->precomp[1]) - free(ptr->precomp[1]); - } else { - TBEntry_pawn *ptr = (TBEntry_pawn *)entry; - int f; - - for (f = 0; f < 4; f++) { - free(ptr->file[f].precomp[0]); - - if (ptr->file[f].precomp[1]) - free(ptr->file[f].precomp[1]); - } - } -} - -static void free_dtz_entry(TBEntry *entry) -{ - unmap_file(entry->data, entry->mapping); - - if (!entry->has_pawns) { - DTZEntry_piece *ptr = (DTZEntry_piece *)entry; - free(ptr->precomp); - } else { - DTZEntry_pawn *ptr = (DTZEntry_pawn *)entry; - int f; - - for (f = 0; f < 4; f++) - free(ptr->file[f].precomp); - } - - free(entry); -} - static int wdl_to_map[5] = { 1, 3, 0, 2, 0 }; static uint8_t pa_flags[5] = { 8, 0, 0, 0, 4 }; diff --git a/src/syzygy/tbcore.h b/src/syzygy/tbcore.h index db80f9fc..adbb622e 100644 --- a/src/syzygy/tbcore.h +++ b/src/syzygy/tbcore.h @@ -66,11 +66,7 @@ struct TBEntry { uint8_t num; uint8_t symmetric; uint8_t has_pawns; -} -#ifndef _WIN32 -__attribute__((__may_alias__)) -#endif -; +}; struct TBEntry_piece { char *data;