Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/synch/mutex.c

    r15d9fe6 r63e27ef  
    4646/** Initialize mutex.
    4747 *
    48  * @param mtx   Mutex.
    49  * @param type  Type of the mutex.
     48 * @param mtx  Mutex.
     49 * @param type Type of the mutex.
    5050 */
    5151void mutex_initialize(mutex_t *mtx, mutex_type_t type)
    5252{
    5353        mtx->type = type;
    54         mtx->owner = NULL;
    55         mtx->nesting = 0;
    5654        semaphore_initialize(&mtx->sem, 1);
    5755}
     
    5957/** Find out whether the mutex is currently locked.
    6058 *
    61  * @param mtx  Mutex.
    62  *
    63  * @return  True if the mutex is locked, false otherwise.
     59 * @param mtx           Mutex.
     60 * @return              True if the mutex is locked, false otherwise.
    6461 */
    6562bool mutex_locked(mutex_t *mtx)
     
    7471 * Timeout mode and non-blocking mode can be requested.
    7572 *
    76  * @param mtx    Mutex.
    77  * @param usec   Timeout in microseconds.
    78  * @param flags  Specify mode of operation.
     73 * @param mtx   Mutex.
     74 * @param usec  Timeout in microseconds.
     75 * @param flags Specify mode of operation.
    7976 *
    80  * For exact description of possible combinations of usec and flags, see
    81  * comment for waitq_sleep_timeout().
     77 * For exact description of possible combinations of
     78 * usec and flags, see comment for waitq_sleep_timeout().
    8279 *
    8380 * @return See comment for waitq_sleep_timeout().
     
    8885        int rc;
    8986
    90         if (mtx->type == MUTEX_PASSIVE && THREAD) {
     87        if ((mtx->type == MUTEX_PASSIVE) && (THREAD)) {
    9188                rc = _semaphore_down_timeout(&mtx->sem, usec, flags);
    92         } else if (mtx->type == MUTEX_RECURSIVE) {
    93                 assert(THREAD);
    94 
    95                 if (mtx->owner == THREAD) {
    96                         mtx->nesting++;
    97                         return ESYNCH_OK_ATOMIC;
    98                 } else {
    99                         rc = _semaphore_down_timeout(&mtx->sem, usec, flags);
    100                         if (SYNCH_OK(rc)) {
    101                                 mtx->owner = THREAD;
    102                                 mtx->nesting = 1;
    103                         }
    104                 }
    10589        } else {
    106                 assert((mtx->type == MUTEX_ACTIVE) || !THREAD);
     90                assert((mtx->type == MUTEX_ACTIVE) || (!THREAD));
    10791                assert(usec == SYNCH_NO_TIMEOUT);
    10892                assert(!(flags & SYNCH_FLAGS_INTERRUPTIBLE));
     
    130114/** Release mutex.
    131115 *
    132  * @param mtx  Mutex.
     116 * @param mtx Mutex.
    133117 */
    134118void mutex_unlock(mutex_t *mtx)
    135119{
    136         if (mtx->type == MUTEX_RECURSIVE) {
    137                 assert(mtx->owner == THREAD);
    138                 if (--mtx->nesting > 0)
    139                         return;
    140                 mtx->owner = NULL;
    141         }
    142120        semaphore_up(&mtx->sem);
    143121}
Note: See TracChangeset for help on using the changeset viewer.