15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Module: semaphore.h
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Purpose:
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	Semaphores aren't actually part of the PThreads standard.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	They are defined by the POSIX Standard:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		POSIX 1003.1b-1993	(POSIX.1b)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --------------------------------------------------------------------------
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Pthreads-win32 - POSIX Threads Library for Win32
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1998 John E. Bossom
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1999,2005 Pthreads-win32 contributors
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Contact Email: rpj@callisto.canberra.edu.au
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      The current list of contributors is contained
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      in the file CONTRIBUTORS included with the source
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      code distribution. The list can also be seen at the
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      following World Wide Web location:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://sources.redhat.com/pthreads-win32/contributors.html
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is free software; you can redistribute it and/or
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      modify it under the terms of the GNU Lesser General Public
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License as published by the Free Software Foundation; either
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      version 2 of the License, or (at your option) any later version.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is distributed in the hope that it will be useful,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      but WITHOUT ANY WARRANTY; without even the implied warranty of
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Lesser General Public License for more details.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      You should have received a copy of the GNU Lesser General Public
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License along with this library in the file COPYING.LIB;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      if not, write to the Free Software Foundation, Inc.,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined( SEMAPHORE_H )
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SEMAPHORE_H
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SEMAPHORE_LEVEL
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_POSIX_SOURCE)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SEMAPHORE_LEVEL 0
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Early POSIX */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SEMAPHORE_LEVEL
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SEMAPHORE_LEVEL 1
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include 1b, 1c and 1d */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(INCLUDE_NP)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SEMAPHORE_LEVEL
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SEMAPHORE_LEVEL 2
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include Non-Portable extensions */
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SEMAPHORE_LEVEL_MAX 3
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_SEMAPHORE_LEVEL)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include everything */
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__) && ! defined (__declspec)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# error Please upgrade your GNU compiler to one that supports __declspec.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When building the library, you should define PTW32_BUILD so that
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the variables/functions are exported correctly. When using the library,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * do NOT define PTW32_BUILD, and then the variables/functions will
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be imported correctly.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_STATIC_LIB)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(PTW32_BUILD)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define PTW32_DLLPORT __declspec (dllexport)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  else
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define PTW32_DLLPORT __declspec (dllimport)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PTW32_DLLPORT
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is a duplicate of what is in the autoconf config.h,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which is only used when building the pthread-win32 libraries.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_CONFIG_H)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(WINCE)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define NEED_ERRNO
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define NEED_SEM
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(__MINGW64__)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_STRUCT_TIMESPEC
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_MODE_T
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  elif defined(_UWIN) || defined(__MINGW32__)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_MODE_T
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NEED_ERRNO)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "need_errno.h"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h>
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_SEMAPHORES
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C"
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif				/* __cplusplus */
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(HAVE_MODE_T)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned int mode_t;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct sem_t_ * sem_t;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_init (sem_t * sem,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int pshared,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    unsigned int value);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const struct timespec * abstime);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_post (sem_t * sem);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     int count);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_open (const char * name,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int oflag,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    mode_t mode,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    unsigned int value);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_close (sem_t * sem);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_unlink (const char * name);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				int * sval);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}				/* End of extern "C" */
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif				/* __cplusplus */
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SEMAPHORE_LEVEL
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SEMAPHORE_LEVEL_MAX
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif				/* !SEMAPHORE_H */
170