Changeset c721d26 in mainline for uspace/lib/c/generic/fibril.c


Ignore:
Timestamp:
2015-06-16T14:18:22Z (10 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2654afb
Parents:
f7aa7a40
Message:

The async_futex must also be held during FIBRIL_FROM_DEAD.
Add the missing futex_down() to fibril_main() and async_manager().
Add an assert to fibril_switch().

File:
1 edited

Legend:

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

    rf7aa7a40 rc721d26  
    9696        fibril->retval = fibril->func(fibril->arg);
    9797       
     98        futex_down(&async_futex);
    9899        fibril_switch(FIBRIL_FROM_DEAD);
    99100        /* Not reached */
     
    147148/** Switch from the current fibril.
    148149 *
    149  * If calling with FIBRIL_TO_MANAGER parameter, the async_futex should be
    150  * held.
     150 * If stype is FIBRIL_TO_MANAGER or FIBRIL_FROM_DEAD, the async_futex must
     151 * be held.
    151152 *
    152153 * @param stype Switch type. One of FIBRIL_PREEMPT, FIBRIL_TO_MANAGER,
     
    163164       
    164165        futex_lock(&fibril_futex);
    165        
     166
    166167        if (stype == FIBRIL_PREEMPT && list_empty(&ready_list))
    167168                goto ret_0;
     
    183184        /* If we are going to manager and none exists, create it */
    184185        if ((stype == FIBRIL_TO_MANAGER) || (stype == FIBRIL_FROM_DEAD)) {
     186                /* Make sure the async_futex is held. */
     187                assert((atomic_signed_t) async_futex.val.count <= 0);
     188
    185189                while (list_empty(&manager_list)) {
    186190                        futex_unlock(&fibril_futex);
Note: See TracChangeset for help on using the changeset viewer.