Subversion Repositories HelenOS

Rev

Rev 2071 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2071 Rev 3186
Line 36... Line 36...
36
 */
36
 */
37
 
37
 
38
#include <synch/mutex.h>
38
#include <synch/mutex.h>
39
#include <synch/semaphore.h>
39
#include <synch/semaphore.h>
40
#include <synch/synch.h>
40
#include <synch/synch.h>
-
 
41
#include <debug.h>
41
 
42
 
42
/** Initialize mutex
43
/** Initialize mutex.
43
 *
44
 *
44
 * Initialize mutex.
45
 * @param mtx       Mutex.
45
 *
-
 
46
 * @param mtx Mutex.
46
 * @param type      Type of the mutex.
47
 */
47
 */
48
void mutex_initialize(mutex_t *mtx)
48
void mutex_initialize(mutex_t *mtx, mutex_type_t type)
49
{
49
{
-
 
50
    mtx->type = type;
50
    semaphore_initialize(&mtx->sem, 1);
51
    semaphore_initialize(&mtx->sem, 1);
51
}
52
}
52
 
53
 
53
/** Acquire mutex
54
/** Acquire mutex.
54
 *
55
 *
55
 * Acquire mutex.
-
 
56
 * Timeout mode and non-blocking mode can be requested.
56
 * Timeout mode and non-blocking mode can be requested.
57
 *
57
 *
58
 * @param mtx Mutex.
58
 * @param mtx       Mutex.
59
 * @param usec Timeout in microseconds.
59
 * @param usec      Timeout in microseconds.
60
 * @param flags Specify mode of operation.
60
 * @param flags     Specify mode of operation.
61
 *
61
 *
62
 * For exact description of possible combinations of
62
 * For exact description of possible combinations of
63
 * usec and flags, see comment for waitq_sleep_timeout().
63
 * usec and flags, see comment for waitq_sleep_timeout().
64
 *
64
 *
65
 * @return See comment for waitq_sleep_timeout().
65
 * @return      See comment for waitq_sleep_timeout().
66
 */
66
 */
67
int _mutex_lock_timeout(mutex_t *mtx, uint32_t usec, int flags)
67
int _mutex_lock_timeout(mutex_t *mtx, uint32_t usec, int flags)
68
{
68
{
-
 
69
    int rc;
-
 
70
 
-
 
71
    if (mtx->type == MUTEX_PASSIVE) {
69
    return _semaphore_down_timeout(&mtx->sem, usec, flags);
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;
70
}
84
}
71
 
85
 
72
/** Release mutex
86
/** Release mutex.
73
 *
-
 
74
 * Release mutex.
-
 
75
 *
87
 *
76
 * @param mtx Mutex.
88
 * @param mtx       Mutex.
77
 */
89
 */
78
void mutex_unlock(mutex_t *mtx)
90
void mutex_unlock(mutex_t *mtx)
79
{
91
{
80
    semaphore_up(&mtx->sem);
92
    semaphore_up(&mtx->sem);
81
}
93
}