summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorBernardXiong <[email protected]>2018-03-01 13:36:22 +0800
committerBernardXiong <[email protected]>2018-03-01 13:36:22 +0800
commit38b9ed3118f7df9fd683b9d3bd4425ab604ee2bc (patch)
tree2b7acaf70ec61499d4266d74a8c0551a85260111 /components
parentef668bc3aa99992208ba6808fe430e5d00849b2f (diff)
[Kernel] add sigwait implementation
Diffstat (limited to 'components')
-rw-r--r--components/libc/signal/posix_signal.c85
-rw-r--r--components/libc/signal/posix_signal.h51
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