diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-09-16 16:09:05 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-12-10 13:35:17 +0100 |
commit | 46b2c2b071f31893c9ce9548537e34747b2941d6 (patch) | |
tree | 30bf0c4086923410b994da0ec09691f690203a38 | |
parent | 09ff61acc11cd495af5f4cba1f9a1f850c6745c9 (diff) |
proc: register for new task notifications
* proc/Makefile (MIGSTUBS): Add `gnumachServer.o'.
* proc/main.c (message_demuxer): Handle the `task_notify' protocol.
(main): Register for new task notificatinos.
* proc/mgt.c (S_mach_notify_new_task): Add server function.
-rw-r--r-- | proc/Makefile | 4 | ||||
-rw-r--r-- | proc/main.c | 11 | ||||
-rw-r--r-- | proc/mgt.c | 35 |
3 files changed, 47 insertions, 3 deletions
diff --git a/proc/Makefile b/proc/Makefile index aa31ffbf..2275a663 100644 --- a/proc/Makefile +++ b/proc/Makefile @@ -27,9 +27,11 @@ SRCS = wait.c hash.c host.c info.c main.c mgt.c notify.c pgrp.c msg.c \ MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h MIGSTUBS = processServer.o notifyServer.o \ - ourmsgUser.o proc_excUser.o proc_excServer.o + ourmsgUser.o proc_excUser.o proc_excServer.o \ + task_notifyServer.o OBJS = $(SRCS:.c=.o) $(MIGSTUBS) HURDLIBS = ihash ports shouldbeinlibc + OTHERLIBS = -lpthread include ../Makeconf diff --git a/proc/main.c b/proc/main.c index 3419d44d..b4288fbc 100644 --- a/proc/main.c +++ b/proc/main.c @@ -31,6 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <pids.h> #include "proc.h" +#include "gnumach_U.h" const char *argp_program_version = STANDARD_HURD_VERSION (proc); @@ -38,6 +39,7 @@ const char *argp_program_version = STANDARD_HURD_VERSION (proc); #include "notify_S.h" #include "../libports/interrupt_S.h" #include "proc_exc_S.h" +#include "task_notify_S.h" int message_demuxer (mach_msg_header_t *inp, @@ -47,7 +49,8 @@ message_demuxer (mach_msg_header_t *inp, if ((routine = process_server_routine (inp)) || (routine = notify_server_routine (inp)) || (routine = ports_interrupt_server_routine (inp)) || - (routine = proc_exc_server_routine (inp))) + (routine = proc_exc_server_routine (inp)) || + (routine = task_notify_server_routine (inp))) { pthread_mutex_lock (&global_lock); (*routine) (inp, outp); @@ -152,6 +155,12 @@ main (int argc, char **argv, char **envp) if (err) error (0, err, "Increasing priority failed"); + err = register_new_task_notification (_hurd_host_priv, + generic_port, + MACH_MSG_TYPE_MAKE_SEND); + if (err) + error (0, err, "Registering task notifications failed"); + { /* Get our stderr set up to print on the console, in case we have to panic or something. */ @@ -1,5 +1,5 @@ /* Process management - Copyright (C) 1992,93,94,95,96,99,2000,01,02,13 + Copyright (C) 1992,93,94,95,96,99,2000,01,02,13,14 Free Software Foundation, Inc. This file is part of the GNU Hurd. @@ -981,3 +981,36 @@ S_proc_get_code (struct proc *callerp, return 0; } + +/* Handle new task notifications from the kernel. */ +error_t +S_mach_notify_new_task (mach_port_t notify, + mach_port_t task, + mach_port_t parent) +{ + struct proc *parentp, *childp; + + if (notify != generic_port) + return EOPNOTSUPP; + + parentp = task_find_nocreate (parent); + if (! parentp) + { + mach_port_deallocate (mach_task_self (), task); + mach_port_deallocate (mach_task_self (), parent); + return ESRCH; + } + + childp = task_find_nocreate (task); + if (! childp) + { + mach_port_mod_refs (mach_task_self (), task, MACH_PORT_RIGHT_SEND, +1); + childp = new_proc (task); + } + + /* XXX do something interesting */ + + mach_port_deallocate (mach_task_self (), task); + mach_port_deallocate (mach_task_self (), parent); + return 0; +} |