123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
|
/**
* D header file for POSIX.
*
* Copyright: Public Domain
* License: Public Domain
* Authors: Sean Kelly
* Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
*/
module tango.stdc.posix.semaphore;
private import tango.stdc.posix.config;
private import tango.stdc.posix.time;
version( solaris ) {
private import tango.stdc.stdint;
}
extern (C):
//
// 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(in char*, int, ...);
int sem_post(sem_t*);
int sem_trywait(sem_t*);
int sem_unlink(in char*);
int sem_wait(sem_t*);
*/
version( linux )
{
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;
}
const SEM_FAILED = cast(sem_t*) null;
}
else version( darwin )
{
alias int sem_t;
const SEM_FAILED = cast(sem_t*) null;
// mach_port based semaphores (the working anonymous semaphores)
alias uint mach_port_t;
alias mach_port_t semaphore_t;
alias mach_port_t thread_t;
alias mach_port_t task_t;
alias int kern_return_t;
enum KERN_RETURN: kern_return_t{
SUCCESS=0,
ABORTED=14,
OPERATION_TIMED_OUT=49
}
kern_return_t semaphore_signal (semaphore_t semaphore);
kern_return_t semaphore_signal_all (semaphore_t semaphore);
kern_return_t semaphore_signal_thread (semaphore_t semaphore,
thread_t thread);
kern_return_t semaphore_wait (semaphore_t semaphore);
kern_return_t semaphore_timedwait (semaphore_t semaphore,
timespec wait_time);
kern_return_t semaphore_wait_signal (semaphore_t wait_semaphore,
semaphore_t signal_semaphore);
kern_return_t semaphore_timedwait_signal(semaphore_t wait_semaphore,
semaphore_t signal_semaphore,
timespec wait_time);
kern_return_t semaphore_destroy(task_t task,
semaphore_t semaphore);
kern_return_t semaphore_create(task_t task,
semaphore_t *semaphore,
int policy,
int value);
alias int sync_policy_t;
task_t mach_task_self();// returns the task port of the current thread
/*
* These options define the wait ordering of the synchronizers
*/
enum MACH_SYNC_POLICY{
SYNC_POLICY_FIFO=0x0,
SYNC_POLICY_FIXED_PRIORITY=0x1,
SYNC_POLICY_REVERSED=0x2,
SYNC_POLICY_ORDER_MASK=0x3,
SYNC_POLICY_LIFO=(SYNC_POLICY_FIFO|SYNC_POLICY_REVERSED),
SYNC_POLICY_MAX=0x7
}
}
else version( FreeBSD )
{
const uint SEM_MAGIC = 0x09fa4012;
const SEM_USER = 0;
alias void* sem_t;
const SEM_FAILED = cast(sem_t*) null;
}
else version( solaris )
{
struct sem_t
{
/* this structure must be the same as sema_t in <synch.h> */
uint32_t sem_count; /* semaphore count */
uint16_t sem_type;
uint16_t sem_magic;
upad64_t[3] sem_pad1; /* reserved for a mutex_t */
upad64_t[2] sem_pad2; /* reserved for a cond_t */
}
}
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(in char*, int, ...);
int sem_post(sem_t*);
int sem_trywait(sem_t*);
int sem_unlink(in char*);
int sem_wait(sem_t*);
//
// Timeouts (TMO)
//
/*
int sem_timedwait(sem_t*, in timespec*);
*/
version( linux )
{
int sem_timedwait(sem_t*, in timespec*);
}
else version( darwin )
{
// int sem_timedwait(sem_t*, in timespec*); // not defined, use mach semaphores instead
}
else version( FreeBSD )
{
int sem_timedwait(sem_t*, in timespec*);
}
else version( solaris )
{
int sem_timedwait(sem_t*, in timespec*);
}
|