Skip to content

Commit 8f150f6

Browse files
authored
Merge pull request #207 from edtubbs/0.1.4-dev-quit-disconnect
net: added disconnected state for shutdown
2 parents 306d6b2 + d321367 commit 8f150f6

File tree

5 files changed

+132
-79
lines changed

5 files changed

+132
-79
lines changed

include/dogecoin/utils.h

+3-4
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,10 @@ static inline void dogecoin_btree_tdestroy(void *root, void (*freekey)(void *))
115115

116116
if (r == 0)
117117
return;
118-
if (freekey) goto end;
119-
if (r->left && !freekey) dogecoin_btree_tdestroy(r->left, freekey);
120-
if (r->right && !freekey) dogecoin_btree_tdestroy(r->right, freekey);
121118

122-
end:
119+
if (r->left) dogecoin_btree_tdestroy(r->left, freekey);
120+
if (r->right) dogecoin_btree_tdestroy(r->right, freekey);
121+
123122
if (freekey) freekey(r->key);
124123
dogecoin_free(r);
125124
}

src/headersdb_file.c

+12-22
Original file line numberDiff line numberDiff line change
@@ -116,24 +116,10 @@ void dogecoin_headers_db_free(dogecoin_headers_db* db) {
116116
}
117117

118118
if (db->tree_root) {
119-
dogecoin_btree_tdestroy(db->tree_root, NULL);
119+
dogecoin_btree_tdestroy(db->tree_root, dogecoin_free);
120120
db->tree_root = NULL;
121121
}
122122

123-
// Free all blockindex structures starting from chaintip to chainbottom
124-
if (db->chaintip) {
125-
dogecoin_blockindex *scan_tip = db->chaintip;
126-
while (scan_tip->prev) {
127-
dogecoin_blockindex *prev = scan_tip->prev;
128-
dogecoin_free(scan_tip);
129-
scan_tip = prev;
130-
}
131-
// If scan_tip is not the genesis block, free it
132-
if (scan_tip != &db->genesis) {
133-
dogecoin_free(scan_tip);
134-
}
135-
}
136-
137123
db->chaintip = NULL;
138124
db->chainbottom = NULL;
139125

@@ -311,13 +297,19 @@ dogecoin_blockindex * dogecoin_headers_db_connect_hdr(dogecoin_headers_db* db, s
311297
dogecoin_blockindex *blockindex = dogecoin_calloc(1, sizeof(dogecoin_blockindex));
312298
if (!dogecoin_block_header_deserialize(&blockindex->header, buf, db->params))
313299
{
314-
dogecoin_free(blockindex);
315300
fprintf(stderr, "Error deserializing block header\n");
316-
return NULL;
301+
return blockindex;
317302
}
318303

319304
dogecoin_block_header_hash(&blockindex->header, (uint8_t *)&blockindex->hash);
320305

306+
// Check if the block header is already in the database
307+
dogecoin_blockindex *block = dogecoin_headersdb_find(db, blockindex->hash);
308+
if (block) {
309+
// Block header already in database, return blockindex
310+
return blockindex;
311+
}
312+
321313
dogecoin_blockindex *connect_at = NULL;
322314
dogecoin_blockindex *fork_from_block = NULL;
323315

@@ -343,8 +335,7 @@ dogecoin_blockindex * dogecoin_headers_db_connect_hdr(dogecoin_headers_db* db, s
343335
cstr_free(s, true);
344336
if (!check_pow(&hash, blockindex->header.bits, db->params, &blockindex->header.chainwork)) {
345337
printf("%s:%d:%s : non-AUX proof of work failed : %s\n", __FILE__, __LINE__, __func__, strerror(errno));
346-
dogecoin_free(blockindex);
347-
return false;
338+
return blockindex;
348339
}
349340
}
350341

@@ -383,10 +374,9 @@ dogecoin_blockindex * dogecoin_headers_db_connect_hdr(dogecoin_headers_db* db, s
383374
// Break the loop if either reaches the start of the chain
384375
if (!common_ancestor || !fork_chain) {
385376
fprintf(stderr, "Unable to find common ancestor.\n");
386-
dogecoin_free(blockindex);
387377
dogecoin_free(chaintip_chainwork);
388378
dogecoin_free(added_chainwork);
389-
return NULL;
379+
return blockindex;
390380
}
391381
}
392382

@@ -413,7 +403,7 @@ dogecoin_blockindex * dogecoin_headers_db_connect_hdr(dogecoin_headers_db* db, s
413403
// Free the dynamically allocated memory
414404
dogecoin_free(chaintip_chainwork);
415405
dogecoin_free(added_chainwork);
416-
return NULL;
406+
return blockindex;
417407
}
418408

419409
// Update the chain tip to the previous block

0 commit comments

Comments
 (0)