/*
- * Module: semaphore.h
- *
- * Purpose:
- * Semaphores aren't actually part of the PThreads standard.
- * They are defined by the POSIX Standard:
- *
- * POSIX 1003.1b-1993 (POSIX.1b)
- *
- * --------------------------------------------------------------------------
- *
- * Pthreads-win32 - 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
- *
- * 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
- */
-#if !defined( SEMAPHORE_H )
-#define SEMAPHORE_H
-
-#undef PTW32_LEVEL
-
-#if defined(_POSIX_SOURCE)
-#define PTW32_LEVEL 0
-/* Early POSIX */
-#endif
-
-#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
-#undef PTW32_LEVEL
-#define PTW32_LEVEL 1
-/* Include 1b, 1c and 1d */
-#endif
-
-#if defined(INCLUDE_NP)
-#undef PTW32_LEVEL
-#define PTW32_LEVEL 2
-/* Include Non-Portable extensions */
-#endif
+ Copyright (c) 2011 mingw-w64 project
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef WIN_PTHREADS_SEMAPHORE_H
+#define WIN_PTHREADS_SEMAPHORE_H
-#define PTW32_LEVEL_MAX 3
-
-#if !defined(PTW32_LEVEL)
-#define PTW32_LEVEL PTW32_LEVEL_MAX
-/* Include everything */
-#endif
-
-#if __GNUC__ && ! defined (__declspec)
-# error Please upgrade your GNU compiler to one that supports __declspec.
+#ifdef __cplusplus
+extern "C" {
#endif
-/*
- * When building the DLL code, you should define PTW32_BUILD so that
- * the variables/functions are exported correctly. When using the DLL,
- * do NOT define PTW32_BUILD, and then the variables/functions will
- * be imported correctly.
- */
-#ifndef PTW32_STATIC_LIB
-# ifdef PTW32_BUILD
-# define PTW32_DLLPORT __declspec (dllexport)
-# else
-# define PTW32_DLLPORT __declspec (dllimport)
-# endif
+#if defined DLL_EXPORT && !defined (WINPTHREAD_EXPORT_ALL_DEBUG)
+#ifdef IN_WINPTHREAD
+#define WINPTHREAD_SEMA_API __declspec(dllexport)
#else
-# define PTW32_DLLPORT
+#define WINPTHREAD_SEMA_API __declspec(dllimport)
#endif
-
-/*
- * This is a duplicate of what is in the autoconf config.h,
- * which is only used when building the pthread-win32 libraries.
- */
-
-#ifndef PTW32_CONFIG_H
-# if defined(WINCE)
-# define NEED_ERRNO
-# define NEED_SEM
-# endif
-# if defined(_UWIN) || defined(__MINGW32__)
-# define HAVE_MODE_T
-# endif
-#endif
-
-/*
- *
- */
-
-#if PTW32_LEVEL >= PTW32_LEVEL_MAX
-#ifdef NEED_ERRNO
-#include "need_errno.h"
#else
-#include <errno.h>
+#define WINPTHREAD_SEMA_API
#endif
-#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
-#define _POSIX_SEMAPHORES
+/* Set this to 0 to disable it */
+#define USE_SEM_CriticalSection_SpinCount 100
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* __cplusplus */
+#define SEM_VALUE_MAX INT_MAX
-#ifndef HAVE_MODE_T
-typedef unsigned int mode_t;
+#ifndef _MODE_T_
+#define _MODE_T_
+typedef unsigned short mode_t;
#endif
+typedef void *sem_t;
-typedef struct sem_t_ * sem_t;
+#define SEM_FAILED NULL
-PTW32_DLLPORT int __cdecl sem_init (sem_t * sem,
- int pshared,
- unsigned int value);
+int WINPTHREAD_SEMA_API sem_init(sem_t * sem, int pshared, unsigned int value);
-PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem);
+int WINPTHREAD_SEMA_API sem_destroy(sem_t *sem);
-PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem);
+int WINPTHREAD_SEMA_API sem_trywait(sem_t *sem);
-PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem);
+int WINPTHREAD_SEMA_API sem_wait(sem_t *sem);
-PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem,
- const struct timespec * abstime);
+int WINPTHREAD_SEMA_API sem_timedwait(sem_t * sem, const struct timespec *t);
-PTW32_DLLPORT int __cdecl sem_post (sem_t * sem);
+int WINPTHREAD_SEMA_API sem_post(sem_t *sem);
-PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem,
- int count);
+int WINPTHREAD_SEMA_API sem_post_multiple(sem_t *sem, int count);
-PTW32_DLLPORT int __cdecl sem_open (const char * name,
- int oflag,
- mode_t mode,
- unsigned int value);
+/* yes, it returns a semaphore (or SEM_FAILED) */
+sem_t * WINPTHREAD_SEMA_API sem_open(const char * name, int oflag, mode_t mode, unsigned int value);
-PTW32_DLLPORT int __cdecl sem_close (sem_t * sem);
+int WINPTHREAD_SEMA_API sem_close(sem_t * sem);
-PTW32_DLLPORT int __cdecl sem_unlink (const char * name);
+int WINPTHREAD_SEMA_API sem_unlink(const char * name);
-PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem,
- int * sval);
+int WINPTHREAD_SEMA_API sem_getvalue(sem_t * sem, int * sval);
#ifdef __cplusplus
-} /* End of extern "C" */
-#endif /* __cplusplus */
-
-#undef PTW32_LEVEL
-#undef PTW32_LEVEL_MAX
+}
+#endif
-#endif /* !SEMAPHORE_H */
+#endif /* WIN_PTHREADS_SEMAPHORE_H */