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