Ignore:
File:
1 edited

Legend:

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

    rab6edb6 ra55d76b1  
    4545#include <stdio.h>
    4646#include "private/async.h"
    47 #include "private/fibril.h"
    4847
    4948static void optimize_execution_power(void)
     
    106105        fibril_t *f = (fibril_t *) fibril_get_id();
    107106
    108         futex_lock(&async_futex);
     107        futex_down(&async_futex);
    109108        if (fm->counter-- <= 0) {
    110109                awaiter_t wdata;
     
    116115                check_for_deadlock(&fm->oi);
    117116                f->waits_for = &fm->oi;
    118                 fibril_switch(FIBRIL_FROM_BLOCKED);
     117                fibril_switch(FIBRIL_TO_MANAGER);
    119118        } else {
    120119                fm->oi.owned_by = f;
    121         }
    122         futex_unlock(&async_futex);
     120                futex_up(&async_futex);
     121        }
    123122}
    124123
     
    127126        bool locked = false;
    128127
    129         futex_lock(&async_futex);
     128        futex_down(&async_futex);
    130129        if (fm->counter > 0) {
    131130                fm->counter--;
     
    133132                locked = true;
    134133        }
    135         futex_unlock(&async_futex);
     134        futex_up(&async_futex);
    136135
    137136        return locked;
     
    166165{
    167166        assert(fibril_mutex_is_locked(fm));
    168         futex_lock(&async_futex);
     167        futex_down(&async_futex);
    169168        _fibril_mutex_unlock_unsafe(fm);
    170         futex_unlock(&async_futex);
     169        futex_up(&async_futex);
    171170}
    172171
     
    175174        bool locked = false;
    176175
    177         futex_lock(&async_futex);
     176        futex_down(&async_futex);
    178177        if (fm->counter <= 0)
    179178                locked = true;
    180         futex_unlock(&async_futex);
     179        futex_up(&async_futex);
    181180
    182181        return locked;
     
    195194        fibril_t *f = (fibril_t *) fibril_get_id();
    196195
    197         futex_lock(&async_futex);
     196        futex_down(&async_futex);
    198197        if (frw->writers) {
    199198                awaiter_t wdata;
     
    202201                wdata.fid = (fid_t) f;
    203202                wdata.wu_event.inlist = true;
    204                 f->is_writer = false;
     203                f->flags &= ~FIBRIL_WRITER;
    205204                list_append(&wdata.wu_event.link, &frw->waiters);
    206205                check_for_deadlock(&frw->oi);
    207206                f->waits_for = &frw->oi;
    208                 fibril_switch(FIBRIL_FROM_BLOCKED);
     207                fibril_switch(FIBRIL_TO_MANAGER);
    209208        } else {
    210209                /* Consider the first reader the owner. */
    211210                if (frw->readers++ == 0)
    212211                        frw->oi.owned_by = f;
    213         }
    214         futex_unlock(&async_futex);
     212                futex_up(&async_futex);
     213        }
    215214}
    216215
     
    219218        fibril_t *f = (fibril_t *) fibril_get_id();
    220219
    221         futex_lock(&async_futex);
     220        futex_down(&async_futex);
    222221        if (frw->writers || frw->readers) {
    223222                awaiter_t wdata;
     
    226225                wdata.fid = (fid_t) f;
    227226                wdata.wu_event.inlist = true;
    228                 f->is_writer = true;
     227                f->flags |= FIBRIL_WRITER;
    229228                list_append(&wdata.wu_event.link, &frw->waiters);
    230229                check_for_deadlock(&frw->oi);
    231230                f->waits_for = &frw->oi;
    232                 fibril_switch(FIBRIL_FROM_BLOCKED);
     231                fibril_switch(FIBRIL_TO_MANAGER);
    233232        } else {
    234233                frw->oi.owned_by = f;
    235234                frw->writers++;
    236         }
    237         futex_unlock(&async_futex);
     235                futex_up(&async_futex);
     236        }
    238237}
    239238
    240239static void _fibril_rwlock_common_unlock(fibril_rwlock_t *frw)
    241240{
    242         futex_lock(&async_futex);
     241        futex_down(&async_futex);
    243242        if (frw->readers) {
    244243                if (--frw->readers) {
     
    277276                f->waits_for = NULL;
    278277
    279                 if (f->is_writer) {
     278                if (f->flags & FIBRIL_WRITER) {
    280279                        if (frw->readers)
    281280                                break;
     
    301300        }
    302301out:
    303         futex_unlock(&async_futex);
     302        futex_up(&async_futex);
    304303}
    305304
     
    320319        bool locked = false;
    321320
    322         futex_lock(&async_futex);
     321        futex_down(&async_futex);
    323322        if (frw->readers)
    324323                locked = true;
    325         futex_unlock(&async_futex);
     324        futex_up(&async_futex);
    326325
    327326        return locked;
     
    332331        bool locked = false;
    333332
    334         futex_lock(&async_futex);
     333        futex_down(&async_futex);
    335334        if (frw->writers) {
    336335                assert(frw->writers == 1);
    337336                locked = true;
    338337        }
    339         futex_unlock(&async_futex);
     338        futex_up(&async_futex);
    340339
    341340        return locked;
     
    369368        wdata.wu_event.inlist = true;
    370369
    371         futex_lock(&async_futex);
     370        futex_down(&async_futex);
    372371        if (timeout) {
    373372                getuptime(&wdata.to_event.expires);
     
    377376        list_append(&wdata.wu_event.link, &fcv->waiters);
    378377        _fibril_mutex_unlock_unsafe(fm);
    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.
     378        fibril_switch(FIBRIL_TO_MANAGER);
    385379        fibril_mutex_lock(fm);
    386380
    387         futex_lock(&async_futex);
     381        /* async_futex not held after fibril_switch() */
     382        futex_down(&async_futex);
    388383        if (wdata.to_event.inlist)
    389384                list_remove(&wdata.to_event.link);
    390385        if (wdata.wu_event.inlist)
    391386                list_remove(&wdata.wu_event.link);
    392         futex_unlock(&async_futex);
     387        futex_up(&async_futex);
    393388
    394389        return wdata.to_event.occurred ? ETIMEOUT : EOK;
     
    408403        awaiter_t *wdp;
    409404
    410         futex_lock(&async_futex);
     405        futex_down(&async_futex);
    411406        while (!list_empty(&fcv->waiters)) {
    412407                tmp = list_first(&fcv->waiters);
     
    422417                }
    423418        }
    424         futex_unlock(&async_futex);
     419        futex_up(&async_futex);
    425420}
    426421
     
    661656void fibril_semaphore_up(fibril_semaphore_t *sem)
    662657{
    663         futex_lock(&async_futex);
     658        futex_down(&async_futex);
    664659        sem->count++;
    665660
    666661        if (sem->count > 0) {
    667                 futex_unlock(&async_futex);
     662                futex_up(&async_futex);
    668663                return;
    669664        }
     
    673668        list_remove(tmp);
    674669
    675         futex_unlock(&async_futex);
     670        futex_up(&async_futex);
    676671
    677672        awaiter_t *wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
     
    689684void fibril_semaphore_down(fibril_semaphore_t *sem)
    690685{
    691         futex_lock(&async_futex);
     686        futex_down(&async_futex);
    692687        sem->count--;
    693688
    694689        if (sem->count >= 0) {
    695                 futex_unlock(&async_futex);
     690                futex_up(&async_futex);
    696691                return;
    697692        }
     
    702697        wdata.fid = fibril_get_id();
    703698        list_append(&wdata.wu_event.link, &sem->waiters);
    704 
    705         fibril_switch(FIBRIL_FROM_BLOCKED);
    706         futex_unlock(&async_futex);
     699        fibril_switch(FIBRIL_TO_MANAGER);
     700
     701        /* async_futex not held after fibril_switch() */
    707702}
    708703
Note: See TracChangeset for help on using the changeset viewer.