Module Name:    src
Committed By:   pooka
Date:           Fri Jan 14 13:11:08 UTC 2011

Modified Files:
        src/sys/rump/include/rump: rumpuser.h
        src/sys/rump/librump/rumpkern: signals.c

Log Message:
Support SIGMODEL_RAISE for non-local clients.


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.63 src/sys/rump/include/rump/rumpuser.h
cvs rdiff -u -r1.6 -r1.7 src/sys/rump/librump/rumpkern/signals.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/rump/include/rump/rumpuser.h
diff -u src/sys/rump/include/rump/rumpuser.h:1.62 src/sys/rump/include/rump/rumpuser.h:1.63
--- src/sys/rump/include/rump/rumpuser.h:1.62	Wed Jan 12 12:51:47 2011
+++ src/sys/rump/include/rump/rumpuser.h	Fri Jan 14 13:11:08 2011
@@ -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_ */

Index: src/sys/rump/librump/rumpkern/signals.c
diff -u src/sys/rump/librump/rumpkern/signals.c:1.6 src/sys/rump/librump/rumpkern/signals.c:1.7
--- src/sys/rump/librump/rumpkern/signals.c:1.6	Sat Jan  8 14:01:04 2011
+++ src/sys/rump/librump/rumpkern/signals.c	Fri Jan 14 13:11:08 2011
@@ -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

Reply via email to