Mercurial > projects > ldc
diff tango/tango/stdc/posix/signal.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/signal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,716 @@ +/** + * 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.signal; + +private import tango.stdc.posix.config; +public import tango.stdc.signal; +public import tango.stdc.stddef; // for size_t +public import tango.stdc.posix.sys.types; // for pid_t +//public import tango.stdc.posix.time; // for timespec, now defined here + +extern (C): + +private alias void function(int) sigfn_t; +private alias void function(int, siginfo_t*, void*) sigactfn_t; + +// +// Required +// +/* +SIG_DFL (defined in tango.stdc.signal) +SIG_ERR (defined in tango.stdc.signal) +SIG_IGN (defined in tango.stdc.signal) + +sig_atomic_t (defined in tango.stdc.signal) + +SIGEV_NONE +SIGEV_SIGNAL +SIGEV_THREAD + +union sigval +{ + int sival_int; + void* sival_ptr; +} + +SIGRTMIN +SIGRTMAX + +SIGABRT (defined in tango.stdc.signal) +SIGALRM +SIGBUS +SIGCHLD +SIGCONT +SIGFPE (defined in tango.stdc.signal) +SIGHUP +SIGILL (defined in tango.stdc.signal) +SIGINT (defined in tango.stdc.signal) +SIGKILL +SIGPIPE +SIGQUIT +SIGSEGV (defined in tango.stdc.signal) +SIGSTOP +SIGTERM (defined in tango.stdc.signal) +SIGTSTP +SIGTTIN +SIGTTOU +SIGUSR1 +SIGUSR2 +SIGURG + +struct sigaction_t +{ + sigfn_t sa_handler; + sigset_t sa_mask; + sigactfn_t sa_sigaction; +} + +sigfn_t signal(int sig, sigfn_t func); (defined in tango.stdc.signal) +int raise(int sig); (defined in tango.stdc.signal) +*/ + +//SIG_DFL (defined in tango.stdc.signal) +//SIG_ERR (defined in tango.stdc.signal) +//SIG_IGN (defined in tango.stdc.signal) + +//sig_atomic_t (defined in tango.stdc.signal) + +enum +{ + SIGEV_SIGNAL, + SIGEV_NONE, + SIGEV_THREAD +} + +union sigval +{ + int sival_int; + void* sival_ptr; +} + +private extern (C) int __libc_current_sigrtmin(); +private extern (C) int __libc_current_sigrtmax(); + +alias __libc_current_sigrtmin SIGRTMIN; +alias __libc_current_sigrtmax SIGRTMAX; + +version( linux ) +{ + //SIGABRT (defined in tango.stdc.signal) + const SIGALRM = 14; + const SIGBUS = 7; + const SIGCHLD = 17; + const SIGCONT = 18; + //SIGFPE (defined in tango.stdc.signal) + const SIGHUP = 1; + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + const SIGKILL = 9; + const SIGPIPE = 13; + const SIGQUIT = 3; + //SIGSEGV (defined in tango.stdc.signal) + const SIGSTOP = 19; + //SIGTERM (defined in tango.stdc.signal) + const SIGTSTP = 20; + const SIGTTIN = 21; + const SIGTTOU = 22; + const SIGUSR1 = 10; + const SIGUSR2 = 12; + const SIGURG = 23; +} +else version( darwin ) +{ + //SIGABRT (defined in tango.stdc.signal) + const SIGALRM = 14; + const SIGBUS = 10; + const SIGCHLD = 20; + const SIGCONT = 19; + //SIGFPE (defined in tango.stdc.signal) + const SIGHUP = 1; + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + const SIGKILL = 9; + const SIGPIPE = 13; + const SIGQUIT = 3; + //SIGSEGV (defined in tango.stdc.signal) + const SIGSTOP = 17; + //SIGTERM (defined in tango.stdc.signal) + const SIGTSTP = 18; + const SIGTTIN = 21; + const SIGTTOU = 22; + const SIGUSR1 = 30; + const SIGUSR2 = 31; + const SIGURG = 16; +} + +struct sigaction_t +{ + static if( true /* __USE_POSIX199309 */ ) + { + union + { + sigfn_t sa_handler; + sigactfn_t sa_sigaction; + } + } + else + { + sigfn_t sa_handler; + } + sigset_t sa_mask; + int sa_flags; + + version( darwin ) {} else { + void function() sa_restorer; + } +} + +// +// C Extension (CX) +// +/* +SIG_HOLD + +sigset_t +pid_t (defined in sys.types) + +SIGABRT (defined in tango.stdc.signal) +SIGFPE (defined in tango.stdc.signal) +SIGILL (defined in tango.stdc.signal) +SIGINT (defined in tango.stdc.signal) +SIGSEGV (defined in tango.stdc.signal) +SIGTERM (defined in tango.stdc.signal) + +SA_NOCLDSTOP (CX|XSI) +SIG_BLOCK +SIG_UNBLOCK +SIG_SETMASK + +struct siginfo_t +{ + int si_signo; + int si_code; + + version( XSI ) + { + int si_errno; + pid_t si_pid; + uid_t si_uid; + void* si_addr; + int si_status; + c_long si_band; + } + version( RTS ) + { + sigval si_value; + } +} + +SI_USER +SI_QUEUE +SI_TIMER +SI_ASYNCIO +SI_MESGQ + +int kill(pid_t, int); +int sigaction(int, sigaction_t*, sigaction_t*); +int sigaddset(sigset_t*, int); +int sigdelset(sigset_t*, int); +int sigemptyset(sigset_t*); +int sigfillset(sigset_t*); +int sigismember( sigset_t*, int); +int sigpending(sigset_t*); +int sigprocmask(int, sigset_t*, sigset_t*); +int sigsuspend(sigset_t*); +int sigwait(sigset_t*, int*); +*/ + +version( linux ) +{ + const SIG_HOLD = cast(sigfn_t) 1; + + private const _SIGSET_NWORDS = 1024 / (8 * c_ulong.sizeof); + + struct sigset_t + { + c_ulong[_SIGSET_NWORDS] __val; + } + + // pid_t (defined in sys.types) + + //SIGABRT (defined in tango.stdc.signal) + //SIGFPE (defined in tango.stdc.signal) + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + //SIGSEGV (defined in tango.stdc.signal) + //SIGTERM (defined in tango.stdc.signal) + + const SA_NOCLDSTOP = 1; // (CX|XSI) + + const SIG_BLOCK = 0; + const SIG_UNBLOCK = 1; + const SIG_SETMASK = 2; + + private const __SI_MAX_SIZE = 128; + + static if( false /* __WORDSIZE == 64 */ ) + { + private const __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 4); + } + else + { + private const __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 3); + } + + struct siginfo_t + { + int si_signo; // Signal number + int si_errno; // If non-zero, an errno value associated with + // this signal, as defined in <errno.h> + int si_code; // Signal code + + union _sifields_t + { + int _pad[__SI_PAD_SIZE]; + + // kill() + struct _kill_t + { + pid_t si_pid; // Sending process ID + uid_t si_uid; // Real user ID of sending process + } _kill_t _kill; + + // POSIX.1b timers. + struct _timer_t + { + int si_tid; // Timer ID + int si_overrun; // Overrun count + sigval si_sigval; // Signal value + } _timer_t _timer; + + // POSIX.1b signals + struct _rt_t + { + pid_t si_pid; // Sending process ID + uid_t si_uid; // Real user ID of sending process + sigval si_sigval; // Signal value + } _rt_t _rt; + + // SIGCHLD + struct _sigchild_t + { + pid_t si_pid; // Which child + uid_t si_uid; // Real user ID of sending process + int si_status; // Exit value or signal + clock_t si_utime; + clock_t si_stime; + } _sigchild_t _sigchld; + + // SIGILL, SIGFPE, SIGSEGV, SIGBUS + struct _sigfault_t + { + void* si_addr; // Faulting insn/memory ref + } _sigfault_t _sigfault; + + // SIGPOLL + struct _sigpoll_t + { + c_long si_band; // Band event for SIGPOLL + int si_fd; + } _sigpoll_t _sigpoll; + } _sifields_t _sifields; + } + + enum + { + SI_ASYNCNL = -60, + SI_TKILL = -6, + SI_SIGIO, + SI_ASYNCIO, + SI_MESGQ, + SI_TIMER, + SI_QUEUE, + SI_USER, + SI_KERNEL = 0x80 + } + + int kill(pid_t, int); + int sigaction(int, sigaction_t*, sigaction_t*); + int sigaddset(sigset_t*, int); + int sigdelset(sigset_t*, int); + int sigemptyset(sigset_t*); + int sigfillset(sigset_t*); + int sigismember( sigset_t*, int); + int sigpending(sigset_t*); + int sigprocmask(int, sigset_t*, sigset_t*); + int sigsuspend(sigset_t*); + int sigwait(sigset_t*, int*); +} +else version( darwin ) +{ + //SIG_HOLD + + alias uint sigset_t; + // pid_t (defined in sys.types) + + //SIGABRT (defined in tango.stdc.signal) + //SIGFPE (defined in tango.stdc.signal) + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + //SIGSEGV (defined in tango.stdc.signal) + //SIGTERM (defined in tango.stdc.signal) + + //SA_NOCLDSTOP (CX|XSI) + + //SIG_BLOCK + //SIG_UNBLOCK + //SIG_SETMASK + + struct siginfo_t + { + int si_signo; + int si_errno; + int si_code; + pid_t si_pid; + uid_t si_uid; + int si_status; + void* si_addr; + sigval si_value; + int si_band; + uint pad[7]; + } + + //SI_USER + //SI_QUEUE + //SI_TIMER + //SI_ASYNCIO + //SI_MESGQ + + int kill(pid_t, int); + int sigaction(int, sigaction_t*, sigaction_t*); + int sigaddset(sigset_t*, int); + int sigdelset(sigset_t*, int); + int sigemptyset(sigset_t*); + int sigfillset(sigset_t*); + int sigismember( sigset_t*, int); + int sigpending(sigset_t*); + int sigprocmask(int, sigset_t*, sigset_t*); + int sigsuspend(sigset_t*); + int sigwait(sigset_t*, int*); +} + +// +// XOpen (XSI) +// +/* +SIGPOLL +SIGPROF +SIGSYS +SIGTRAP +SIGVTALRM +SIGXCPU +SIGXFSZ + +SA_ONSTACK +SA_RESETHAND +SA_RESTART +SA_SIGINFO +SA_NOCLDWAIT +SA_NODEFER +SS_ONSTACK +SS_DISABLE +MINSIGSTKSZ +SIGSTKSZ + +ucontext_t // from ucontext +mcontext_t // from ucontext + +struct stack_t +{ + void* ss_sp; + size_t ss_size; + int ss_flags; +} + +struct sigstack +{ + int ss_onstack; + void* ss_sp; +} + +ILL_ILLOPC +ILL_ILLOPN +ILL_ILLADR +ILL_ILLTRP +ILL_PRVOPC +ILL_PRVREG +ILL_COPROC +ILL_BADSTK + +FPE_INTDIV +FPE_INTOVF +FPE_FLTDIV +FPE_FLTOVF +FPE_FLTUND +FPE_FLTRES +FPE_FLTINV +FPE_FLTSUB + +SEGV_MAPERR +SEGV_ACCERR + +BUS_ADRALN +BUS_ADRERR +BUS_OBJERR + +TRAP_BRKPT +TRAP_TRACE + +CLD_EXITED +CLD_KILLED +CLD_DUMPED +CLD_TRAPPED +CLD_STOPPED +CLD_CONTINUED + +POLL_IN +POLL_OUT +POLL_MSG +POLL_ERR +POLL_PRI +POLL_HUP + +sigfn_t bsd_signal(int sig, sigfn_t func); +sigfn_t sigset(int sig, sigfn_t func); + +int killpg(pid_t, int); +int sigaltstack(stack_t*, stack_t*); +int sighold(int); +int sigignore(int); +int siginterrupt(int, int); +int sigpause(int); +int sigrelse(int); +*/ + +version( linux ) +{ + const SIGPOLL = 29; + const SIGPROF = 27; + const SIGSYS = 31; + const SIGTRAP = 5; + const SIGVTALRM = 26; + const SIGXCPU = 24; + const SIGXFSZ = 25; + + const SA_ONSTACK = 0x08000000; + const SA_RESETHAND = 0x80000000; + const SA_RESTART = 0x10000000; + const SA_SIGINFO = 4; + const SA_NOCLDWAIT = 2; + const SA_NODEFER = 0x40000000; + const SS_ONSTACK = 1; + const SS_DISABLE = 2; + const MINSIGSTKSZ = 2048; + const SIGSTKSZ = 8192; + + //ucontext_t (defined in tango.stdc.posix.ucontext) + //mcontext_t (defined in tango.stdc.posix.ucontext) + + struct stack_t + { + void* ss_sp; + int ss_flags; + size_t ss_size; + } + + struct sigstack + { + void* ss_sp; + int ss_onstack; + } + + enum + { + ILL_ILLOPC = 1, + ILL_ILLOPN, + ILL_ILLADR, + ILL_ILLTRP, + ILL_PRVOPC, + ILL_PRVREG, + ILL_COPROC, + ILL_BADSTK + } + + enum + { + FPE_INTDIV = 1, + FPE_INTOVF, + FPE_FLTDIV, + FPE_FLTOVF, + FPE_FLTUND, + FPE_FLTRES, + FPE_FLTINV, + FPE_FLTSUB + } + + enum + { + SEGV_MAPERR = 1, + SEGV_ACCERR + } + + enum + { + BUS_ADRALN = 1, + BUS_ADRERR, + BUS_OBJERR + } + + enum + { + TRAP_BRKPT = 1, + TRAP_TRACE + } + + enum + { + CLD_EXITED = 1, + CLD_KILLED, + CLD_DUMPED, + CLD_TRAPPED, + CLD_STOPPED, + CLD_CONTINUED + } + + enum + { + POLL_IN = 1, + POLL_OUT, + POLL_MSG, + POLL_ERR, + POLL_PRI, + POLL_HUP + } + + sigfn_t bsd_signal(int sig, sigfn_t func); + sigfn_t sigset(int sig, sigfn_t func); + + int killpg(pid_t, int); + int sigaltstack(stack_t*, stack_t*); + int sighold(int); + int sigignore(int); + int siginterrupt(int, int); + int sigpause(int); + int sigrelse(int); +} + +// +// Timer (TMR) +// +/* +NOTE: This should actually be defined in tango.stdc.posix.time. + It is defined here instead to break a circular import. + +struct timespec +{ + time_t tv_sec; + int tv_nsec; +} +*/ + +version( linux ) +{ + struct timespec + { + time_t tv_sec; + c_long tv_nsec; + } +} +else version( darwin ) +{ + struct timespec + { + time_t tv_sec; + c_long tv_nsec; + } +} + +// +// Realtime Signals (RTS) +// +/* +struct sigevent +{ + int sigev_notify; + int sigev_signo; + sigval sigev_value; + void(*)(sigval) sigev_notify_function; + pthread_attr_t* sigev_notify_attributes; +} + +int sigqueue(pid_t, int, sigval); +int sigtimedwait( sigset_t*, siginfo_t*, timespec*); +int sigwaitinfo( sigset_t*, siginfo_t*); +*/ + +version( linux ) +{ + private const __SIGEV_MAX_SIZE = 64; + + static if( false /* __WORDSIZE == 64 */ ) + { + private const __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 4); + } + else + { + private const __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 3); + } + + struct sigevent + { + sigval sigev_value; + int sigev_signo; + int sigev_notify; + + union _sigev_un_t + { + int[__SIGEV_PAD_SIZE] _pad; + pid_t _tid; + + struct _sigev_thread_t + { + void function(sigval) _function; + void* _attribute; + } _sigev_thread_t _sigev_thread; + } _sigev_un_t _sigev_un; + } + + int sigqueue(pid_t, int, sigval); + int sigtimedwait( sigset_t*, siginfo_t*, timespec*); + int sigwaitinfo( sigset_t*, siginfo_t*); +} + +// +// Threads (THR) +// +/* +int pthread_kill(pthread_t, int); +int pthread_sigmask(int, sigset_t*, sigset_t*); +*/ + +version( linux ) +{ + int pthread_kill(pthread_t, int); + int pthread_sigmask(int, sigset_t*, sigset_t*); +} +else version( darwin ) +{ + int pthread_kill(pthread_t, int); + int pthread_sigmask(int, sigset_t*, sigset_t*); +}