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