Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/rump Support SIGMODEL_RAISE for non-local clients.



details:   https://anonhg.NetBSD.org/src/rev/f4d4533b105b
branches:  trunk
changeset: 760858:f4d4533b105b
user:      pooka <pooka%NetBSD.org@localhost>
date:      Fri Jan 14 13:11:08 2011 +0000

description:
Support SIGMODEL_RAISE for non-local clients.

diffstat:

 sys/rump/include/rump/rumpuser.h    |   5 +-
 sys/rump/librump/rumpkern/signals.c |  81 +++++++++++++++++-------------------
 2 files changed, 42 insertions(+), 44 deletions(-)

diffs (197 lines):

diff -r e3157eac8274 -r f4d4533b105b sys/rump/include/rump/rumpuser.h
--- a/sys/rump/include/rump/rumpuser.h  Fri Jan 14 13:09:12 2011 +0000
+++ b/sys/rump/include/rump/rumpuser.h  Fri Jan 14 13:11:08 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rumpuser.h,v 1.62 2011/01/12 12:51:47 pooka Exp $      */
+/*     $NetBSD: rumpuser.h,v 1.63 2011/01/14 13:11:08 pooka Exp $      */
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -36,7 +36,7 @@
 #include <stdint.h>
 #endif
 
-#define RUMPUSER_VERSION 9
+#define RUMPUSER_VERSION 10
 int rumpuser_getversion(void);
 
 int rumpuser_daemonize_begin(void);
@@ -229,6 +229,7 @@
 int    rumpuser_sp_copyout(void *, const void *, void *, size_t);
 int    rumpuser_sp_copyoutstr(void *, const void *, void *, size_t *);
 int    rumpuser_sp_anonmmap(void *, size_t, void **);
+int    rumpuser_sp_raise(void *, int);
 void   rumpuser_sp_fini(void);
 
 #endif /* _RUMP_RUMPUSER_H_ */
diff -r e3157eac8274 -r f4d4533b105b sys/rump/librump/rumpkern/signals.c
--- a/sys/rump/librump/rumpkern/signals.c       Fri Jan 14 13:09:12 2011 +0000
+++ b/sys/rump/librump/rumpkern/signals.c       Fri Jan 14 13:11:08 2011 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: signals.c,v 1.6 2011/01/08 14:01:04 pooka Exp $        */
+/*     $NetBSD: signals.c,v 1.7 2011/01/14 13:11:08 pooka Exp $        */
 
-/*
- * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
+/*-
+ * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.6 2011/01/08 14:01:04 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.7 2011/01/14 13:11:08 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -37,6 +37,7 @@
 #include <rump/rump.h>
 #include <rump/rumpuser.h>
 
+#include "rump_private.h"
 #include "rumpkern_if_priv.h"
 
 const struct filterops sig_filtops = {
@@ -45,10 +46,24 @@
 
 sigset_t sigcantmask;
 
+static void
+pgrp_apply(struct pgrp *pgrp, int signo, void (*apply)(struct proc *p, int))
+{
+       struct proc *p;
+
+       KASSERT(mutex_owned(proc_lock));
+
+       LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
+               mutex_enter(p->p_lock);
+               apply(p, signo);
+               mutex_exit(p->p_lock);
+       }
+}
+
 /* RUMP_SIGMODEL_PANIC */
 
 static void
-rumpsig_panic(pid_t target, int signo)
+rumpsig_panic(struct proc *p, int signo)
 {
 
        switch (signo) {
@@ -63,7 +78,7 @@
 /* RUMP_SIGMODEL_IGNORE */
 
 static void
-rumpsig_ignore(pid_t target, int signo)
+rumpsig_ignore(struct proc *p, int signo)
 {
 
        return;
@@ -72,57 +87,39 @@
 /* RUMP_SIGMODEL_HOST */
 
 static void
-rumpsig_host(pid_t target, int signo)
+rumpsig_host(struct proc *p, int signo)
 {
        int error;
 
-       rumpuser_kill(target, signo, &error);
+       rumpuser_kill(p->p_pid, signo, &error);
 }
 
 /* RUMP_SIGMODEL_RAISE */
 
 static void
-rumpsig_raise(pid_t target, int signo)
+rumpsig_raise(struct proc *p, int signo)
 {
-       int error;
+       int error = 0;
 
-       rumpuser_kill(RUMPUSER_PID_SELF, signo, &error);
+       if (RUMP_LOCALPROC_P(p)) {
+               rumpuser_kill(RUMPUSER_PID_SELF, signo, &error);
+       } else {
+               rumpuser_sp_raise(p->p_vmspace->vm_map.pmap, signo);
+       }
 }
 
 static void
-rumpsig_record(pid_t target, int sig)
+rumpsig_record(struct proc *p, int signo)
 {
-       struct proc *p = NULL;
-       struct pgrp *pgrp = NULL;
-
-       /* well this is a little silly */
-       mutex_enter(proc_lock);
-       if (target >= 0)
-               p = proc_find_raw(target);
-       else
-               pgrp = pgrp_find(target);
 
-       if (p) {
-               mutex_enter(p->p_lock);
-               if (!sigismember(&p->p_sigctx.ps_sigignore, sig)) {
-                       sigaddset(&p->p_sigpend.sp_set, sig);
-               }
-               mutex_exit(p->p_lock);
-       } else if (pgrp) {
-               LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
-                       mutex_enter(p->p_lock);
-                       if (!sigismember(&p->p_sigctx.ps_sigignore, sig)) {
-                               sigaddset(&p->p_sigpend.sp_set, sig);
-                       }
-                       mutex_exit(p->p_lock);
-               }
+       if (!sigismember(&p->p_sigctx.ps_sigignore, signo)) {
+               sigaddset(&p->p_sigpend.sp_set, signo);
        }
-       mutex_exit(proc_lock);
 }
 
-typedef void (*rumpsig_fn)(pid_t pid, int sig);
+typedef void (*rumpsig_fn)(struct proc *, int);
 
-rumpsig_fn rumpsig = rumpsig_panic;
+static rumpsig_fn rumpsig = rumpsig_panic;
 
 /*
  * Set signal delivery model.  It would be nice if we could
@@ -160,28 +157,28 @@
 psignal(struct proc *p, int sig)
 {
 
-       rumpsig(p->p_pid, sig);
+       rumpsig(p, sig);
 }
 
 void
 pgsignal(struct pgrp *pgrp, int sig, int checktty)
 {
 
-       rumpsig(-pgrp->pg_id, sig);
+       pgrp_apply(pgrp, sig, rumpsig);
 }
 
 void
 kpsignal(struct proc *p, ksiginfo_t *ksi, void *data)
 {
 
-       rumpsig(p->p_pid, ksi->ksi_signo);
+       rumpsig(p, ksi->ksi_signo);
 }
 
 void
 kpgsignal(struct pgrp *pgrp, ksiginfo_t *ksi, void *data, int checkctty)
 {
 
-       rumpsig(-pgrp->pg_id, ksi->ksi_signo);
+       pgrp_apply(pgrp, ksi->ksi_signo, rumpsig);
 }
 
 int



Home | Main Index | Thread Index | Old Index