Ignore:
File:
1 edited

Legend:

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

    rbbb01b98 r8619f25  
    3636#include <fibril.h>
    3737#include <async.h>
    38 #include <async_priv.h>
    3938#include <adt/list.h>
    4039#include <futex.h>
    41 #include <sys/time.h>
    42 #include <errno.h>
    4340#include <assert.h>
    4441
     
    6663        futex_down(&async_futex);
    6764        if (fm->counter-- <= 0) {
    68                 awaiter_t wdata;
    69 
    70                 wdata.fid = fibril_get_id();
    71                 wdata.active = false;
    72                 wdata.wu_event.inlist = true;
    73                 link_initialize(&wdata.wu_event.link);
    74                 list_append(&wdata.wu_event.link, &fm->waiters);
     65                fibril_t *f = (fibril_t *) fibril_get_id();
     66                list_append(&f->link, &fm->waiters);
    7567                fibril_switch(FIBRIL_TO_MANAGER);
    7668        } else {
     
    9890        if (fm->counter++ < 0) {
    9991                link_t *tmp;
    100                 awaiter_t *wdp;
     92                fibril_t *f;
    10193       
    10294                assert(!list_empty(&fm->waiters));
    10395                tmp = fm->waiters.next;
    104                 wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
    105                 wdp->active = true;
    106                 wdp->wu_event.inlist = false;
    107                 list_remove(&wdp->wu_event.link);
    108                 fibril_add_ready(wdp->fid);
     96                f = list_get_instance(tmp, fibril_t, link);
     97                list_remove(&f->link);
     98                fibril_add_ready((fid_t) f);
    10999                optimize_execution_power();
    110100        }
     
    130120        if (frw->writers) {
    131121                fibril_t *f = (fibril_t *) fibril_get_id();
    132                 awaiter_t wdata;
    133 
    134                 wdata.fid = (fid_t) f;
    135                 wdata.active = false;
    136                 wdata.wu_event.inlist = true;
    137                 link_initialize(&wdata.wu_event.link);
    138122                f->flags &= ~FIBRIL_WRITER;
    139                 list_append(&wdata.wu_event.link, &frw->waiters);
     123                list_append(&f->link, &frw->waiters);
    140124                fibril_switch(FIBRIL_TO_MANAGER);
    141125        } else {
     
    150134        if (frw->writers || frw->readers) {
    151135                fibril_t *f = (fibril_t *) fibril_get_id();
    152                 awaiter_t wdata;
    153 
    154                 wdata.fid = (fid_t) f;
    155                 wdata.active = false;
    156                 wdata.wu_event.inlist = true;
    157                 link_initialize(&wdata.wu_event.link);
    158136                f->flags |= FIBRIL_WRITER;
    159                 list_append(&wdata.wu_event.link, &frw->waiters);
     137                list_append(&f->link, &frw->waiters);
    160138                fibril_switch(FIBRIL_TO_MANAGER);
    161139        } else {
     
    180158        while (!list_empty(&frw->waiters)) {
    181159                link_t *tmp = frw->waiters.next;
    182                 awaiter_t *wdp;
    183                 fibril_t *f;
    184                
    185                 wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
    186                 f = (fibril_t *) wdp->fid;
     160                fibril_t *f = list_get_instance(tmp, fibril_t, link);
    187161               
    188162                if (f->flags & FIBRIL_WRITER) {
    189163                        if (frw->readers)
    190164                                break;
    191                         wdp->active = true;
    192                         wdp->wu_event.inlist = false;
    193                         list_remove(&wdp->wu_event.link);
    194                         fibril_add_ready(wdp->fid);
     165                        list_remove(&f->link);
     166                        fibril_add_ready((fid_t) f);
    195167                        frw->writers++;
    196168                        optimize_execution_power();
    197169                        break;
    198170                } else {
    199                         wdp->active = true;
    200                         wdp->wu_event.inlist = false;
    201                         list_remove(&wdp->wu_event.link);
    202                         fibril_add_ready(wdp->fid);
     171                        list_remove(&f->link);
     172                        fibril_add_ready((fid_t) f);
    203173                        frw->readers++;
    204174                        optimize_execution_power();
     
    224194}
    225195
    226 int
    227 fibril_condvar_wait_timeout(fibril_condvar_t *fcv, fibril_mutex_t *fm,
    228     suseconds_t timeout)
    229 {
    230         awaiter_t wdata;
    231 
    232         if (timeout < 0)
    233                 return ETIMEOUT;
    234 
    235         wdata.fid = fibril_get_id();
    236         wdata.active = false;
    237        
    238         wdata.to_event.inlist = timeout > 0;
    239         wdata.to_event.occurred = false;
    240         link_initialize(&wdata.to_event.link);
    241 
    242         wdata.wu_event.inlist = true;
    243         link_initialize(&wdata.wu_event.link);
    244 
    245         futex_down(&async_futex);
    246         if (timeout) {
    247                 gettimeofday(&wdata.to_event.expires, NULL);
    248                 tv_add(&wdata.to_event.expires, timeout);
    249                 async_insert_timeout(&wdata);
    250         }
    251         list_append(&wdata.wu_event.link, &fcv->waiters);
     196void fibril_condvar_wait(fibril_condvar_t *fcv, fibril_mutex_t *fm)
     197{
     198        fibril_t *f = (fibril_t *) fibril_get_id();
     199
     200        futex_down(&async_futex);
     201        list_append(&f->link, &fcv->waiters);
    252202        _fibril_mutex_unlock_unsafe(fm);
    253203        fibril_switch(FIBRIL_TO_MANAGER);
    254204        fibril_mutex_lock(fm);
    255 
    256         /* async_futex not held after fibril_switch() */
    257         futex_down(&async_futex);
    258         if (wdata.to_event.inlist)
    259                 list_remove(&wdata.to_event.link);
    260         if (wdata.wu_event.inlist)
    261                 list_remove(&wdata.wu_event.link);
    262         futex_up(&async_futex);
    263        
    264         return wdata.to_event.occurred ? ETIMEOUT : EOK;
    265 }
    266 
    267 void fibril_condvar_wait(fibril_condvar_t *fcv, fibril_mutex_t *fm)
    268 {
    269         int rc;
    270 
    271         rc = fibril_condvar_wait_timeout(fcv, fm, 0);
    272         assert(rc == EOK);
    273205}
    274206
     
    276208{
    277209        link_t *tmp;
    278         awaiter_t *wdp;
     210        fibril_t *f;
    279211
    280212        futex_down(&async_futex);
    281213        while (!list_empty(&fcv->waiters)) {
    282214                tmp = fcv->waiters.next;
    283                 wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
    284                 list_remove(&wdp->wu_event.link);
    285                 wdp->wu_event.inlist = false;
    286                 if (!wdp->active) {
    287                         wdp->active = true;
    288                         fibril_add_ready(wdp->fid);
    289                         optimize_execution_power();
    290                         if (once)
    291                                 break;
    292                 }
     215                f = list_get_instance(tmp, fibril_t, link);
     216                list_remove(&f->link);
     217                fibril_add_ready((fid_t) f);
     218                optimize_execution_power();
     219                if (once)
     220                        break;
    293221        }
    294222        futex_up(&async_futex);
Note: See TracChangeset for help on using the changeset viewer.