Ignore:
File:
1 edited

Legend:

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

    r4d11204 rc1b979a  
    4949#include <assert.h>
    5050#include <async.h>
    51 #include <futex.h>
    52 
    53 #ifdef FUTEX_UPGRADABLE
    54 #include <rcu.h>
    55 #endif
    5651
    5752/**
    5853 * This futex serializes access to ready_list,
    59  * serialized_list, manager_list and fibril_list.
    60  */
    61 static futex_t fibril_futex = FUTEX_INITIALIZER;
     54 * serialized_list and manager_list.
     55 */
     56static atomic_t fibril_futex = FUTEX_INITIALIZER;
    6257
    6358static LIST_INITIALIZE(ready_list);
     
    8883{
    8984        fibril_t *fibril = __tcb_get()->fibril_data;
    90 
    91 #ifdef FUTEX_UPGRADABLE
    92         rcu_register_fibril();
    93 #endif
    9485       
    9586        /* Call the implementing function. */
     
    126117       
    127118        fibril->waits_for = NULL;
    128 
    129         futex_lock(&fibril_futex);
    130119        list_append(&fibril->all_link, &fibril_list);
    131         futex_unlock(&fibril_futex);
    132120       
    133121        return fibril;
    134122}
    135123
    136 void fibril_teardown(fibril_t *fibril, bool locked)
    137 {       
    138         if (!locked)
    139                 futex_lock(&fibril_futex);
     124void fibril_teardown(fibril_t *fibril)
     125{
    140126        list_remove(&fibril->all_link);
    141         if (!locked)
    142                 futex_unlock(&fibril_futex);
    143127        tls_free(fibril->tcb);
    144128        free(fibril);
     
    162146        int retval = 0;
    163147       
    164         futex_lock(&fibril_futex);
     148        futex_down(&fibril_futex);
    165149       
    166150        if (stype == FIBRIL_PREEMPT && list_empty(&ready_list))
     
    184168        if ((stype == FIBRIL_TO_MANAGER) || (stype == FIBRIL_FROM_DEAD)) {
    185169                while (list_empty(&manager_list)) {
    186                         futex_unlock(&fibril_futex);
     170                        futex_up(&fibril_futex);
    187171                        async_create_manager();
    188                         futex_lock(&fibril_futex);
     172                        futex_down(&fibril_futex);
    189173                }
    190174        }
     
    215199                                        as_area_destroy(stack);
    216200                                }
    217                                 fibril_teardown(srcf->clean_after_me, true);
     201                                fibril_teardown(srcf->clean_after_me);
    218202                                srcf->clean_after_me = NULL;
    219203                        }
    220204                       
    221                         return 1;       /* futex_unlock already done here */
     205                        return 1;       /* futex_up already done here */
    222206                }
    223207               
     
    262246        list_remove(&dstf->link);
    263247       
    264         futex_unlock(&fibril_futex);
    265        
    266 #ifdef FUTEX_UPGRADABLE
    267         if (stype == FIBRIL_FROM_DEAD) {
    268                 rcu_deregister_fibril();
    269         }
    270 #endif
    271        
     248        futex_up(&fibril_futex);
    272249        context_restore(&dstf->ctx);
    273250        /* not reached */
    274251       
    275252ret_0:
    276         futex_unlock(&fibril_futex);
     253        futex_up(&fibril_futex);
    277254        return retval;
    278255}
     
    301278            AS_AREA_LATE_RESERVE);
    302279        if (fibril->stack == (void *) -1) {
    303                 fibril_teardown(fibril, false);
     280                fibril_teardown(fibril);
    304281                return 0;
    305282        }
     
    328305       
    329306        as_area_destroy(fibril->stack);
    330         fibril_teardown(fibril, false);
     307        fibril_teardown(fibril);
    331308}
    332309
     
    341318        fibril_t *fibril = (fibril_t *) fid;
    342319       
    343         futex_lock(&fibril_futex);
     320        futex_down(&fibril_futex);
    344321       
    345322        if ((fibril->flags & FIBRIL_SERIALIZED))
     
    348325                list_append(&fibril->link, &ready_list);
    349326       
    350         futex_unlock(&fibril_futex);
     327        futex_up(&fibril_futex);
    351328}
    352329
     
    361338        fibril_t *fibril = (fibril_t *) fid;
    362339       
    363         futex_lock(&fibril_futex);
     340        futex_down(&fibril_futex);
    364341        list_append(&fibril->link, &manager_list);
    365         futex_unlock(&fibril_futex);
     342        futex_up(&fibril_futex);
    366343}
    367344
     
    369346void fibril_remove_manager(void)
    370347{
    371         futex_lock(&fibril_futex);
     348        futex_down(&fibril_futex);
    372349       
    373350        if (!list_empty(&manager_list))
    374351                list_remove(list_first(&manager_list));
    375352       
    376         futex_unlock(&fibril_futex);
     353        futex_up(&fibril_futex);
    377354}
    378355
Note: See TracChangeset for help on using the changeset viewer.