Changeset 337 for trunk/kernel/libk


Ignore:
Timestamp:
Aug 7, 2017, 12:50:17 PM (7 years ago)
Author:
alain
Message:

Introduce the delayed context switch if current thread has a lock.

Location:
trunk/kernel/libk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/libk/elf.c

    r333 r337  
    8888        error_t   error;
    8989        xptr_t    buf_xp;
    90         void    * buf_ptr;
    91 
    92         buf_ptr = GET_PTR( buffer );
    93         buf_xp = XPTR( local_cxy , buf_ptr );
     90
     91        buf_xp = XPTR( local_cxy , buffer );
    9492
    9593        // load .elf header
  • trunk/kernel/libk/remote_rwlock.c

    r318 r337  
    118118    // enable interrupts
    119119        hal_restore_irq( mode );
     120   
     121    // deschedule if pending request
     122    thread_check_sched();
    120123
    121124}  // end remote_rwlock_rd_unlock()
     
    201204    // enable interrupts
    202205        hal_restore_irq( mode );
     206   
     207    // deschedule if pending request
     208    thread_check_sched();
    203209
    204210}  // end remote_rwlock_wr_unlock()
  • trunk/kernel/libk/remote_spinlock.c

    r296 r337  
    141141
    142142        hal_remote_swd( XPTR( lock_cxy , &lock_ptr->owner ) , XPTR_NULL );
    143 
    144143        hal_remote_sw ( XPTR( lock_cxy , &lock_ptr->taken ) , 0 );
    145 
    146144        thread_ptr->remote_locks--;
    147 
    148145        xlist_unlink( XPTR( lock_cxy , &lock_ptr->list ) );
    149146
     147    // deschedule if pending request
     148    thread_check_sched();
     149 
     150    // restore IRQs
    150151        hal_restore_irq( irq_state );
    151152}
     
    211212
    212213        hal_remote_swd( XPTR( lock_cxy , &lock_ptr->owner ) , XPTR_NULL );
    213 
    214214        hal_remote_sw ( XPTR( lock_cxy , &lock_ptr->taken ) , 0 );
    215 
    216215        thread_ptr->remote_locks--;
    217 
    218216        xlist_unlink( XPTR( lock_cxy , &lock_ptr->list ) );
     217
     218    // deschedule if pending request
     219    thread_check_sched();
    219220}
    220221
  • trunk/kernel/libk/rwlock.c

    r124 r337  
    9191    // enable IRQs
    9292        hal_restore_irq( mode );
     93
     94    // deschedule if pending request
     95    thread_check_sched();
    9396}
    9497
     
    141144    lock->owner = NULL;
    142145    this->local_locks--;
    143    
     146
    144147    // enable IRQs
    145148        hal_restore_irq( mode );
     149   
     150    // deschedule if pending request
     151    thread_check_sched();
    146152}
    147153
  • trunk/kernel/libk/spinlock.c

    r331 r337  
    8484    list_unlink( &lock->list );
    8585
    86     hal_restore_irq( irq_state );
     86    // deschedule if pending request
     87    thread_check_sched();
     88 
     89    // restore IRQs
     90        hal_restore_irq( irq_state );
    8791}
    8892
     
    120124    list_add_first( &this->locks_root , &lock->list );
    121125
    122     // enable interrupts
     126    // restore IRQs
    123127    hal_restore_irq( mode );
    124128}
     
    160164    this->local_locks--;
    161165    list_unlink( &lock->list );
     166
     167    // deschedule if pending request
     168    thread_check_sched();
    162169}
    163170
  • trunk/kernel/libk/string.c

    r323 r337  
    129129               const char * find)
    130130{
    131     char c, sc;
    132     size_t len;
     131    char     sc;
     132    char     c;
     133    uint32_t len;
    133134
    134135    if ((c = *find++) != 0) {
Note: See TracChangeset for help on using the changeset viewer.