root/maint/gnulib/lib/windows-rwlock.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /* Read-write locks (native Windows implementation).
   2    Copyright (C) 2005-2021 Free Software Foundation, Inc.
   3 
   4    This file is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU Lesser General Public License as
   6    published by the Free Software Foundation; either version 2.1 of the
   7    License, or (at your option) any later version.
   8 
   9    This file is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU Lesser General Public License for more details.
  13 
  14    You should have received a copy of the GNU Lesser General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
  18    Based on GCC's gthr-win32.h.  */
  19 
  20 #ifndef _WINDOWS_RWLOCK_H
  21 #define _WINDOWS_RWLOCK_H
  22 
  23 #define WIN32_LEAN_AND_MEAN  /* avoid including junk */
  24 #include <windows.h>
  25 
  26 #include "windows-initguard.h"
  27 
  28 /* It is impossible to implement read-write locks using plain locks, without
  29    introducing an extra thread dedicated to managing read-write locks.
  30    Therefore here we need to use the low-level Event type.  */
  31 
  32 typedef struct
  33         {
  34           HANDLE *array; /* array of waiting threads, each represented by an event */
  35           unsigned int count; /* number of waiting threads */
  36           unsigned int alloc; /* length of allocated array */
  37           unsigned int offset; /* index of first waiting thread in array */
  38         }
  39         glwthread_carray_waitqueue_t;
  40 typedef struct
  41         {
  42           glwthread_initguard_t guard; /* protects the initialization */
  43           CRITICAL_SECTION lock; /* protects the remaining fields */
  44           glwthread_carray_waitqueue_t waiting_readers; /* waiting readers */
  45           glwthread_carray_waitqueue_t waiting_writers; /* waiting writers */
  46           int runcount; /* number of readers running, or -1 when a writer runs */
  47         }
  48         glwthread_rwlock_t;
  49 
  50 #define GLWTHREAD_RWLOCK_INIT { GLWTHREAD_INITGUARD_INIT }
  51 
  52 #ifdef __cplusplus
  53 extern "C" {
  54 #endif
  55 
  56 extern void glwthread_rwlock_init (glwthread_rwlock_t *lock);
  57 extern int glwthread_rwlock_rdlock (glwthread_rwlock_t *lock);
  58 extern int glwthread_rwlock_wrlock (glwthread_rwlock_t *lock);
  59 extern int glwthread_rwlock_tryrdlock (glwthread_rwlock_t *lock);
  60 extern int glwthread_rwlock_trywrlock (glwthread_rwlock_t *lock);
  61 extern int glwthread_rwlock_unlock (glwthread_rwlock_t *lock);
  62 extern int glwthread_rwlock_destroy (glwthread_rwlock_t *lock);
  63 
  64 #ifdef __cplusplus
  65 }
  66 #endif
  67 
  68 #endif /* _WINDOWS_RWLOCK_H */

/* [previous][next][first][last][top][bottom][index][help] */