Ignore:
File:
1 edited

Legend:

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

    ra55d76b1 rab6edb6  
    4545#include <stdio.h>
    4646#include "private/async.h"
     47#include "private/fibril.h"
    4748
    4849static void optimize_execution_power(void)
     
    105106        fibril_t *f = (fibril_t *) fibril_get_id();
    106107
    107         futex_down(&async_futex);
     108        futex_lock(&async_futex);
    108109        if (fm->counter-- <= 0) {
    109110                awaiter_t wdata;
     
    115116                check_for_deadlock(&fm->oi);
    116117                f->waits_for = &fm->oi;
    117                 fibril_switch(FIBRIL_TO_MANAGER);
     118                fibril_switch(FIBRIL_FROM_BLOCKED);
    118119        } else {
    119120                fm->oi.owned_by = f;
    120                 futex_up(&async_futex);
    121         }
     121        }
     122        futex_unlock(&async_futex);
    122123}
    123124
     
    126127        bool locked = false;
    127128
    128         futex_down(&async_futex);
     129        futex_lock(&async_futex);
    129130        if (fm->counter > 0) {
    130131                fm->counter--;
     
    132133                locked = true;
    133134        }
    134         futex_up(&async_futex);
     135        futex_unlock(&async_futex);
    135136
    136137        return locked;
     
    165166{
    166167        assert(fibril_mutex_is_locked(fm));
    167         futex_down(&async_futex);
     168        futex_lock(&async_futex);
    168169        _fibril_mutex_unlock_unsafe(fm);
    169         futex_up(&async_futex);
     170        futex_unlock(&async_futex);
    170171}
    171172
     
    174175        bool locked = false;
    175176
    176         futex_down(&async_futex);
     177        futex_lock(&async_futex);
    177178        if (fm->counter <= 0)
    178179                locked = true;
    179         futex_up(&async_futex);
     180        futex_unlock(&async_futex);
    180181
    181182        return locked;
     
    194195        fibril_t *f = (fibril_t *) fibril_get_id();
    195196
    196         futex_down(&async_futex);
     197        futex_lock(&async_futex);
    197198        if (frw->writers) {
    198199                awaiter_t wdata;
     
    201202                wdata.fid = (fid_t) f;
    202203                wdata.wu_event.inlist = true;
    203                 f->flags &= ~FIBRIL_WRITER;
     204                f->is_writer = false;
    204205                list_append(&wdata.wu_event.link, &frw->waiters);
    205206                check_for_deadlock(&frw->oi);
    206207                f->waits_for = &frw->oi;
    207                 fibril_switch(FIBRIL_TO_MANAGER);
     208                fibril_switch(FIBRIL_FROM_BLOCKED);
    208209        } else {
    209210                /* Consider the first reader the owner. */
    210211                if (frw->readers++ == 0)
    211212                        frw->oi.owned_by = f;
    212                 futex_up(&async_futex);
    213         }
     213        }
     214        futex_unlock(&async_futex);
    214215}
    215216
     
    218219        fibril_t *f = (fibril_t *) fibril_get_id();
    219220
    220         futex_down(&async_futex);
     221        futex_lock(&async_futex);
    221222        if (frw->writers || frw->readers) {
    222223                awaiter_t wdata;
     
    225226                wdata.fid = (fid_t) f;
    226227                wdata.wu_event.inlist = true;
    227                 f->flags |= FIBRIL_WRITER;
     228                f->is_writer = true;
    228229                list_append(&wdata.wu_event.link, &frw->waiters);
    229230                check_for_deadlock(&frw->oi);
    230231                f->waits_for = &frw->oi;
    231                 fibril_switch(FIBRIL_TO_MANAGER);
     232                fibril_switch(FIBRIL_FROM_BLOCKED);
    232233        } else {
    233234                frw->oi.owned_by = f;
    234235                frw->writers++;
    235                 futex_up(&async_futex);
    236         }
     236        }
     237        futex_unlock(&async_futex);
    237238}
    238239
    239240static void _fibril_rwlock_common_unlock(fibril_rwlock_t *frw)
    240241{
    241         futex_down(&async_futex);
     242        futex_lock(&async_futex);
    242243        if (frw->readers) {
    243244                if (--frw->readers) {
     
    276277                f->waits_for = NULL;
    277278
    278                 if (f->flags & FIBRIL_WRITER) {
     279                if (f->is_writer) {
    279280                        if (frw->readers)
    280281                                break;
     
    300301        }
    301302out:
    302         futex_up(&async_futex);
     303        futex_unlock(&async_futex);
    303304}
    304305
     
    319320        bool locked = false;
    320321
    321         futex_down(&async_futex);
     322        futex_lock(&async_futex);
    322323        if (frw->readers)
    323324                locked = true;
    324         futex_up(&async_futex);
     325        futex_unlock(&async_futex);
    325326
    326327        return locked;
     
    331332        bool locked = false;
    332333
    333         futex_down(&async_futex);
     334        futex_lock(&async_futex);
    334335        if (frw->writers) {
    335336                assert(frw->writers == 1);
    336337                locked = true;
    337338        }
    338         futex_up(&async_futex);
     339        futex_unlock(&async_futex);
    339340
    340341        return locked;
     
    368369        wdata.wu_event.inlist = true;
    369370
    370         futex_down(&async_futex);
     371        futex_lock(&async_futex);
    371372        if (timeout) {
    372373                getuptime(&wdata.to_event.expires);
     
    376377        list_append(&wdata.wu_event.link, &fcv->waiters);
    377378        _fibril_mutex_unlock_unsafe(fm);
    378         fibril_switch(FIBRIL_TO_MANAGER);
     379        fibril_switch(FIBRIL_FROM_BLOCKED);
     380        futex_unlock(&async_futex);
     381
     382        // XXX: This could be replaced with an unlocked version to get rid
     383        // of the unlock-lock pair. I deliberately don't do that because
     384        // further changes would most likely need to revert that optimization.
    379385        fibril_mutex_lock(fm);
    380386
    381         /* async_futex not held after fibril_switch() */
    382         futex_down(&async_futex);
     387        futex_lock(&async_futex);
    383388        if (wdata.to_event.inlist)
    384389                list_remove(&wdata.to_event.link);
    385390        if (wdata.wu_event.inlist)
    386391                list_remove(&wdata.wu_event.link);
    387         futex_up(&async_futex);
     392        futex_unlock(&async_futex);
    388393
    389394        return wdata.to_event.occurred ? ETIMEOUT : EOK;
     
    403408        awaiter_t *wdp;
    404409
    405         futex_down(&async_futex);
     410        futex_lock(&async_futex);
    406411        while (!list_empty(&fcv->waiters)) {
    407412                tmp = list_first(&fcv->waiters);
     
    417422                }
    418423        }
    419         futex_up(&async_futex);
     424        futex_unlock(&async_futex);
    420425}
    421426
     
    656661void fibril_semaphore_up(fibril_semaphore_t *sem)
    657662{
    658         futex_down(&async_futex);
     663        futex_lock(&async_futex);
    659664        sem->count++;
    660665
    661666        if (sem->count > 0) {
    662                 futex_up(&async_futex);
     667                futex_unlock(&async_futex);
    663668                return;
    664669        }
     
    668673        list_remove(tmp);
    669674
    670         futex_up(&async_futex);
     675        futex_unlock(&async_futex);
    671676
    672677        awaiter_t *wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
     
    684689void fibril_semaphore_down(fibril_semaphore_t *sem)
    685690{
    686         futex_down(&async_futex);
     691        futex_lock(&async_futex);
    687692        sem->count--;
    688693
    689694        if (sem->count >= 0) {
    690                 futex_up(&async_futex);
     695                futex_unlock(&async_futex);
    691696                return;
    692697        }
     
    697702        wdata.fid = fibril_get_id();
    698703        list_append(&wdata.wu_event.link, &sem->waiters);
    699         fibril_switch(FIBRIL_TO_MANAGER);
    700 
    701         /* async_futex not held after fibril_switch() */
     704
     705        fibril_switch(FIBRIL_FROM_BLOCKED);
     706        futex_unlock(&async_futex);
    702707}
    703708
Note: See TracChangeset for help on using the changeset viewer.