Changes in / [13099105:935315d]


Ignore:
Location:
src
Files:
2 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/monitor

    r13099105 r935315d  
    8787void wait( condition * this );
    8888void signal( condition * this );
    89 void signal_block( condition * this );
    9089#endif //MONITOR_H
  • src/libcfa/concurrency/monitor.c

    r13099105 r935315d  
    6262                        //Some one else has the monitor, wait in line for it
    6363                        append( &this->entry_queue, thrd );
    64                         LIB_DEBUG_PRINT_SAFE("%p Blocking on entry\n", thrd);
    6564                        ScheduleInternal( &this->lock );
    6665
     
    9897                unlock( &this->lock );
    9998
    100                 LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner);
    101 
    10299                //We need to wake-up the thread
    103100                ScheduleThread( new_owner );
     
    152149        assertf( this->monitors != NULL, "Waiting with no monitors (%p)", this->monitors );
    153150        assertf( this->monitor_count != 0, "Waiting with 0 monitors (%i)", this->monitor_count );
    154         assertf( this->monitor_count < 32u, "Excessive monitor count (%i)", this->monitor_count );
    155151
    156152        unsigned short count = this->monitor_count;
     
    188184        }
    189185
     186        debug_break();
     187
    190188        for( int i = 0; i < count; i++) {
    191189                thread_desc * new_owner = next_thread( this->monitors[i] );
     
    193191        }
    194192
     193        debug_break();
     194
    195195        LIB_DEBUG_PRINT_SAFE("Will unblock: ");
    196196        for(int i = 0; i < thread_count; i++) {
     
    202202        ScheduleInternal( locks, count, threads, thread_count );
    203203
    204         debug_break();
     204
    205205        //WE WOKE UP
    206206
     
    224224        unsigned short count = this->monitor_count;
    225225       
    226         //Some more checking in debug
    227226        LIB_DEBUG_DO(
    228227                thread_desc * this_thrd = this_thread();
     
    238237        );
    239238
    240         //Lock all the monitors
    241239        lock_all( this->monitors, NULL, count );
    242240        LIB_DEBUG_PRINT_SAFE("Signalling");
    243241
    244         //Pop the head of the waiting queue
    245242        __condition_node_t * node = pop_head( &this->blocked );
    246 
    247         //Add the thread to the proper AS stack
    248243        for(int i = 0; i < count; i++) {
    249244                __condition_criterion_t * crit = &node->criteria[i];
     
    255250        LIB_DEBUG_PRINT_SAFE("\n");
    256251
    257         //Release
    258252        unlock_all( this->monitors, count );
    259 }
    260 
    261 void signal_block( condition * this ) {
    262         if( !this->blocked.head ) {
    263                 LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
    264                 return;
    265         }
    266 
    267         //Check that everything is as expected
    268         assertf( this->monitors != NULL, "Waiting with no monitors (%p)", this->monitors );
    269         assertf( this->monitor_count != 0, "Waiting with 0 monitors (%i)", this->monitor_count );
    270 
    271         unsigned short count = this->monitor_count;
    272         unsigned int recursions[ count ];               //Save the current recursion levels to restore them later
    273         spinlock *   locks     [ count ];               //We need to pass-in an array of locks to ScheduleInternal
    274 
    275         lock_all( this->monitors, locks, count );
    276 
    277         //create creteria
    278         __condition_node_t waiter;
    279         waiter.waiting_thread = this_thread();
    280         waiter.count = count;
    281         waiter.next = NULL;
    282 
    283         __condition_criterion_t criteria[count];
    284         for(int i = 0; i < count; i++) {
    285                 LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
    286                 criteria[i].ready  = false;
    287                 criteria[i].owner  = &waiter;
    288                 criteria[i].next   = NULL;
    289                 criteria[i].target = this->monitors[i];
    290                 push( &criteria[i].target->signal_stack, &criteria[i] );
    291         }
    292 
    293         waiter.criteria = criteria;
    294 
    295         //save contexts
    296         save_recursion( this->monitors, recursions, count );
    297 
    298         //Find the thread to run
    299         thread_desc * signallee = pop_head( &this->blocked )->waiting_thread;
    300         for(int i = 0; i < count; i++) {
    301                 set_owner( this->monitors[i], signallee );
    302         }
    303 
    304         LIB_DEBUG_PRINT_SAFE( "Waiting on signal block\n" );
    305         debug_break();
    306 
    307         //Everything is ready to go to sleep
    308         ScheduleInternal( locks, count, &signallee, 1 );
    309 
    310         debug_break();
    311         LIB_DEBUG_PRINT_SAFE( "Back from signal block\n" );
    312 
    313         //We are back, restore the owners and recursions
    314         lock_all( locks, count );
    315         restore_recursion( this->monitors, recursions, count );
    316         unlock_all( locks, count );
    317253}
    318254
     
    399335
    400336        for(    int i = 0; i < count; i++ ) {
    401 
    402337                LIB_DEBUG_PRINT_SAFE( "Checking %p for %p\n", &criteria[i], target );
    403338                if( &criteria[i] == target ) {
  • src/libcfa/concurrency/thread

    r13099105 r935315d  
    8282
    8383void yield();
    84 void yield( unsigned times );
    8584
    8685#endif //THREADS_H
  • src/libcfa/concurrency/thread.c

    r13099105 r935315d  
    8787}
    8888
    89 void yield( unsigned times ) {
    90         for( unsigned i = 0; i < times; i++ ) {
    91                 yield();
    92         }
    93 }
    94 
    9589void ThreadCtxSwitch(coroutine_desc* src, coroutine_desc* dst) {
    9690        // set state of current coroutine to inactive
Note: See TracChangeset for help on using the changeset viewer.