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