1*52ac02e4Skettenis /* $OpenBSD: mutex.h,v 1.10 2024/05/16 09:30:03 kettenis Exp $ */ 26a55782fSmiod 36a55782fSmiod /* 46a55782fSmiod * Copyright (c) 2004 Artur Grabowski <art@openbsd.org> 56a55782fSmiod * All rights reserved. 66a55782fSmiod * 76a55782fSmiod * Redistribution and use in source and binary forms, with or without 86a55782fSmiod * modification, are permitted provided that the following conditions 96a55782fSmiod * are met: 106a55782fSmiod * 116a55782fSmiod * 1. Redistributions of source code must retain the above copyright 126a55782fSmiod * notice, this list of conditions and the following disclaimer. 136a55782fSmiod * 2. The name of the author may not be used to endorse or promote products 146a55782fSmiod * derived from this software without specific prior written permission. 156a55782fSmiod * 166a55782fSmiod * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 176a55782fSmiod * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 186a55782fSmiod * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 196a55782fSmiod * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 206a55782fSmiod * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 216a55782fSmiod * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 226a55782fSmiod * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 236a55782fSmiod * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 246a55782fSmiod * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 256a55782fSmiod * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 266a55782fSmiod */ 276a55782fSmiod 286a55782fSmiod #ifndef _MACHINE_MUTEX_H_ 296a55782fSmiod #define _MACHINE_MUTEX_H_ 306a55782fSmiod 31c4925651Svisa #include <sys/_lock.h> 32c4925651Svisa 33965f575bSkettenis #define MUTEX_UNLOCKED { 1, 1, 1, 1 } 3423b21080Sjsing 3523b21080Sjsing /* Note: mtx_lock must be 16-byte aligned. */ 366a55782fSmiod struct mutex { 37423042ddSdlg #ifdef MULTIPROCESSOR 38965f575bSkettenis volatile int mtx_lock[4]; 39423042ddSdlg #endif 406a55782fSmiod int mtx_wantipl; 416a55782fSmiod int mtx_oldipl; 424c6d9147Smpi volatile void *mtx_owner; 43c4925651Svisa #ifdef WITNESS 44c4925651Svisa struct lock_object mtx_lock_obj; 45c4925651Svisa #endif 46965f575bSkettenis }; 476a55782fSmiod 487c44c179Skettenis #ifdef MULTIPROCESSOR 49c4925651Svisa #ifdef WITNESS 50c4925651Svisa #define MUTEX_INITIALIZER_FLAGS(ipl, name, flags) \ 51c4925651Svisa { MUTEX_UNLOCKED, __MUTEX_IPL((ipl)), 0, NULL, \ 52c4925651Svisa MTX_LO_INITIALIZER(name, flags) } 53c4925651Svisa #else /* WITNESS */ 54c4925651Svisa #define MUTEX_INITIALIZER_FLAGS(ipl, name, flags) \ 55c4925651Svisa { MUTEX_UNLOCKED, __MUTEX_IPL((ipl)), 0, NULL } 56c4925651Svisa #endif /* WITNESS */ 57c4925651Svisa #else /* MULTIPROCESSOR */ 58c4925651Svisa #define MUTEX_INITIALIZER_FLAGS(ipl, name, flags) \ 59c4925651Svisa { __MUTEX_IPL((ipl)), 0, NULL } 60c4925651Svisa #endif /* MULTIPROCESSOR */ 616a55782fSmiod 627c44c179Skettenis void __mtx_init(struct mutex *, int); 63c4925651Svisa #define _mtx_init(mtx, ipl) __mtx_init((mtx), __MUTEX_IPL((ipl))) 646a55782fSmiod 656a55782fSmiod #ifdef DIAGNOSTIC 666a55782fSmiod #define MUTEX_ASSERT_LOCKED(mtx) do { \ 67423042ddSdlg if ((mtx)->mtx_owner != curcpu()) \ 686a55782fSmiod panic("mutex %p not held in %s", (mtx), __func__); \ 696a55782fSmiod } while (0) 706a55782fSmiod 716a55782fSmiod #define MUTEX_ASSERT_UNLOCKED(mtx) do { \ 72423042ddSdlg if ((mtx)->mtx_owner == curcpu()) \ 736a55782fSmiod panic("mutex %p held in %s", (mtx), __func__); \ 746a55782fSmiod } while (0) 756a55782fSmiod #else 766a55782fSmiod #define MUTEX_ASSERT_LOCKED(mtx) do { } while (0) 776a55782fSmiod #define MUTEX_ASSERT_UNLOCKED(mtx) do { } while (0) 786a55782fSmiod #endif 796a55782fSmiod 80c4925651Svisa #define MUTEX_LOCK_OBJECT(mtx) (&(mtx)->mtx_lock_obj) 819f1a1266Smiod #define MUTEX_OLDIPL(mtx) (mtx)->mtx_oldipl 829f1a1266Smiod 836a55782fSmiod #endif 84