Blame gl/tests/windows-rwlock.h

Packit Service 4684c1
/* Read-write locks (native Windows implementation).
Packit Service 4684c1
   Copyright (C) 2005-2020 Free Software Foundation, Inc.
Packit Service 4684c1
Packit Service 4684c1
   This program is free software; you can redistribute it and/or modify
Packit Service 4684c1
   it under the terms of the GNU General Public License as published by
Packit Service 4684c1
   the Free Software Foundation; either version 3, or (at your option)
Packit Service 4684c1
   any later version.
Packit Service 4684c1
Packit Service 4684c1
   This program is distributed in the hope that it will be useful,
Packit Service 4684c1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 4684c1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 4684c1
   GNU General Public License for more details.
Packit Service 4684c1
Packit Service 4684c1
   You should have received a copy of the GNU General Public License
Packit Service 4684c1
   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
Packit Service 4684c1
Packit Service 4684c1
/* Written by Bruno Haible <bruno@clisp.org>, 2005.
Packit Service 4684c1
   Based on GCC's gthr-win32.h.  */
Packit Service 4684c1
Packit Service 4684c1
#ifndef _WINDOWS_RWLOCK_H
Packit Service 4684c1
#define _WINDOWS_RWLOCK_H
Packit Service 4684c1
Packit Service 4684c1
#define WIN32_LEAN_AND_MEAN  /* avoid including junk */
Packit Service 4684c1
#include <windows.h>
Packit Service 4684c1
Packit Service 4684c1
#include "windows-initguard.h"
Packit Service 4684c1
Packit Service 4684c1
/* It is impossible to implement read-write locks using plain locks, without
Packit Service 4684c1
   introducing an extra thread dedicated to managing read-write locks.
Packit Service 4684c1
   Therefore here we need to use the low-level Event type.  */
Packit Service 4684c1
Packit Service 4684c1
typedef struct
Packit Service 4684c1
        {
Packit Service 4684c1
          HANDLE *array; /* array of waiting threads, each represented by an event */
Packit Service 4684c1
          unsigned int count; /* number of waiting threads */
Packit Service 4684c1
          unsigned int alloc; /* length of allocated array */
Packit Service 4684c1
          unsigned int offset; /* index of first waiting thread in array */
Packit Service 4684c1
        }
Packit Service 4684c1
        glwthread_carray_waitqueue_t;
Packit Service 4684c1
typedef struct
Packit Service 4684c1
        {
Packit Service 4684c1
          glwthread_initguard_t guard; /* protects the initialization */
Packit Service 4684c1
          CRITICAL_SECTION lock; /* protects the remaining fields */
Packit Service 4684c1
          glwthread_carray_waitqueue_t waiting_readers; /* waiting readers */
Packit Service 4684c1
          glwthread_carray_waitqueue_t waiting_writers; /* waiting writers */
Packit Service 4684c1
          int runcount; /* number of readers running, or -1 when a writer runs */
Packit Service 4684c1
        }
Packit Service 4684c1
        glwthread_rwlock_t;
Packit Service 4684c1
Packit Service 4684c1
#define GLWTHREAD_RWLOCK_INIT { GLWTHREAD_INITGUARD_INIT }
Packit Service 4684c1
Packit Service 4684c1
#ifdef __cplusplus
Packit Service 4684c1
extern "C" {
Packit Service 4684c1
#endif
Packit Service 4684c1
Packit Service 4684c1
extern void glwthread_rwlock_init (glwthread_rwlock_t *lock);
Packit Service 4684c1
extern int glwthread_rwlock_rdlock (glwthread_rwlock_t *lock);
Packit Service 4684c1
extern int glwthread_rwlock_wrlock (glwthread_rwlock_t *lock);
Packit Service 4684c1
extern int glwthread_rwlock_tryrdlock (glwthread_rwlock_t *lock);
Packit Service 4684c1
extern int glwthread_rwlock_trywrlock (glwthread_rwlock_t *lock);
Packit Service 4684c1
extern int glwthread_rwlock_unlock (glwthread_rwlock_t *lock);
Packit Service 4684c1
extern int glwthread_rwlock_destroy (glwthread_rwlock_t *lock);
Packit Service 4684c1
Packit Service 4684c1
#ifdef __cplusplus
Packit Service 4684c1
}
Packit Service 4684c1
#endif
Packit Service 4684c1
Packit Service 4684c1
#endif /* _WINDOWS_RWLOCK_H */