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

Changeset 08a19ba in mainline for kernel/generic/src/synch/mutex.c


Ignore:
Timestamp:
2008-06-23T18:44:48Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
1a1744e
Parents:
deaf8d5
Message:

Support for active mutexes. Active mutexes implement busy waiting, pretty much
in the same way as spinlocks, but can be passed to condition variables, which is
the motivation for this enhancement.

File:
1 edited

Legend:

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

    rdeaf8d5 r08a19ba  
    3939#include <synch/semaphore.h>
    4040#include <synch/synch.h>
     41#include <debug.h>
    4142
    42 /** Initialize mutex
     43/** Initialize mutex.
    4344 *
    44  * Initialize mutex.
    45  *
    46  * @param mtx Mutex.
     45 * @param mtx           Mutex.
     46 * @param type          Type of the mutex.
    4747 */
    48 void mutex_initialize(mutex_t *mtx)
     48void mutex_initialize(mutex_t *mtx, mutex_type_t type)
    4949{
     50        mtx->type = type;
    5051        semaphore_initialize(&mtx->sem, 1);
    5152}
    5253
    53 /** Acquire mutex
     54/** Acquire mutex.
    5455 *
    55  * Acquire mutex.
    5656 * Timeout mode and non-blocking mode can be requested.
    5757 *
    58  * @param mtx Mutex.
    59  * @param usec Timeout in microseconds.
    60  * @param flags Specify mode of operation.
     58 * @param mtx           Mutex.
     59 * @param usec          Timeout in microseconds.
     60 * @param flags         Specify mode of operation.
    6161 *
    6262 * For exact description of possible combinations of
    6363 * usec and flags, see comment for waitq_sleep_timeout().
    6464 *
    65  * @return See comment for waitq_sleep_timeout().
     65 * @return              See comment for waitq_sleep_timeout().
    6666 */
    6767int _mutex_lock_timeout(mutex_t *mtx, uint32_t usec, int flags)
    6868{
    69         return _semaphore_down_timeout(&mtx->sem, usec, flags);
     69        int rc;
     70
     71        if (mtx->type == MUTEX_PASSIVE) {
     72                rc = _semaphore_down_timeout(&mtx->sem, usec, flags);
     73        } else {
     74                ASSERT(mtx->type == MUTEX_ACTIVE);
     75                ASSERT(usec == SYNCH_NO_TIMEOUT);
     76                ASSERT(!(flags & SYNCH_FLAGS_INTERRUPTIBLE));
     77                do {
     78                        rc = semaphore_trydown(&mtx->sem);
     79                } while (SYNCH_FAILED(rc) &&
     80                    !(flags & SYNCH_FLAGS_NON_BLOCKING));
     81        }
     82
     83        return rc;
    7084}
    7185
    72 /** Release mutex
     86/** Release mutex.
    7387 *
    74  * Release mutex.
    75  *
    76  * @param mtx Mutex.
     88 * @param mtx           Mutex.
    7789 */
    7890void mutex_unlock(mutex_t *mtx)
Note: See TracChangeset for help on using the changeset viewer.