bug-hurd
[Top][All Lists]
Advanced

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

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


From: Samuel Thibault
Subject: Re: [PATCH hurd 2/5] proc: register for new task notifications
Date: Wed, 10 Dec 2014 01:42:09 +0100
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Thu 13 Nov 2014 13:26:16 +0100, a écrit :
> * 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.

Ack.

> ---
>  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
> 

-- 
Samuel
Who wants to remember that escape-x-alt-control-left shift-b puts you into
super-edit-debug-compile mode?
(Discussion in comp.os.linux.misc on the intuitiveness of commands, especially
Emacs.)



reply via email to

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