From 5e520d57f6b2823797f58f0eb23385d673b0ac0c Mon Sep 17 00:00:00 2001 From: DcruBro Date: Fri, 15 May 2026 13:17:24 +0200 Subject: [PATCH] thread blocking DAG alloc fix --- src/balance_sheet.c | 34 ++++++++++++++++++++-------------- src/main.c | 9 +++++---- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/balance_sheet.c b/src/balance_sheet.c index 6eb724d..870a284 100644 --- a/src/balance_sheet.c +++ b/src/balance_sheet.c @@ -4,6 +4,24 @@ khash_t(balance_sheet_map_m)* sheetMap = NULL; static pthread_mutex_t g_sheetLock; +static int BalanceSheet_InsertLocked(balance_sheet_entry_t entry) { + if (!sheetMap) { + return -1; + } + + key32_t key; + memcpy(key.bytes, entry.address, 32); + + int ret = 0; + khiter_t k = kh_put(balance_sheet_map_m, sheetMap, key, &ret); + if (k == kh_end(sheetMap)) { + return -1; + } + + kh_value(sheetMap, k) = entry; + return ret; +} + void BalanceSheet_Init() { sheetMap = kh_init(balance_sheet_map_m); pthread_mutex_init(&g_sheetLock, NULL); @@ -13,19 +31,7 @@ int BalanceSheet_Insert(balance_sheet_entry_t entry) { if (!sheetMap) { return -1; } pthread_mutex_lock(&g_sheetLock); - - // Encapsulate key - key32_t key; - memcpy(key.bytes, entry.address, 32); - - int ret; - khiter_t k = kh_put(balance_sheet_map_m, sheetMap, key, &ret); - if (k == kh_end(sheetMap)) { - return -1; - } - - kh_value(sheetMap, k) = entry; - + int ret = BalanceSheet_InsertLocked(entry); pthread_mutex_unlock(&g_sheetLock); return ret; } @@ -94,7 +100,7 @@ bool BalanceSheet_LoadFromFile(const char* inPath) { balance_sheet_entry_t entry; while (fread(&entry, sizeof(balance_sheet_entry_t), 1, file) == 1) { - if (BalanceSheet_Insert(entry) < 0) { + if (BalanceSheet_InsertLocked(entry) < 0) { fclose(file); pthread_mutex_unlock(&g_sheetLock); return false; diff --git a/src/main.c b/src/main.c index 0a097a4..fdc6c9f 100644 --- a/src/main.c +++ b/src/main.c @@ -512,6 +512,10 @@ int main(int argc, char* argv[]) { signal(SIGINT, handle_sigint); srand((unsigned int)time(NULL)); + // Initialize runtime locks before any thread or helper can touch chain state. + pthread_rwlock_init(&chainLock, NULL); + pthread_mutex_init(&balanceSheetLock, NULL); + BalanceSheet_Init(); blockchain_t* chain = Chain_Create(); if (!chain) { @@ -531,9 +535,6 @@ int main(int argc, char* argv[]) { } uint8_t lastSavedHash[32] = {0}; - // Initialize runtime locks before starting modules - pthread_rwlock_init(&chainLock, NULL); - pthread_mutex_init(&balanceSheetLock, NULL); if (!Chain_LoadFromFile(chain, chainDataDir, ¤tSupply, &difficultyTarget, ¤tReward, lastSavedHash, false)) { printf("No existing chain loaded from %s\n", chainDataDir); } @@ -595,7 +596,7 @@ int main(int argc, char* argv[]) { char supplyStr[80]; Uint256ToDecimal(¤tSupply, supplyStr, sizeof(supplyStr)); printf("Current chain has %zu blocks, total supply %s\n", Chain_Size(chain), supplyStr); - printf("Commands: mine , send
, balance [address], connect , flushchain, fullverify, blockdetail , wipechain, genaddr, exit\n"); + printf("Commands: mine , send
, balance [address], connect , sync (requires nodes), flushchain, fullverify, blockdetail , wipechain, genaddr, exit\n"); char line[1024]; while (true) {