1*b819cea2SGordon Ross /*
2*b819cea2SGordon Ross * This file and its contents are supplied under the terms of the
3*b819cea2SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
4*b819cea2SGordon Ross * You may only use this file in accordance with the terms of version
5*b819cea2SGordon Ross * 1.0 of the CDDL.
6*b819cea2SGordon Ross *
7*b819cea2SGordon Ross * A full copy of the text of the CDDL should have accompanied this
8*b819cea2SGordon Ross * source. A copy of the CDDL is also available via the Internet at
9*b819cea2SGordon Ross * http://www.illumos.org/license/CDDL.
10*b819cea2SGordon Ross */
11*b819cea2SGordon Ross
12*b819cea2SGordon Ross /*
13*b819cea2SGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
14*b819cea2SGordon Ross */
15*b819cea2SGordon Ross
16*b819cea2SGordon Ross /*
17*b819cea2SGordon Ross * mutex(9f)
18*b819cea2SGordon Ross */
19*b819cea2SGordon Ross
20*b819cea2SGordon Ross /* This is the API we're emulating */
21*b819cea2SGordon Ross #include <sys/mutex.h>
22*b819cea2SGordon Ross
23*b819cea2SGordon Ross #include <sys/errno.h>
24*b819cea2SGordon Ross #include <sys/debug.h>
25*b819cea2SGordon Ross #include <sys/thread.h>
26*b819cea2SGordon Ross
27*b819cea2SGordon Ross int _lwp_mutex_lock(lwp_mutex_t *);
28*b819cea2SGordon Ross int _lwp_mutex_unlock(lwp_mutex_t *);
29*b819cea2SGordon Ross int _lwp_mutex_trylock(lwp_mutex_t *);
30*b819cea2SGordon Ross
31*b819cea2SGordon Ross extern clock_t ddi_get_lbolt(void);
32*b819cea2SGordon Ross extern void clock2ts(clock_t, timespec_t *);
33*b819cea2SGordon Ross
34*b819cea2SGordon Ross static const lwp_mutex_t default_mutex =
35*b819cea2SGordon Ross {{0, 0, 0, {USYNC_THREAD}, _MUTEX_MAGIC},
36*b819cea2SGordon Ross {{{0, 0, 0, 0, 0, 0, 0, 0}}}, 0};
37*b819cea2SGordon Ross
38*b819cea2SGordon Ross /* ARGSUSED */
39*b819cea2SGordon Ross void
kmutex_init(kmutex_t * mp,char * name,kmutex_type_t typ,void * arg)40*b819cea2SGordon Ross kmutex_init(kmutex_t *mp, char *name, kmutex_type_t typ, void *arg)
41*b819cea2SGordon Ross {
42*b819cea2SGordon Ross mp->m_lock = default_mutex;
43*b819cea2SGordon Ross mp->m_owner = _KTHREAD_INVALID;
44*b819cea2SGordon Ross }
45*b819cea2SGordon Ross
46*b819cea2SGordon Ross /* ARGSUSED */
47*b819cea2SGordon Ross void
kmutex_destroy(kmutex_t * mp)48*b819cea2SGordon Ross kmutex_destroy(kmutex_t *mp)
49*b819cea2SGordon Ross {
50*b819cea2SGordon Ross mp->m_owner = _KTHREAD_INVALID;
51*b819cea2SGordon Ross }
52*b819cea2SGordon Ross
53*b819cea2SGordon Ross void
mutex_enter(kmutex_t * mp)54*b819cea2SGordon Ross mutex_enter(kmutex_t *mp)
55*b819cea2SGordon Ross {
56*b819cea2SGordon Ross VERIFY(0 == _lwp_mutex_lock(&mp->m_lock));
57*b819cea2SGordon Ross mp->m_owner = _curthread();
58*b819cea2SGordon Ross }
59*b819cea2SGordon Ross
60*b819cea2SGordon Ross int
mutex_tryenter(kmutex_t * mp)61*b819cea2SGordon Ross mutex_tryenter(kmutex_t *mp)
62*b819cea2SGordon Ross {
63*b819cea2SGordon Ross int rc;
64*b819cea2SGordon Ross
65*b819cea2SGordon Ross rc = _lwp_mutex_trylock(&mp->m_lock);
66*b819cea2SGordon Ross if (rc == 0) {
67*b819cea2SGordon Ross mp->m_owner = _curthread();
68*b819cea2SGordon Ross return (1);
69*b819cea2SGordon Ross }
70*b819cea2SGordon Ross return (0);
71*b819cea2SGordon Ross }
72*b819cea2SGordon Ross
73*b819cea2SGordon Ross void
mutex_exit(kmutex_t * mp)74*b819cea2SGordon Ross mutex_exit(kmutex_t *mp)
75*b819cea2SGordon Ross {
76*b819cea2SGordon Ross ASSERT(mp->m_owner == _curthread());
77*b819cea2SGordon Ross mp->m_owner = _KTHREAD_INVALID;
78*b819cea2SGordon Ross (void) _lwp_mutex_unlock(&mp->m_lock);
79*b819cea2SGordon Ross }
80*b819cea2SGordon Ross
81*b819cea2SGordon Ross /*
82*b819cea2SGordon Ross * Returns the kthread_t * of the owner.
83*b819cea2SGordon Ross */
84*b819cea2SGordon Ross void *
mutex_owner(const kmutex_t * mp)85*b819cea2SGordon Ross mutex_owner(const kmutex_t *mp)
86*b819cea2SGordon Ross {
87*b819cea2SGordon Ross return (mp->m_owner);
88*b819cea2SGordon Ross }
89*b819cea2SGordon Ross
90*b819cea2SGordon Ross int
mutex_owned(const kmutex_t * mp)91*b819cea2SGordon Ross mutex_owned(const kmutex_t *mp)
92*b819cea2SGordon Ross {
93*b819cea2SGordon Ross void *t = _curthread();
94*b819cea2SGordon Ross return (t == mp->m_owner);
95*b819cea2SGordon Ross }
96