1*820c1a8dSHiroo HAYASHI /* Plain recursive mutexes (native Windows implementation). 2*820c1a8dSHiroo HAYASHI Copyright (C) 2005-2021 Free Software Foundation, Inc. 3*820c1a8dSHiroo HAYASHI 4*820c1a8dSHiroo HAYASHI This file is free software: you can redistribute it and/or modify 5*820c1a8dSHiroo HAYASHI it under the terms of the GNU Lesser General Public License as 6*820c1a8dSHiroo HAYASHI published by the Free Software Foundation; either version 2.1 of the 7*820c1a8dSHiroo HAYASHI License, or (at your option) any later version. 8*820c1a8dSHiroo HAYASHI 9*820c1a8dSHiroo HAYASHI This file is distributed in the hope that it will be useful, 10*820c1a8dSHiroo HAYASHI but WITHOUT ANY WARRANTY; without even the implied warranty of 11*820c1a8dSHiroo HAYASHI MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*820c1a8dSHiroo HAYASHI GNU Lesser General Public License for more details. 13*820c1a8dSHiroo HAYASHI 14*820c1a8dSHiroo HAYASHI You should have received a copy of the GNU Lesser General Public License 15*820c1a8dSHiroo HAYASHI along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16*820c1a8dSHiroo HAYASHI 17*820c1a8dSHiroo HAYASHI /* Written by Bruno Haible <bruno@clisp.org>, 2005. 18*820c1a8dSHiroo HAYASHI Based on GCC's gthr-win32.h. */ 19*820c1a8dSHiroo HAYASHI 20*820c1a8dSHiroo HAYASHI #ifndef _WINDOWS_RECMUTEX_H 21*820c1a8dSHiroo HAYASHI #define _WINDOWS_RECMUTEX_H 22*820c1a8dSHiroo HAYASHI 23*820c1a8dSHiroo HAYASHI #define WIN32_LEAN_AND_MEAN /* avoid including junk */ 24*820c1a8dSHiroo HAYASHI #include <windows.h> 25*820c1a8dSHiroo HAYASHI 26*820c1a8dSHiroo HAYASHI #include "windows-initguard.h" 27*820c1a8dSHiroo HAYASHI 28*820c1a8dSHiroo HAYASHI /* The native Windows documentation says that CRITICAL_SECTION already 29*820c1a8dSHiroo HAYASHI implements a recursive lock. But we need not rely on it: It's easy to 30*820c1a8dSHiroo HAYASHI implement a recursive lock without this assumption. */ 31*820c1a8dSHiroo HAYASHI 32*820c1a8dSHiroo HAYASHI typedef struct 33*820c1a8dSHiroo HAYASHI { 34*820c1a8dSHiroo HAYASHI glwthread_initguard_t guard; /* protects the initialization */ 35*820c1a8dSHiroo HAYASHI DWORD owner; 36*820c1a8dSHiroo HAYASHI unsigned long depth; 37*820c1a8dSHiroo HAYASHI CRITICAL_SECTION lock; 38*820c1a8dSHiroo HAYASHI } 39*820c1a8dSHiroo HAYASHI glwthread_recmutex_t; 40*820c1a8dSHiroo HAYASHI 41*820c1a8dSHiroo HAYASHI #define GLWTHREAD_RECMUTEX_INIT { GLWTHREAD_INITGUARD_INIT, 0, 0 } 42*820c1a8dSHiroo HAYASHI 43*820c1a8dSHiroo HAYASHI #ifdef __cplusplus 44*820c1a8dSHiroo HAYASHI extern "C" { 45*820c1a8dSHiroo HAYASHI #endif 46*820c1a8dSHiroo HAYASHI 47*820c1a8dSHiroo HAYASHI extern void glwthread_recmutex_init (glwthread_recmutex_t *mutex); 48*820c1a8dSHiroo HAYASHI extern int glwthread_recmutex_lock (glwthread_recmutex_t *mutex); 49*820c1a8dSHiroo HAYASHI extern int glwthread_recmutex_trylock (glwthread_recmutex_t *mutex); 50*820c1a8dSHiroo HAYASHI extern int glwthread_recmutex_unlock (glwthread_recmutex_t *mutex); 51*820c1a8dSHiroo HAYASHI extern int glwthread_recmutex_destroy (glwthread_recmutex_t *mutex); 52*820c1a8dSHiroo HAYASHI 53*820c1a8dSHiroo HAYASHI #ifdef __cplusplus 54*820c1a8dSHiroo HAYASHI } 55*820c1a8dSHiroo HAYASHI #endif 56*820c1a8dSHiroo HAYASHI 57*820c1a8dSHiroo HAYASHI #endif /* _WINDOWS_RECMUTEX_H */ 58