/** * D header file for POSIX. * * Copyright: Copyright Sean Kelly 2005 - 2009. * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). * Authors: Sean Kelly, Alex Rønne Petersen * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition */ /* Copyright Sean Kelly 2005 - 2009. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE or copy at * http://www.boost.org/LICENSE_1_0.txt) */ module core.sys.posix.semaphore; import core.sys.posix.config; import core.sys.posix.time; version (OSX) version = Darwin; else version (iOS) version = Darwin; else version (TVOS) version = Darwin; else version (WatchOS) version = Darwin; version (Posix): extern (C): nothrow: @nogc: @system: // // Required // /* sem_t SEM_FAILED int sem_close(sem_t*); int sem_destroy(sem_t*); int sem_getvalue(sem_t*, int*); int sem_init(sem_t*, int, uint); sem_t* sem_open(const scope char*, int, ...); int sem_post(sem_t*); int sem_trywait(sem_t*); int sem_unlink(const scope char*); int sem_wait(sem_t*); */ version (CRuntime_Glibc) { private alias int __atomic_lock_t; private struct _pthread_fastlock { c_long __status; __atomic_lock_t __spinlock; } struct sem_t { _pthread_fastlock __sem_lock; int __sem_value; void* __sem_waiting; } enum SEM_FAILED = cast(sem_t*) null; } else version (Darwin) { alias int sem_t; enum SEM_FAILED = cast(sem_t*) null; } else version (FreeBSD) { // FBSD-9.0 definition struct sem_t { uint _magic; struct _usem { shared uint _has_waiters; shared uint _count; uint _flags; } _usem _kern; } enum SEM_FAILED = cast(sem_t*) null; } else version (NetBSD) { alias size_t sem_t; enum SEM_FAILED = cast(sem_t*) null; } else version (OpenBSD) { struct __sem; alias sem_t = __sem*; enum SEM_FAILED = cast(sem_t*) null; } else version (DragonFlyBSD) { struct sem_t { uint _magic; struct _usem { shared uint _has_waiters; shared uint _count; uint _flags; } _usem _kern; } enum SEM_FAILED = cast(sem_t*) null; } else version (Solaris) { struct sem_t { uint sem_count; ushort sem_type; ushort sem_magic; ulong[3] sem_pad1; ulong[2] sem_pad2; } enum SEM_FAILED = cast(sem_t*)-1; } else version (CRuntime_Bionic) { struct sem_t { uint count; //volatile } enum SEM_FAILED = null; } else version (CRuntime_Musl) { struct sem_t { int[4*c_long.sizeof/int.sizeof] __val; } enum SEM_FAILED = (sem_t*).init; } else version (CRuntime_UClibc) { enum __SIZEOF_SEM_T = 16; union sem_t { byte[__SIZEOF_SEM_T] __size; c_long __align; } enum SEM_FAILED = cast(sem_t*) null; } else { static assert(false, "Unsupported platform"); } int sem_close(sem_t*); int sem_destroy(sem_t*); int sem_getvalue(sem_t*, int*); int sem_init(sem_t*, int, uint); sem_t* sem_open(const scope char*, int, ...); int sem_post(sem_t*); int sem_trywait(sem_t*); int sem_unlink(const scope char*); int sem_wait(sem_t*); // // Timeouts (TMO) // /* int sem_timedwait(sem_t*, const scope timespec*); */ version (CRuntime_Glibc) { int sem_timedwait(sem_t*, const scope timespec*); } else version (Darwin) { int sem_timedwait(sem_t*, const scope timespec*); } else version (FreeBSD) { int sem_timedwait(sem_t*, const scope timespec*); } else version (NetBSD) { int sem_timedwait(sem_t*, const scope timespec*); } else version (OpenBSD) { int sem_timedwait(sem_t*, const scope timespec*); } else version (DragonFlyBSD) { int sem_timedwait(sem_t*, const scope timespec*); } else version (Solaris) { int sem_timedwait(sem_t*, const scope timespec*); } else version (CRuntime_Bionic) { int sem_timedwait(sem_t*, const scope timespec*); } else version (CRuntime_Musl) { int sem_timedwait(sem_t*, const scope timespec*); } else version (CRuntime_UClibc) { int sem_timedwait(sem_t*, const scope timespec*); } else { static assert(false, "Unsupported platform"); }