Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libc/generic/fibril.c

    rf41aa81 rec8b0dac  
    4141#include <unistd.h>
    4242#include <stdio.h>
    43 #include <arch/barrier.h>
    4443#include <libarch/faddr.h>
    4544#include <futex.h>
     
    134133int fibril_switch(fibril_switch_type_t stype)
    135134{
     135        fibril_t *srcf, *dstf;
    136136        int retval = 0;
    137137       
    138138        futex_down(&fibril_futex);
    139        
     139
    140140        if (stype == FIBRIL_PREEMPT && list_empty(&ready_list))
    141141                goto ret_0;
    142        
     142
    143143        if (stype == FIBRIL_FROM_MANAGER) {
    144                 if ((list_empty(&ready_list)) && (list_empty(&serialized_list)))
     144                if (list_empty(&ready_list) && list_empty(&serialized_list))
    145145                        goto ret_0;
    146                
    147146                /*
    148147                 * Do not preempt if there is not enough threads to run the
    149148                 * ready fibrils which are not serialized.
    150149                 */
    151                 if ((list_empty(&serialized_list)) &&
    152                     (threads_in_manager <= serialized_threads)) {
     150                if (list_empty(&serialized_list) &&
     151                    threads_in_manager <= serialized_threads) {
    153152                        goto ret_0;
    154153                }
    155154        }
    156        
    157155        /* If we are going to manager and none exists, create it */
    158         if ((stype == FIBRIL_TO_MANAGER) || (stype == FIBRIL_FROM_DEAD)) {
     156        if (stype == FIBRIL_TO_MANAGER || stype == FIBRIL_FROM_DEAD) {
    159157                while (list_empty(&manager_list)) {
    160158                        futex_up(&fibril_futex);
     
    164162        }
    165163       
    166         fibril_t *srcf = __tcb_get()->fibril_data;
     164        srcf = __tcb_get()->fibril_data;
    167165        if (stype != FIBRIL_FROM_DEAD) {
    168                
    169166                /* Save current state */
    170167                if (!context_save(&srcf->ctx)) {
    171168                        if (serialization_count)
    172169                                srcf->flags &= ~FIBRIL_SERIALIZED;
    173                        
    174170                        if (srcf->clean_after_me) {
    175171                                /*
     
    177173                                 * restored context here.
    178174                                 */
    179                                 void *stack = srcf->clean_after_me->stack;
     175                                void *stack = srcf->clean_after_me->stack; 
    180176                                if (stack) {
    181177                                        /*
     
    192188                                srcf->clean_after_me = NULL;
    193189                        }
    194                        
    195190                        return 1;       /* futex_up already done here */
    196191                }
    197                
     192
    198193                /* Save myself to the correct run list */
    199194                if (stype == FIBRIL_PREEMPT)
     
    202197                        list_append(&srcf->link, &manager_list);
    203198                        threads_in_manager--;
    204                 } else {
     199                } else {       
    205200                        /*
    206201                         * If stype == FIBRIL_TO_MANAGER, don't put ourselves to
     
    212207       
    213208        /* Choose a new fibril to run */
    214         fibril_t *dstf;
    215         if ((stype == FIBRIL_TO_MANAGER) || (stype == FIBRIL_FROM_DEAD)) {
     209        if (stype == FIBRIL_TO_MANAGER || stype == FIBRIL_FROM_DEAD) {
    216210                dstf = list_get_instance(manager_list.next, fibril_t, link);
    217211                if (serialization_count && stype == FIBRIL_TO_MANAGER) {
     
    220214                }
    221215                threads_in_manager++;
    222                
     216
    223217                if (stype == FIBRIL_FROM_DEAD)
    224218                        dstf->clean_after_me = srcf;
     
    234228        }
    235229        list_remove(&dstf->link);
    236        
     230
    237231        futex_up(&fibril_futex);
    238232        context_restore(&dstf->ctx);
    239233        /* not reached */
    240        
     234
    241235ret_0:
    242236        futex_up(&fibril_futex);
Note: See TracChangeset for help on using the changeset viewer.