- File:
-
- 1 edited
-
src/libcfa/concurrency/monitor.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/monitor.c
r690f13c rcb0e6de 18 18 19 19 #include "kernel_private.h" 20 21 void set_owner( monitor_desc * this, thread_desc * owner ) {22 //Pass the monitor appropriately23 this->owner = owner;24 25 //We are passing the monitor to someone else, which means recursion level is not 026 this->recursion = owner ? 1 : 0;27 }28 20 29 21 extern "C" { … … 54 46 } 55 47 56 // leave pseudo code :57 // decrement level58 // leve == 0 ?59 // no : done60 // yes :61 // signal stack empty ?62 // has leader :63 // bulk acquiring means we don't own the signal stack64 // ignore it but don't release the monitor65 // yes :66 // next in entry queue is new owner67 // no :68 // top of the signal stack is the owner69 // context switch to him right away70 //71 48 void __leave_monitor_desc(monitor_desc * this) { 72 49 lock( &this->lock ); … … 78 55 this->recursion -= 1; 79 56 80 //If we haven't left the last level of recursion 81 //it means we don't need to do anything 82 if( this->recursion != 0) { 83 unlock( &this->lock ); 84 return; 85 } 86 87 //If we don't own the signal stack then just leave it to the owner 88 if( this->stack_owner ) { 89 assert( this->owner == this->stack_owner ); 90 unlock( &this->lock ); 91 return; 92 } 57 //If we left the last level of recursion it means we are changing who owns the monitor 58 thread_desc * new_owner = 0; 59 if( this->recursion == 0) { 60 //Get the next thread in the list 61 new_owner = this->owner = pop_head( &this->entry_queue ); 93 62 94 //We are the stack owner and have left the last recursion level.95 //We are in charge of passing the monitor96 thread_desc * new_owner = 0;63 //We are passing the monitor to someone else, which means recursion level is not 0 64 this->recursion = new_owner ? 1 : 0; 65 } 97 66 98 //Check the signaller stack99 new_owner = pop( &this->signal_stack );100 if( new_owner ) {101 //The signaller stack is not empty,102 //transfer control immediately103 set_owner( this, new_owner );104 ScheduleInternal( &this->lock, new_owner );105 return;106 }107 108 // No signaller thread109 // Get the next thread in the entry_queue110 new_owner = pop_head( &this->entry_queue );111 set_owner( this, new_owner );112 113 //We can now let other threads in safely114 67 unlock( &this->lock ); 115 68 116 //We need to wake-up the thread 117 ScheduleThread( new_owner ); 69 //If we have a new owner, we need to wake-up the thread 70 if( new_owner ) { 71 ScheduleThread( new_owner ); 72 } 118 73 } 119 74 }
Note:
See TracChangeset
for help on using the changeset viewer.