Changeset 357b5f5 in mainline for uspace/lib/c/generic/fibril_synch.c


Ignore:
Timestamp:
2011-01-23T20:09:13Z (15 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fdb9982c
Parents:
cead2aa (diff), 7e36c8d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    rcead2aa r357b5f5  
    104104        fibril_t *f = (fibril_t *) fibril_get_id();
    105105
     106        if (fibril_get_sercount() != 0)
     107                core();
     108
    106109        futex_down(&async_futex);
    107110        if (fm->counter-- <= 0) {
     
    139142static void _fibril_mutex_unlock_unsafe(fibril_mutex_t *fm)
    140143{
    141         assert(fm->counter <= 0);
    142144        if (fm->counter++ < 0) {
    143145                link_t *tmp;
     
    165167void fibril_mutex_unlock(fibril_mutex_t *fm)
    166168{
     169        assert(fibril_mutex_is_locked(fm));
    167170        futex_down(&async_futex);
    168171        _fibril_mutex_unlock_unsafe(fm);
    169172        futex_up(&async_futex);
     173}
     174
     175bool fibril_mutex_is_locked(fibril_mutex_t *fm)
     176{
     177        bool locked = false;
     178       
     179        futex_down(&async_futex);
     180        if (fm->counter <= 0)
     181                locked = true;
     182        futex_up(&async_futex);
     183       
     184        return locked;
    170185}
    171186
     
    182197        fibril_t *f = (fibril_t *) fibril_get_id();
    183198       
     199        if (fibril_get_sercount() != 0)
     200                core();
     201
    184202        futex_down(&async_futex);
    185203        if (frw->writers) {
     
    207225        fibril_t *f = (fibril_t *) fibril_get_id();
    208226       
     227        if (fibril_get_sercount() != 0)
     228                core();
     229
    209230        futex_down(&async_futex);
    210231        if (frw->writers || frw->readers) {
     
    230251{
    231252        futex_down(&async_futex);
    232         assert(frw->readers || (frw->writers == 1));
    233253        if (frw->readers) {
    234254                if (--frw->readers) {
     
    296316void fibril_rwlock_read_unlock(fibril_rwlock_t *frw)
    297317{
     318        assert(fibril_rwlock_is_read_locked(frw));
    298319        _fibril_rwlock_common_unlock(frw);
    299320}
     
    301322void fibril_rwlock_write_unlock(fibril_rwlock_t *frw)
    302323{
     324        assert(fibril_rwlock_is_write_locked(frw));
    303325        _fibril_rwlock_common_unlock(frw);
     326}
     327
     328bool fibril_rwlock_is_read_locked(fibril_rwlock_t *frw)
     329{
     330        bool locked = false;
     331
     332        futex_down(&async_futex);
     333        if (frw->readers)
     334                locked = true;
     335        futex_up(&async_futex);
     336
     337        return locked;
     338}
     339
     340bool fibril_rwlock_is_write_locked(fibril_rwlock_t *frw)
     341{
     342        bool locked = false;
     343
     344        futex_down(&async_futex);
     345        if (frw->writers) {
     346                assert(frw->writers == 1);
     347                locked = true;
     348        }
     349        futex_up(&async_futex);
     350
     351        return locked;
     352}
     353
     354bool fibril_rwlock_is_locked(fibril_rwlock_t *frw)
     355{
     356        return fibril_rwlock_is_read_locked(frw) ||
     357            fibril_rwlock_is_write_locked(frw);
    304358}
    305359
     
    314368{
    315369        awaiter_t wdata;
     370
     371        assert(fibril_mutex_is_locked(fm));
    316372
    317373        if (timeout < 0)
Note: See TracChangeset for help on using the changeset viewer.