11use std:: ffi:: { CStr , CString } ;
22use std:: os:: raw:: { c_char, c_void} ;
33use std:: ptr;
4+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
45use std:: thread;
56use std:: time:: Duration ;
67
@@ -16,6 +17,8 @@ enum NetworkOpt {
1617 Regtest ,
1718}
1819
20+ static SYNC_COMPLETED : AtomicBool = AtomicBool :: new ( false ) ;
21+
1922fn ffi_string_to_rust ( s : * const c_char ) -> String {
2023 if s. is_null ( ) {
2124 return String :: new ( ) ;
@@ -44,6 +47,7 @@ extern "C" fn on_completion(success: bool, msg: *const c_char, _ud: *mut c_void)
4447 let m = ffi_string_to_rust ( msg) ;
4548 if success {
4649 println ! ( "Completed: {}" , m) ;
50+ SYNC_COMPLETED . store ( true , Ordering :: SeqCst ) ;
4751 } else {
4852 eprintln ! ( "Failed: {}" , m) ;
4953 }
@@ -188,6 +192,9 @@ fn main() {
188192 std:: process:: exit ( 1 ) ;
189193 }
190194
195+ // Ensure completion flag is reset before starting sync
196+ SYNC_COMPLETED . store ( false , Ordering :: SeqCst ) ;
197+
191198 // Run sync on this thread; detailed progress will print via callback
192199 let rc = dash_spv_ffi_client_sync_to_tip_with_progress (
193200 client,
@@ -206,11 +213,14 @@ fn main() {
206213 let prog_ptr = dash_spv_ffi_client_get_sync_progress ( client) ;
207214 if !prog_ptr. is_null ( ) {
208215 let prog = & * prog_ptr;
209- let headers_done = prog. header_height >= prog. filter_header_height ;
210- let filters_complete = prog. filter_header_height >= prog. header_height
211- || !prog. filter_sync_available
212- || disable_filter_sync;
213- if headers_done && filters_complete {
216+ let headers_done = SYNC_COMPLETED . load ( Ordering :: SeqCst ) ;
217+ let filters_complete = if disable_filter_sync || !prog. filter_sync_available {
218+ false
219+ } else {
220+ prog. filter_header_height >= prog. header_height
221+ && prog. last_synced_filter_height >= prog. filter_header_height
222+ } ;
223+ if headers_done && ( filters_complete || disable_filter_sync) {
214224 dash_spv_ffi_sync_progress_destroy ( prog_ptr) ;
215225 break ;
216226 }
0 commit comments