- File:
-
- 1 edited
-
src/libcfa/concurrency/monitor.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/monitor.c
r1c273d0 r4aa2fb2 44 44 45 45 extern "C" { 46 void __enter_monitor_desc( monitor_desc * this) {47 lock( &this->lock , __PRETTY_FUNCTION__);48 thread_desc * thrd = this_thread ;49 50 //LIB_DEBUG_PRINT_SAFE("%p Entering %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion);46 void __enter_monitor_desc(monitor_desc * this) { 47 lock( &this->lock ); 48 thread_desc * thrd = this_thread(); 49 50 LIB_DEBUG_PRINT_SAFE("%p Entering %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion); 51 51 52 52 if( !this->owner ) { … … 62 62 //Some one else has the monitor, wait in line for it 63 63 append( &this->entry_queue, thrd ); 64 //LIB_DEBUG_PRINT_SAFE("%p Blocking on entry\n", thrd);65 BlockInternal( &this->lock );66 67 // BlockInternal will unlock spinlock, no need to unlock ourselves64 LIB_DEBUG_PRINT_SAFE("%p Blocking on entry\n", thrd); 65 ScheduleInternal( &this->lock ); 66 67 //ScheduleInternal will unlock spinlock, no need to unlock ourselves 68 68 return; 69 69 } … … 75 75 // leave pseudo code : 76 76 // TODO 77 void __leave_monitor_desc( monitor_desc * this) {78 lock( &this->lock , __PRETTY_FUNCTION__);79 80 // LIB_DEBUG_PRINT_SAFE("%p Leaving %p (o: %p, r: %i). ", this_thread, this, this->owner, this->recursion);81 verifyf( this_thread == this->owner, "Expected owner to be %p, got %p (r: %i)", this_thread, this->owner, this->recursion );77 void __leave_monitor_desc(monitor_desc * this) { 78 lock( &this->lock ); 79 80 LIB_DEBUG_PRINT_SAFE("%p Leaving %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion); 81 verifyf( this_thread() == this->owner, "Expected owner to be %p, got %p (r: %i)", this_thread(), this->owner, this->recursion ); 82 82 83 83 //Leaving a recursion level, decrement the counter … … 96 96 unlock( &this->lock ); 97 97 98 //LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner);98 LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner); 99 99 100 100 //We need to wake-up the thread 101 WakeThread( new_owner ); 102 } 103 104 void __leave_thread_monitor( thread_desc * thrd ) { 105 monitor_desc * this = &thrd->mon; 106 lock( &this->lock, __PRETTY_FUNCTION__ ); 107 108 disable_interrupts(); 109 110 thrd->cor.state = Halted; 111 112 verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i)", thrd, this->owner, this->recursion ); 113 114 //Leaving a recursion level, decrement the counter 115 this->recursion -= 1; 116 117 //If we haven't left the last level of recursion 118 //it means we don't need to do anything 119 if( this->recursion != 0) { 120 unlock( &this->lock ); 121 return; 122 } 123 124 thread_desc * new_owner = next_thread( this ); 125 126 //We can now let other threads in safely 127 unlock( &this->lock ); 128 129 //We need to wake-up the thread 130 if( new_owner) ScheduleThread( new_owner ); 101 ScheduleThread( new_owner ); 131 102 } 132 103 } … … 150 121 enter( this->m, this->count ); 151 122 152 this->prev_mntrs = this_thread ->current_monitors;153 this->prev_count = this_thread ->current_monitor_count;154 155 this_thread ->current_monitors = m;156 this_thread ->current_monitor_count = count;123 this->prev_mntrs = this_thread()->current_monitors; 124 this->prev_count = this_thread()->current_monitor_count; 125 126 this_thread()->current_monitors = m; 127 this_thread()->current_monitor_count = count; 157 128 } 158 129 … … 160 131 leave( this->m, this->count ); 161 132 162 this_thread ->current_monitors = this->prev_mntrs;163 this_thread ->current_monitor_count = this->prev_count;133 this_thread()->current_monitors = this->prev_mntrs; 134 this_thread()->current_monitor_count = this->prev_count; 164 135 } 165 136 … … 199 170 unsigned short count = this->monitor_count; 200 171 unsigned int recursions[ count ]; //Save the current recursion levels to restore them later 201 spinlock * locks [ count ]; //We need to pass-in an array of locks to BlockInternal172 spinlock * locks [ count ]; //We need to pass-in an array of locks to ScheduleInternal 202 173 203 174 LIB_DEBUG_PRINT_SAFE("count %i\n", count); 204 175 205 __condition_node_t waiter = { (thread_desc*)this_thread, count, user_info };176 __condition_node_t waiter = { this_thread(), count, user_info }; 206 177 207 178 __condition_criterion_t criteria[count]; … … 237 208 238 209 // Everything is ready to go to sleep 239 BlockInternal( locks, count, threads, thread_count );210 ScheduleInternal( locks, count, threads, thread_count ); 240 211 241 212 … … 263 234 //Some more checking in debug 264 235 LIB_DEBUG_DO( 265 thread_desc * this_thrd = this_thread ;236 thread_desc * this_thrd = this_thread(); 266 237 if ( this->monitor_count != this_thrd->current_monitor_count ) { 267 238 abortf( "Signal on condition %p made with different number of monitor(s), expected %i got %i", this, this->monitor_count, this_thrd->current_monitor_count ); … … 310 281 unsigned short count = this->monitor_count; 311 282 unsigned int recursions[ count ]; //Save the current recursion levels to restore them later 312 spinlock * locks [ count ]; //We need to pass-in an array of locks to BlockInternal283 spinlock * locks [ count ]; //We need to pass-in an array of locks to ScheduleInternal 313 284 314 285 lock_all( this->monitors, locks, count ); 315 286 316 287 //create creteria 317 __condition_node_t waiter = { (thread_desc*)this_thread, count, 0 };288 __condition_node_t waiter = { this_thread(), count, 0 }; 318 289 319 290 __condition_criterion_t criteria[count]; … … 338 309 339 310 //Everything is ready to go to sleep 340 BlockInternal( locks, count, &signallee, 1 );311 ScheduleInternal( locks, count, &signallee, 1 ); 341 312 342 313 … … 364 335 // Internal scheduling 365 336 void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) ) { 366 // thread_desc * this = this_thread ;337 // thread_desc * this = this_thread(); 367 338 368 339 // unsigned short count = this->current_monitor_count; 369 340 // unsigned int recursions[ count ]; //Save the current recursion levels to restore them later 370 // spinlock * locks [ count ]; //We need to pass-in an array of locks to BlockInternal341 // spinlock * locks [ count ]; //We need to pass-in an array of locks to ScheduleInternal 371 342 372 343 // lock_all( this->current_monitors, locks, count ); … … 377 348 378 349 // // // Everything is ready to go to sleep 379 // // BlockInternal( locks, count, threads, thread_count );350 // // ScheduleInternal( locks, count, threads, thread_count ); 380 351 381 352 … … 422 393 static inline void lock_all( spinlock ** locks, unsigned short count ) { 423 394 for( int i = 0; i < count; i++ ) { 424 lock( locks[i] , __PRETTY_FUNCTION__);395 lock( locks[i] ); 425 396 } 426 397 } … … 429 400 for( int i = 0; i < count; i++ ) { 430 401 spinlock * l = &source[i]->lock; 431 lock( l , __PRETTY_FUNCTION__);402 lock( l ); 432 403 if(locks) locks[i] = l; 433 404 } … … 486 457 487 458 static inline void brand_condition( condition * this ) { 488 thread_desc * thrd = this_thread ;459 thread_desc * thrd = this_thread(); 489 460 if( !this->monitors ) { 490 461 LIB_DEBUG_PRINT_SAFE("Branding\n");
Note:
See TracChangeset
for help on using the changeset viewer.