Changeset 44940ee for libcfa/src/concurrency
- Timestamp:
- Feb 25, 2026, 12:56:30 AM (4 days ago)
- Branches:
- stuck-waitfor-destruct
- Children:
- 88bb0b4
- Parents:
- a0548c2
- Location:
- libcfa/src/concurrency
- Files:
-
- 6 edited
-
invoke.h (modified) (4 diffs)
-
kernel/startup.cfa (modified) (1 diff)
-
monitor.cfa (modified) (7 diffs)
-
monitor.hfa (modified) (2 diffs)
-
thread.cfa (modified) (4 diffs)
-
thread.hfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
ra0548c2 r44940ee 159 159 // last function that acquired monitors 160 160 fptr_t func; 161 162 // hash-based function identity for cross-TU matching163 func_id_t func_id;164 161 }; 165 162 … … 291 288 (this.size){0}; 292 289 (this.func){NULL}; 293 (this.func_id){0}; 294 } 295 296 static inline void ?{}(__monitor_group_t & this, struct monitor$ ** data, __lock_size_t size, fptr_t func, func_id_t func_id) { 290 } 291 292 static inline void ?{}(__monitor_group_t & this, struct monitor$ ** data, __lock_size_t size, fptr_t func) { 297 293 (this.data){data}; 298 294 (this.size){size}; 299 295 (this.func){func}; 300 (this.func_id){func_id};301 296 } 302 297 … … 304 299 if( (lhs.data != 0) != (rhs.data != 0) ) return false; 305 300 if( lhs.size != rhs.size ) return false; 306 // Use hash-based comparison when both sides have a valid func_id, 307 // otherwise fall back to function pointer comparison (for library code 308 // like join() that cannot compute the hash at compile time). 309 if( lhs.func_id != 0 && rhs.func_id != 0 ) { 310 if( lhs.func_id != rhs.func_id ) return false; 311 } else { 312 if( lhs.func != rhs.func ) return false; 313 } 301 if( lhs.func != rhs.func ) return false; 314 302 315 303 // Check that all the monitors match … … 326 314 lhs.size = rhs.size; 327 315 lhs.func = rhs.func; 328 lhs.func_id = rhs.func_id;329 316 } 330 317 } -
libcfa/src/concurrency/kernel/startup.cfa
ra0548c2 r44940ee 517 517 doregister(curr_cluster, this); 518 518 519 monitors{ &self_mon_p, 1, (fptr_t)0 , (func_id_t)0};519 monitors{ &self_mon_p, 1, (fptr_t)0 }; 520 520 } 521 521 -
libcfa/src/concurrency/monitor.cfa
ra0548c2 r44940ee 140 140 } 141 141 142 static void __dtor_enter( monitor$ * this, fptr_t func, func_id_t func_id,bool join ) {142 static void __dtor_enter( monitor$ * this, fptr_t func, bool join ) { 143 143 thread$ * thrd = active_thread(); 144 144 #if defined( __CFA_WITH_VERIFY__ ) … … 190 190 __lock_size_t count = 1; 191 191 monitor$ ** monitors = &this; 192 __monitor_group_t group = { &this, 1, func , func_id};192 __monitor_group_t group = { &this, 1, func }; 193 193 if ( is_accepted( this, group) ) { 194 194 __cfaabi_dbg_print_safe( "Kernel : mon accepts dtor, block and signal it \n" ); … … 341 341 // Ctor for monitor guard 342 342 // Sorts monitors before entering 343 void ?{}( monitor_guard_t & this, monitor$ * m [], __lock_size_t count, fptr_t func , func_id_t func_id) libcfa_public {343 void ?{}( monitor_guard_t & this, monitor$ * m [], __lock_size_t count, fptr_t func ) libcfa_public { 344 344 thread$ * thrd = active_thread(); 345 345 … … 355 355 356 356 // Update thread context (needed for conditions) 357 (thrd->monitors){m, count, func , func_id};357 (thrd->monitors){m, count, func}; 358 358 359 359 // __cfaabi_dbg_print_safe( "MGUARD : enter %d\n", count); 360 360 361 361 // Enter the monitors in order 362 __monitor_group_t group = {this.m, this.count, func , func_id};362 __monitor_group_t group = {this.m, this.count, func}; 363 363 enter( group ); 364 364 … … 367 367 368 368 void ?{}( monitor_guard_t & this, monitor$ * m [], __lock_size_t count ) libcfa_public { 369 this{ m, count, 0p , 0};369 this{ m, count, 0p }; 370 370 } 371 371 … … 386 386 // Ctor for monitor guard 387 387 // Sorts monitors before entering 388 void ?{}( monitor_dtor_guard_t & this, monitor$ * m [], fptr_t func, func_id_t func_id,bool join ) libcfa_public {388 void ?{}( monitor_dtor_guard_t & this, monitor$ * m [], fptr_t func, bool join ) libcfa_public { 389 389 // optimization 390 390 thread$ * thrd = active_thread(); … … 400 400 401 401 // Update thread context (needed for conditions) 402 (thrd->monitors){m, 1, func , func_id};403 404 __dtor_enter( this.m, func, func_id,join );402 (thrd->monitors){m, 1, func}; 403 404 __dtor_enter( this.m, func, join ); 405 405 } 406 406 -
libcfa/src/concurrency/monitor.hfa
ra0548c2 r44940ee 48 48 }; 49 49 50 void ?{}( monitor_guard_t & this, monitor$ ** m, __lock_size_t count, void (*func)() , func_id_t func_id);50 void ?{}( monitor_guard_t & this, monitor$ ** m, __lock_size_t count, void (*func)() ); 51 51 void ?{}( monitor_guard_t & this, monitor$ ** m, __lock_size_t count ); 52 52 void ^?{}( monitor_guard_t & this ); … … 58 58 }; 59 59 60 void ?{}( monitor_dtor_guard_t & this, monitor$ ** m, void (*func)(), func_id_t func_id,bool join );60 void ?{}( monitor_dtor_guard_t & this, monitor$ ** m, void (*func)(), bool join ); 61 61 void ^?{}( monitor_dtor_guard_t & this ); 62 62 -
libcfa/src/concurrency/thread.cfa
ra0548c2 r44940ee 61 61 62 62 doregister(curr_cluster, this); 63 monitors{ &self_mon_p, 1, (fptr_t)0 , (func_id_t)0};63 monitors{ &self_mon_p, 1, (fptr_t)0 }; 64 64 } 65 65 … … 93 93 | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); }) 94 94 void ?{}( thread_dtor_guard_t & this, 95 T & thrd, func_id_t func_id,void(*cancelHandler)(ThreadCancelled(T) &)) {95 T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) { 96 96 monitor$ * m = get_monitor(thrd); 97 97 thread$ * desc = get_thread(thrd); … … 100 100 void (*dtor)(T& mutex this) = ^?{}; 101 101 bool join = cancelHandler != (void(*)(ThreadCancelled(T)&))0; 102 this.func_id = func_id; 103 (this.mg){&m, (void(*)())dtor, func_id, join}; 102 (this.mg){&m, (void(*)())dtor, join}; 104 103 105 104 … … 173 172 | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); }) 174 173 T & join( T & this ) { 175 thread_dtor_guard_t guard = { this, (func_id_t)0,defaultResumptionHandler };174 thread_dtor_guard_t guard = { this, defaultResumptionHandler }; 176 175 return this; 177 176 } -
libcfa/src/concurrency/thread.hfa
ra0548c2 r44940ee 83 83 struct thread_dtor_guard_t { 84 84 monitor_dtor_guard_t mg; 85 func_id_t func_id;86 85 }; 87 86 88 87 forall( T & | is_thread(T) | IS_EXCEPTION(ThreadCancelled(T)) 89 88 | { EHM_DEFAULT_VTABLE(ThreadCancelled(T)); }) 90 void ?{}( thread_dtor_guard_t & this, T & thrd, func_id_t func_id,void(*)(ThreadCancelled(T) &) );89 void ?{}( thread_dtor_guard_t & this, T & thrd, void(*)(ThreadCancelled(T) &) ); 91 90 void ^?{}( thread_dtor_guard_t & this ); 92 91
Note:
See TracChangeset
for help on using the changeset viewer.