diff options
| author | BernardXiong <[email protected]> | 2018-03-01 13:36:22 +0800 |
|---|---|---|
| committer | BernardXiong <[email protected]> | 2018-03-01 13:36:22 +0800 |
| commit | 38b9ed3118f7df9fd683b9d3bd4425ab604ee2bc (patch) | |
| tree | 2b7acaf70ec61499d4266d74a8c0551a85260111 /components/libc/signal | |
| parent | ef668bc3aa99992208ba6808fe430e5d00849b2f (diff) | |
[Kernel] add sigwait implementation
Diffstat (limited to 'components/libc/signal')
| -rw-r--r-- | components/libc/signal/posix_signal.c | 85 | ||||
| -rw-r--r-- | components/libc/signal/posix_signal.h | 51 |
2 files changed, 51 insertions, 85 deletions
diff --git a/components/libc/signal/posix_signal.c b/components/libc/signal/posix_signal.c index 1bf61aad70..b950fc956c 100644 --- a/components/libc/signal/posix_signal.c +++ b/components/libc/signal/posix_signal.c @@ -31,37 +31,37 @@ void (*signal(int sig, void (*func)(int))) (int) { - return rt_signal_install(sig, func); + return rt_signal_install(sig, func); } int sigprocmask (int how, const sigset_t *set, sigset_t *oset) { - rt_base_t level; + rt_base_t level; rt_thread_t tid; tid = rt_thread_self(); - level = rt_hw_interrupt_disable(); - if (oset) *oset = tid->sig_mask; + level = rt_hw_interrupt_disable(); + if (oset) *oset = tid->sig_mask; - if (set) - { - switch(how) - { - case SIG_BLOCK: - tid->sig_mask |= *set; - break; - case SIG_UNBLOCK: - tid->sig_mask &= ~*set; - break; - case SIG_SETMASK: - tid->sig_mask = *set; - break; - default: - break; - } - } - rt_hw_interrupt_enable(level); + if (set) + { + switch(how) + { + case SIG_BLOCK: + tid->sig_mask |= *set; + break; + case SIG_UNBLOCK: + tid->sig_mask &= ~*set; + break; + case SIG_SETMASK: + tid->sig_mask = *set; + break; + default: + break; + } + } + rt_hw_interrupt_enable(level); return 0; } @@ -70,18 +70,18 @@ int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) { rt_sighandler_t old = RT_NULL; - if (!sig_valid(signum)) return -RT_ERROR; + if (!sig_valid(signum)) return -RT_ERROR; - if (act) - old = rt_signal_install(signum, act->sa_handler); - else - { - old = rt_signal_install(signum, RT_NULL); - rt_signal_install(signum, old); - } + if (act) + old = rt_signal_install(signum, act->sa_handler); + else + { + old = rt_signal_install(signum, RT_NULL); + rt_signal_install(signum, old); + } - if (oldact) - oldact->sa_handler = old; + if (oldact) + oldact->sa_handler = old; return 0; } @@ -89,7 +89,22 @@ int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout) { - return 0; + int ret = 0; + int tick = RT_WAITING_FOREVER; + +#ifdef RT_USING_PTHREADS + if (timeout) + { + extern int clock_time_to_tick(const struct timespec *time); + tick = clock_time_to_tick(timeout); + } +#endif + + ret = rt_signal_wait(set, info, tick); + if (ret == 0) return 0; + + errno = ret; + return -1; } int sigwait(const sigset_t *set, int *sig) @@ -104,12 +119,12 @@ int sigwait(const sigset_t *set, int *sig) int sigwaitinfo(const sigset_t *set, siginfo_t *info) { - return sigtimedwait(set, info, NULL); + return sigtimedwait(set, info, NULL); } int raise(int sig) { - rt_thread_kill(rt_thread_self(), sig); + rt_thread_kill(rt_thread_self(), sig); return 0; } diff --git a/components/libc/signal/posix_signal.h b/components/libc/signal/posix_signal.h index fbb33e7821..5ec721c921 100644 --- a/components/libc/signal/posix_signal.h +++ b/components/libc/signal/posix_signal.h @@ -30,6 +30,7 @@ extern "C" { #endif #include <rtthread.h> +#include <sys/signal.h> enum rt_signal_value{ SIG1 = SIGHUP, @@ -68,56 +69,6 @@ enum rt_signal_value{ SIGMAX = NSIG, }; -/* -The structure definitions on newlib: - -typedef void (*_sig_func_ptr)(int); - -struct sigaction -{ - _sig_func_ptr sa_handler; - sigset_t sa_mask; - int sa_flags; -}; - -typedef int sig_atomic_t; - -typedef _sig_func_ptr sig_t; -typedef _sig_func_ptr sighandler_t; - -When enable POSIX_REALTIME_SIGNALS/POSIX_THREADS: - -union sigval { - int sival_int; - void *sival_ptr; -}; - -struct sigevent { - int sigev_notify; - int sigev_signo; - union sigval sigev_value; - - void (*sigev_notify_function)( union sigval ); - - pthread_attr_t *sigev_notify_attributes; - -}; - -typedef struct { - int si_signo; - int si_code; - union sigval si_value; -} siginfo_t; - -*/ - -rt_sighandler_t rt_signal_install(int signo, rt_sighandler_t handler); -void rt_signal_mask(int signo); -void rt_signal_unmask(int signo); -int rt_thread_kill(rt_thread_t tid, int sig); - -int rt_system_signal_init(void); - #ifdef __cplusplus } #endif |
