230 lines
4.3 KiB
D
230 lines
4.3 KiB
D
|
/**
|
||
|
* 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");
|
||
|
}
|