xref: /freebsd/sys/contrib/openzfs/lib/libspl/mutex.c (revision 8ac904ce090b1c2e355da8aa122ca2252183f4e1)
1*8ac904ceSMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2*8ac904ceSMartin Matuska /*
3*8ac904ceSMartin Matuska  * CDDL HEADER START
4*8ac904ceSMartin Matuska  *
5*8ac904ceSMartin Matuska  * The contents of this file are subject to the terms of the
6*8ac904ceSMartin Matuska  * Common Development and Distribution License (the "License").
7*8ac904ceSMartin Matuska  * You may not use this file except in compliance with the License.
8*8ac904ceSMartin Matuska  *
9*8ac904ceSMartin Matuska  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*8ac904ceSMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
11*8ac904ceSMartin Matuska  * See the License for the specific language governing permissions
12*8ac904ceSMartin Matuska  * and limitations under the License.
13*8ac904ceSMartin Matuska  *
14*8ac904ceSMartin Matuska  * When distributing Covered Code, include this CDDL HEADER in each
15*8ac904ceSMartin Matuska  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*8ac904ceSMartin Matuska  * If applicable, add the following below this CDDL HEADER, with the
17*8ac904ceSMartin Matuska  * fields enclosed by brackets "[]" replaced with your own identifying
18*8ac904ceSMartin Matuska  * information: Portions Copyright [yyyy] [name of copyright owner]
19*8ac904ceSMartin Matuska  *
20*8ac904ceSMartin Matuska  * CDDL HEADER END
21*8ac904ceSMartin Matuska  */
22*8ac904ceSMartin Matuska /*
23*8ac904ceSMartin Matuska  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24*8ac904ceSMartin Matuska  * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
25*8ac904ceSMartin Matuska  * Copyright (c) 2016 Actifio, Inc. All rights reserved.
26*8ac904ceSMartin Matuska  * Copyright (c) 2025, Klara, Inc.
27*8ac904ceSMartin Matuska  */
28*8ac904ceSMartin Matuska 
29*8ac904ceSMartin Matuska #include <assert.h>
30*8ac904ceSMartin Matuska #include <pthread.h>
31*8ac904ceSMartin Matuska #include <string.h>
32*8ac904ceSMartin Matuska #include <errno.h>
33*8ac904ceSMartin Matuska #include <sys/mutex.h>
34*8ac904ceSMartin Matuska 
35*8ac904ceSMartin Matuska /*
36*8ac904ceSMartin Matuska  * =========================================================================
37*8ac904ceSMartin Matuska  * mutexes
38*8ac904ceSMartin Matuska  * =========================================================================
39*8ac904ceSMartin Matuska  */
40*8ac904ceSMartin Matuska 
41*8ac904ceSMartin Matuska void
mutex_init(kmutex_t * mp,char * name,int type,void * cookie)42*8ac904ceSMartin Matuska mutex_init(kmutex_t *mp, char *name, int type, void *cookie)
43*8ac904ceSMartin Matuska {
44*8ac904ceSMartin Matuska 	(void) name, (void) type, (void) cookie;
45*8ac904ceSMartin Matuska 	VERIFY0(pthread_mutex_init(&mp->m_lock, NULL));
46*8ac904ceSMartin Matuska 	memset(&mp->m_owner, 0, sizeof (pthread_t));
47*8ac904ceSMartin Matuska }
48*8ac904ceSMartin Matuska 
49*8ac904ceSMartin Matuska void
mutex_destroy(kmutex_t * mp)50*8ac904ceSMartin Matuska mutex_destroy(kmutex_t *mp)
51*8ac904ceSMartin Matuska {
52*8ac904ceSMartin Matuska 	VERIFY0(pthread_mutex_destroy(&mp->m_lock));
53*8ac904ceSMartin Matuska }
54*8ac904ceSMartin Matuska 
55*8ac904ceSMartin Matuska void
mutex_enter(kmutex_t * mp)56*8ac904ceSMartin Matuska mutex_enter(kmutex_t *mp)
57*8ac904ceSMartin Matuska {
58*8ac904ceSMartin Matuska 	VERIFY0(pthread_mutex_lock(&mp->m_lock));
59*8ac904ceSMartin Matuska 	mp->m_owner = pthread_self();
60*8ac904ceSMartin Matuska }
61*8ac904ceSMartin Matuska 
62*8ac904ceSMartin Matuska int
mutex_enter_check_return(kmutex_t * mp)63*8ac904ceSMartin Matuska mutex_enter_check_return(kmutex_t *mp)
64*8ac904ceSMartin Matuska {
65*8ac904ceSMartin Matuska 	int error = pthread_mutex_lock(&mp->m_lock);
66*8ac904ceSMartin Matuska 	if (error == 0)
67*8ac904ceSMartin Matuska 		mp->m_owner = pthread_self();
68*8ac904ceSMartin Matuska 	return (error);
69*8ac904ceSMartin Matuska }
70*8ac904ceSMartin Matuska 
71*8ac904ceSMartin Matuska int
mutex_tryenter(kmutex_t * mp)72*8ac904ceSMartin Matuska mutex_tryenter(kmutex_t *mp)
73*8ac904ceSMartin Matuska {
74*8ac904ceSMartin Matuska 	int error = pthread_mutex_trylock(&mp->m_lock);
75*8ac904ceSMartin Matuska 	if (error == 0) {
76*8ac904ceSMartin Matuska 		mp->m_owner = pthread_self();
77*8ac904ceSMartin Matuska 		return (1);
78*8ac904ceSMartin Matuska 	} else {
79*8ac904ceSMartin Matuska 		VERIFY3S(error, ==, EBUSY);
80*8ac904ceSMartin Matuska 		return (0);
81*8ac904ceSMartin Matuska 	}
82*8ac904ceSMartin Matuska }
83*8ac904ceSMartin Matuska 
84*8ac904ceSMartin Matuska void
mutex_exit(kmutex_t * mp)85*8ac904ceSMartin Matuska mutex_exit(kmutex_t *mp)
86*8ac904ceSMartin Matuska {
87*8ac904ceSMartin Matuska 	memset(&mp->m_owner, 0, sizeof (pthread_t));
88*8ac904ceSMartin Matuska 	VERIFY0(pthread_mutex_unlock(&mp->m_lock));
89*8ac904ceSMartin Matuska }
90