Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/kernel_private.h

    r1c273d0 r4aa2fb2  
    2727//-----------------------------------------------------------------------------
    2828// Scheduler
    29 
    30 extern "C" {
    31         void disable_interrupts();
    32         void enable_interrupts_noRF();
    33         void enable_interrupts( const char * );
    34 }
    35 
    3629void ScheduleThread( thread_desc * );
    37 static inline void WakeThread( thread_desc * thrd ) {
    38         if( !thrd ) return;
    39 
    40         disable_interrupts();
    41         ScheduleThread( thrd );
    42         enable_interrupts( __PRETTY_FUNCTION__ );
    43 }
    4430thread_desc * nextThread(cluster * this);
    4531
    46 void BlockInternal(void);
    47 void BlockInternal(spinlock * lock);
    48 void BlockInternal(thread_desc * thrd);
    49 void BlockInternal(spinlock * lock, thread_desc * thrd);
    50 void BlockInternal(spinlock ** locks, unsigned short count);
    51 void BlockInternal(spinlock ** locks, unsigned short count, thread_desc ** thrds, unsigned short thrd_count);
     32void ScheduleInternal(void);
     33void ScheduleInternal(spinlock * lock);
     34void ScheduleInternal(thread_desc * thrd);
     35void ScheduleInternal(spinlock * lock, thread_desc * thrd);
     36void ScheduleInternal(spinlock ** locks, unsigned short count);
     37void ScheduleInternal(spinlock ** locks, unsigned short count, thread_desc ** thrds, unsigned short thrd_count);
    5238
    5339//-----------------------------------------------------------------------------
     
    7460extern cluster * systemCluster;
    7561extern system_proc_t * systemProcessor;
    76 extern volatile thread_local processor * this_processor;
    77 extern volatile thread_local coroutine_desc * this_coroutine;
    78 extern volatile thread_local thread_desc * this_thread;
    79 extern volatile thread_local unsigned short disable_preempt_count;
     62extern thread_local processor * this_processor;
     63
     64static inline void disable_interrupts() {
     65        __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &this_processor->disable_preempt_count, 1, __ATOMIC_SEQ_CST );
     66        assert( prev != (unsigned short) -1 );
     67}
     68
     69static inline void enable_interrupts_noRF() {
     70        __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &this_processor->disable_preempt_count, -1, __ATOMIC_SEQ_CST );
     71        verify( prev != (unsigned short) 0 );
     72}
     73
     74static inline void enable_interrupts() {
     75        __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &this_processor->disable_preempt_count, -1, __ATOMIC_SEQ_CST );
     76        verify( prev != (unsigned short) 0 );
     77        if( prev == 1 && this_processor->pending_preemption ) {
     78                ScheduleInternal( this_processor->current_thread );
     79                this_processor->pending_preemption = false;
     80        }
     81}
    8082
    8183//-----------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.