From f76440c5c82def5a6e7541b224d9a5b794b689a1 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 15 Jul 2019 02:36:08 +0200 Subject: [PATCH] windows-spin: New module. * lib/windows-spin.h: New file. * lib/windows-spin.c: New file. * modules/windows-spin: New file. --- ChangeLog | 7 +++++ lib/windows-spin.c | 69 ++++++++++++++++++++++++++++++++++++++++++++ lib/windows-spin.h | 47 ++++++++++++++++++++++++++++++ modules/windows-spin | 27 +++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 lib/windows-spin.c create mode 100644 lib/windows-spin.h create mode 100644 modules/windows-spin diff --git a/ChangeLog b/ChangeLog index 1d9caebac8..6616163abb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2019-07-14 Bruno Haible + + windows-spin: New module. + * lib/windows-spin.h: New file. + * lib/windows-spin.c: New file. + * modules/windows-spin: New file. + 2019-07-14 Bruno Haible windows-timedrwlock: New module. diff --git a/lib/windows-spin.c b/lib/windows-spin.c new file mode 100644 index 0000000000..bccef07e6c --- /dev/null +++ b/lib/windows-spin.c @@ -0,0 +1,69 @@ +/* Spin locks (native Windows implementation). + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . */ + +/* Written by Bruno Haible , 2019. */ + +#include + +/* Specification. */ +#include "windows-spin.h" + +#include + +void +glwthread_spin_init (glwthread_spinlock_t *lock) +{ + lock->word = 0; +} + +int +glwthread_spin_lock (glwthread_spinlock_t *lock) +{ + /* Wait until lock->word becomes 0, then replace it with 1. */ + /* InterlockedCompareExchange + */ + while (InterlockedCompareExchange (&lock->word, 1, 0)) + ; + return 0; +} + +int +glwthread_spinlock_trylock (glwthread_spinlock_t *lock) +{ + /* If lock->word is 0, then replace it with 1. */ + /* InterlockedCompareExchange + */ + if (InterlockedCompareExchange (&lock->word, 1, 0)) + return EBUSY; + return 0; +} + +int +glwthread_spin_unlock (glwthread_spinlock_t *lock) +{ + /* If lock->word is 1, then replace it with 0. */ + /* InterlockedCompareExchange + */ + if (!InterlockedCompareExchange (&lock->word, 0, 1)) + return EINVAL; + return 0; +} + +int +glwthread_spin_destroy (glwthread_spinlock_t *lock) +{ + return 0; +} diff --git a/lib/windows-spin.h b/lib/windows-spin.h new file mode 100644 index 0000000000..47690f9289 --- /dev/null +++ b/lib/windows-spin.h @@ -0,0 +1,47 @@ +/* Spin locks (native Windows implementation). + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . */ + +/* Written by Bruno Haible , 2019. */ + +#ifndef _WINDOWS_SPIN_H +#define _WINDOWS_SPIN_H + +#define WIN32_LEAN_AND_MEAN /* avoid including junk */ +#include + +typedef struct + { + LONG volatile word; + } + glwthread_spinlock_t; + +#define GLWTHREAD_SPIN_INIT { 0 } + +#ifdef __cplusplus +extern "C" { +#endif + +extern void glwthread_spin_init (glwthread_spinlock_t *lock); +extern int glwthread_spin_lock (glwthread_spinlock_t *lock); +extern int glwthread_spin_trylock (glwthread_spinlock_t *lock); +extern int glwthread_spin_unlock (glwthread_spinlock_t *lock); +extern int glwthread_spin_destroy (glwthread_spinlock_t *lock); + +#ifdef __cplusplus +} +#endif + +#endif /* _WINDOWS_SPIN_H */ diff --git a/modules/windows-spin b/modules/windows-spin new file mode 100644 index 0000000000..687385ab82 --- /dev/null +++ b/modules/windows-spin @@ -0,0 +1,27 @@ +Description: +Spin locks (native Windows implementation). + +Files: +lib/windows-spin.h +lib/windows-spin.c + +Depends-on: + +configure.ac: +AC_REQUIRE([AC_CANONICAL_HOST]) +case "$host_os" in + mingw*) + AC_LIBOBJ([windows-spin]) + ;; +esac + +Makefile.am: + +Include: +"windows-spin.h" + +License: +LGPLv2+ + +Maintainer: +all -- 2.39.5