Add a sigself() signal_op
authorKevin Klues <klueska@cs.berkeley.edu>
Wed, 11 Nov 2015 08:46:25 +0000 (00:46 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Nov 2015 23:15:03 +0000 (15:15 -0800)
All of the existing signal_ops map directly to traditional signal
operations fro glibc. This commit introduces a new operation, called sigself().
This operation is meant to trigger a signal immediately on the calling
thread.  Before this call returns, the signal passed into it will be
generated and run to compeltion.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/signal.h
user/parlib/signal.c

index b860a3f..eb9ca33 100644 (file)
@@ -29,6 +29,7 @@ struct sigstate {
 /* A set of functions related to handling posix signals on akaros. The
  * implementation of these functions is 2LS specific. */
 struct signal_ops {
+       /* Standard ops */
        int (*sigaltstack)(__const struct sigaltstack *__restrict,
                        struct sigaltstack *__restrict);
        int (*siginterrupt)(int, int);
@@ -42,6 +43,9 @@ struct signal_ops {
                            __const struct timespec *__restrict);
        int (*sigwait)(__const sigset_t *__restrict, int *__restrict);
        int (*sigwaitinfo)(__const sigset_t *__restrict, siginfo_t *__restrict);
+
+       /* Extended ops */
+       int (*sigself)(int signo);
 };
 
 /* Glibc defines the symbol for signal_ops so that the function pointers
index b1103a5..3994d25 100644 (file)
@@ -56,6 +56,7 @@ static int __sigtimedwait(__const sigset_t *__restrict __set,
 static int __sigwait(__const sigset_t *__restrict __set, int *__restrict __sig);
 static int __sigwaitinfo(__const sigset_t *__restrict __set,
                          siginfo_t *__restrict __info);
+static int __sigself(int signo);
 
 /* The default definition of signal_ops (similar to sched_ops in uthread.c) */
 struct signal_ops default_signal_ops = {
@@ -69,7 +70,8 @@ struct signal_ops default_signal_ops = {
        .sigsuspend = __sigsuspend,
        .sigtimedwait = __sigtimedwait,
        .sigwait = __sigwait,
-       .sigwaitinfo = __sigwaitinfo
+       .sigwaitinfo = __sigwaitinfo,
+       .sigself = __sigself
 };
 
 /* This is the catch all akaros event->posix signal handler.  All posix signals
@@ -339,3 +341,14 @@ static int __sigwaitinfo(__const sigset_t *__restrict __set,
        return 0;
 }
 
+static int __sigself(int signo)
+{
+       int ret = uthread_signal(current_uthread, signo);
+
+       void cb(struct uthread *uthread, void *arg)
+       {
+               uthread_paused(uthread);
+       }
+       if (ret == 0)
+               uthread_yield(TRUE, cb, 0);
+}