xref: /titanic_51/usr/src/lib/libfakekernel/common/mutex.c (revision b819cea2f73f98c5662230cc9affc8cc84f77fcf)
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
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
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
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
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
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 *
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
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