(root)/
sed-4.9/
lib/
windows-rwlock.h
       1  /* Read-write locks (native Windows implementation).
       2     Copyright (C) 2005-2022 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 */