diff options
Diffstat (limited to 'libs/pthreads/src/semaphore.h')
-rw-r--r-- | libs/pthreads/src/semaphore.h | 203 |
1 files changed, 76 insertions, 127 deletions
diff --git a/libs/pthreads/src/semaphore.h b/libs/pthreads/src/semaphore.h index c6e9407e25..1288be8955 100644 --- a/libs/pthreads/src/semaphore.h +++ b/libs/pthreads/src/semaphore.h @@ -9,161 +9,110 @@ * * -------------------------------------------------------------------------- * - * Pthreads-win32 - POSIX Threads Library for Win32 + * Pthreads4w - POSIX Threads Library for Win32 * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * + * Copyright(C) 1999-2018, Pthreads4w contributors + * + * Homepage: https://sourceforge.net/projects/pthreads4w/ + * * The current list of contributors is contained * in the file CONTRIBUTORS included with the source * code distribution. The list can also be seen at the * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * https://sourceforge.net/p/pthreads4w/wiki/Contributors/ + * + * This file is part of Pthreads4w. + * + * Pthreads4w 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 3 of the License, or + * (at your option) any later version. + * + * Pthreads4w 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 Pthreads4w. If not, see <http://www.gnu.org/licenses/>. * */ #if !defined( SEMAPHORE_H ) #define SEMAPHORE_H -#undef PTW32_SEMAPHORE_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SEMAPHORE_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SEMAPHORE_LEVEL_MAX 3 - -#if !defined(PTW32_SEMAPHORE_LEVEL) -#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(__GNUC__) && ! defined (__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* +/* FIXME: POSIX.1 says that _POSIX_SEMAPHORES should be defined + * in <unistd.h>, not here; for later POSIX.1 versions, its value + * should match the corresponding _POSIX_VERSION number, but in + * the case of POSIX.1b-1993, the value is unspecified. * + * Notwithstanding the above, since POSIX semaphores, (and indeed + * having any <unistd.h> to #include), are not a standard feature + * on MS-Windows, it is convenient to retain this definition here; + * we may consider adding a hook, to make it selectively available + * for inclusion by <unistd.h>, in those cases (e.g. MinGW) where + * <unistd.h> is provided. */ - -#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include <errno.h> -#endif -#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */ - #define _POSIX_SEMAPHORES -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -#if !defined(HAVE_MODE_T) -typedef unsigned int mode_t; -#endif +/* Internal macros, common to the public interfaces for various + * Pthreads4w components, are defined in <_ptw32.h>; we must + * include them here. + */ +#include <_ptw32.h> +/* The sem_timedwait() function was added in POSIX.1-2001; it + * requires struct timespec to be defined, at least as a partial + * (a.k.a. incomplete) data type. Forward declare it as such, + * then include <time.h> selectively, to acquire a complete + * definition, (if available). + */ +struct timespec; +#define __need_struct_timespec +#include <time.h> +/* The data type used to represent our semaphore implementation, + * as required by POSIX.1; FIXME: consider renaming the underlying + * structure tag, to avoid possible pollution of user namespace. + */ typedef struct sem_t_ * sem_t; -PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, - int pshared, - unsigned int value); +/* POSIX.1b (and later) mandates SEM_FAILED as the value to be + * returned on failure of sem_open(); (our implementation is a + * stub, which will always return this). + */ +#define SEM_FAILED (sem_t *)(-1) + +__PTW32_BEGIN_C_DECLS -PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); +/* Function prototypes: some are implemented as stubs, which + * always fail; (FIXME: identify them). + */ +PTW32_DLLPORT int PTW32_CDECL sem_init (sem_t * sem, + int pshared, + unsigned int value); -PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); +PTW32_DLLPORT int PTW32_CDECL sem_destroy (sem_t * sem); -PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); +PTW32_DLLPORT int PTW32_CDECL sem_trywait (sem_t * sem); -PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, - const struct timespec * abstime); +PTW32_DLLPORT int PTW32_CDECL sem_wait (sem_t * sem); -PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); +PTW32_DLLPORT int PTW32_CDECL sem_timedwait (sem_t * sem, + const struct timespec * abstime); -PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, - int count); +PTW32_DLLPORT int PTW32_CDECL sem_post (sem_t * sem); -PTW32_DLLPORT int __cdecl sem_open (const char * name, - int oflag, - mode_t mode, - unsigned int value); +PTW32_DLLPORT int PTW32_CDECL sem_post_multiple (sem_t * sem, + int count); -PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); +PTW32_DLLPORT sem_t * PTW32_CDECL sem_open (const char *, int, ...); -PTW32_DLLPORT int __cdecl sem_unlink (const char * name); +PTW32_DLLPORT int PTW32_CDECL sem_close (sem_t * sem); -PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, - int * sval); +PTW32_DLLPORT int PTW32_CDECL sem_unlink (const char * name); -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ +PTW32_DLLPORT int PTW32_CDECL sem_getvalue (sem_t * sem, + int * sval); -#undef PTW32_SEMAPHORE_LEVEL -#undef PTW32_SEMAPHORE_LEVEL_MAX +__PTW32_END_C_DECLS #endif /* !SEMAPHORE_H */ |