Projet_SETI_RISC-V/riscv-gnu-toolchain/gcc/libphobos/libdruntime/core/sys/posix/semaphore.d
2023-03-06 14:48:14 +01:00

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");
}