bug-hurd
[Top][All Lists]
Advanced

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

[PATCH hurd 2/5] proc: register for new task notifications


From: Justus Winter
Subject: [PATCH hurd 2/5] proc: register for new task notifications
Date: Thu, 13 Nov 2014 13:26:16 +0100

* 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.
---
 proc/Makefile |  4 +++-
 proc/main.c   | 11 ++++++++++-
 proc/mgt.c    | 35 ++++++++++++++++++++++++++++++++++-
 3 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/proc/Makefile b/proc/Makefile
index aa31ffb..2275a66 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 3419d44..b4288fb 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.  */
diff --git a/proc/mgt.c b/proc/mgt.c
index 02d69db..32408ae 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -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;
+}
-- 
2.1.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]