Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset b69bec5 in mainline


Ignore:
Timestamp:
2009-10-11T10:48:56Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
bbb01b98
Parents:
854ad23
Message:

Make fibril RW-locks use the awaiter_t type for sleeping.
Timeouts are not supported.

File:
1 edited

Legend:

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

    r854ad23 rb69bec5  
    129129        if (frw->writers) {
    130130                fibril_t *f = (fibril_t *) fibril_get_id();
     131                awaiter_t wdata;
     132
     133                wdata.fid = (fid_t) f;
     134                wdata.active = false;
     135                wdata.wu_event.inlist = true;
     136                link_initialize(&wdata.wu_event.link);
    131137                f->flags &= ~FIBRIL_WRITER;
    132                 list_append(&f->link, &frw->waiters);
     138                list_append(&wdata.wu_event.link, &frw->waiters);
    133139                fibril_switch(FIBRIL_TO_MANAGER);
    134140        } else {
     
    143149        if (frw->writers || frw->readers) {
    144150                fibril_t *f = (fibril_t *) fibril_get_id();
     151                awaiter_t wdata;
     152
     153                wdata.fid = (fid_t) f;
     154                wdata.active = false;
     155                wdata.wu_event.inlist = true;
     156                link_initialize(&wdata.wu_event.link);
    145157                f->flags |= FIBRIL_WRITER;
    146                 list_append(&f->link, &frw->waiters);
     158                list_append(&wdata.wu_event.link, &frw->waiters);
    147159                fibril_switch(FIBRIL_TO_MANAGER);
    148160        } else {
     
    167179        while (!list_empty(&frw->waiters)) {
    168180                link_t *tmp = frw->waiters.next;
    169                 fibril_t *f = list_get_instance(tmp, fibril_t, link);
     181                awaiter_t *wdp;
     182                fibril_t *f;
     183               
     184                wdp = list_get_instance(tmp, awaiter_t, wu_event.link);
     185                f = (fibril_t *) wdp->fid;
    170186               
    171187                if (f->flags & FIBRIL_WRITER) {
    172188                        if (frw->readers)
    173189                                break;
    174                         list_remove(&f->link);
    175                         fibril_add_ready((fid_t) f);
     190                        wdp->active = true;
     191                        wdp->wu_event.inlist = false;
     192                        list_remove(&wdp->wu_event.link);
     193                        fibril_add_ready(wdp->fid);
    176194                        frw->writers++;
    177195                        optimize_execution_power();
    178196                        break;
    179197                } else {
    180                         list_remove(&f->link);
    181                         fibril_add_ready((fid_t) f);
     198                        wdp->active = true;
     199                        wdp->wu_event.inlist = false;
     200                        list_remove(&wdp->wu_event.link);
     201                        fibril_add_ready(wdp->fid);
    182202                        frw->readers++;
    183203                        optimize_execution_power();
Note: See TracChangeset for help on using the changeset viewer.