bug-hurd
[Top][All Lists]
Advanced

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

[PATCH] libports: fix notify_port_t receiver lookups


From: Justus Winter
Subject: [PATCH] libports: fix notify_port_t receiver lookups
Date: Mon, 7 Apr 2014 12:47:15 +0200

* libports/Makefile (MIGSFLAGS): Include mig-mutate.h.
* libports/mig-decls.h: New file.
* libports/mig-mutate.h: Likewise.
* libports/notify-dead-name.c: Fix receiver lookups.
* libports/notify-no-senders.c: Likewise.
* libports/notify-msg-accepted.c: Adjust function declaration.
* libports/notify-port-deleted.c: Likewise.
* libports/notify-port-destroyed.c: Likewise.
* libports/notify-send-once.c: Likewise.
* libports/ports.h: Likewise.
* proc/Makefile (MIGSFLAGS): Include mig-mutate.h, move PROCESS mutators...
* proc/mig-mutate.h: ... into a new file, add NOTIFY mutators.
* proc/notify.c: Fix receiver lookups, adjust function declarations.
* term/devio.c (ports_do_mach_notify_send_once): Adjust accordingly.
---
 libports/Makefile                |  1 +
 libports/mig-decls.h             | 40 ++++++++++++++++++++++++++++++++++++++++
 libports/mig-mutate.h            | 25 +++++++++++++++++++++++++
 libports/notify-dead-name.c      |  5 ++---
 libports/notify-msg-accepted.c   |  3 ++-
 libports/notify-no-senders.c     |  5 ++---
 libports/notify-port-deleted.c   |  3 ++-
 libports/notify-port-destroyed.c |  3 ++-
 libports/notify-send-once.c      |  2 +-
 libports/ports.h                 | 20 ++++++++++++++------
 proc/Makefile                    |  4 +---
 proc/mig-mutate.h                | 33 +++++++++++++++++++++++++++++++++
 proc/notify.c                    | 24 ++++++++++++------------
 term/devio.c                     |  6 +++---
 14 files changed, 140 insertions(+), 34 deletions(-)
 create mode 100644 libports/mig-decls.h
 create mode 100644 libports/mig-mutate.h
 create mode 100644 proc/mig-mutate.h

diff --git a/libports/Makefile b/libports/Makefile
index 767ee73..30da1c1 100644
--- a/libports/Makefile
+++ b/libports/Makefile
@@ -45,5 +45,6 @@ LDLIBS += -lpthread
 OBJS = $(SRCS:.c=.o) notifyServer.o interruptServer.o
 
 MIGCOMSFLAGS = -prefix ports_
+MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h
 
 include ../Makeconf
diff --git a/libports/mig-decls.h b/libports/mig-decls.h
new file mode 100644
index 0000000..f8c4f15
--- /dev/null
+++ b/libports/mig-decls.h
@@ -0,0 +1,40 @@
+/*
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Written by Justus Winter.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with the GNU Hurd.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef __LIBPORTS_MIG_DECLS_H__
+#define __LIBPORTS_MIG_DECLS_H__
+
+#include "ports.h"
+
+/* Called by server stub functions.  */
+
+static inline struct port_info * __attribute__ ((unused))
+begin_using_port_info_port (mach_port_t port)
+{
+  return ports_lookup_port (0, port, 0);
+}
+
+static inline void __attribute__ ((unused))
+end_using_port_info (struct port_info *p)
+{
+  if (p)
+    ports_port_deref (p);
+}
+
+#endif /* __LIBPORTS_MIG_DECLS_H__ */
diff --git a/libports/mig-mutate.h b/libports/mig-mutate.h
new file mode 100644
index 0000000..f692236
--- /dev/null
+++ b/libports/mig-mutate.h
@@ -0,0 +1,25 @@
+/*
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Written by Justus Winter.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with the GNU Hurd.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define NOTIFY_INTRAN                                          \
+  port_info_t begin_using_port_info_port (mach_port_t)
+#define NOTIFY_DESTRUCTOR                                      \
+  end_using_port_info (port_info_t)
+#define NOTIFY_IMPORTS                                         \
+  import "libports/mig-decls.h";
diff --git a/libports/notify-dead-name.c b/libports/notify-dead-name.c
index c67145d..f974e33 100644
--- a/libports/notify-dead-name.c
+++ b/libports/notify-dead-name.c
@@ -22,13 +22,12 @@
 #include "notify_S.h"
 
 error_t
-ports_do_mach_notify_dead_name (mach_port_t notify, mach_port_t dead_name)
+ports_do_mach_notify_dead_name (struct port_info *pi,
+                               mach_port_t dead_name)
 {
-  void *pi = ports_lookup_port (0, notify, 0);
   if (!pi)
     return EOPNOTSUPP;
   ports_dead_name (pi, dead_name);
-  ports_port_deref (pi);
 
   /* Drop gratuitous extra reference that the notification creates. */
   mach_port_deallocate (mach_task_self (), dead_name);
diff --git a/libports/notify-msg-accepted.c b/libports/notify-msg-accepted.c
index c975083..0e49715 100644
--- a/libports/notify-msg-accepted.c
+++ b/libports/notify-msg-accepted.c
@@ -22,7 +22,8 @@
 #include "notify_S.h"
 
 error_t
-ports_do_mach_notify_msg_accepted (mach_port_t notify, mach_port_t name)
+ports_do_mach_notify_msg_accepted (struct port_info *pi,
+                                  mach_port_t name)
 {
   return 0;
 }
diff --git a/libports/notify-no-senders.c b/libports/notify-no-senders.c
index dc9b316..55aa853 100644
--- a/libports/notify-no-senders.c
+++ b/libports/notify-no-senders.c
@@ -22,12 +22,11 @@
 #include "notify_S.h"
 
 error_t
-ports_do_mach_notify_no_senders (mach_port_t port, mach_port_mscount_t count)
+ports_do_mach_notify_no_senders (struct port_info *pi,
+                                mach_port_mscount_t count)
 {
-  void *pi = ports_lookup_port (0, port, 0);
   if (!pi)
     return EOPNOTSUPP;
   ports_no_senders (pi, count);
-  ports_port_deref (pi);
   return 0;
 }
diff --git a/libports/notify-port-deleted.c b/libports/notify-port-deleted.c
index 85012af..cfd3379 100644
--- a/libports/notify-port-deleted.c
+++ b/libports/notify-port-deleted.c
@@ -22,7 +22,8 @@
 #include "notify_S.h"
 
 error_t
-ports_do_mach_notify_port_deleted (mach_port_t notify, mach_port_t name)
+ports_do_mach_notify_port_deleted (struct port_info *pi,
+                                  mach_port_t name)
 {
   return 0;
 }
diff --git a/libports/notify-port-destroyed.c b/libports/notify-port-destroyed.c
index 78eaf21..b8ece2a 100644
--- a/libports/notify-port-destroyed.c
+++ b/libports/notify-port-destroyed.c
@@ -22,7 +22,8 @@
 #include "notify_S.h"
 
 error_t
-ports_do_mach_notify_port_destroyed (mach_port_t notify, mach_port_t name)
+ports_do_mach_notify_port_destroyed (struct port_info *pi,
+                                    mach_port_t name)
 {
   return 0;
 }
diff --git a/libports/notify-send-once.c b/libports/notify-send-once.c
index 09ffcf2..ad0ba33 100644
--- a/libports/notify-send-once.c
+++ b/libports/notify-send-once.c
@@ -22,7 +22,7 @@
 #include "notify_S.h"
 
 error_t
-ports_do_mach_notify_send_once (mach_port_t notify)
+ports_do_mach_notify_send_once (struct port_info *pi)
 {
   return 0;
 }
diff --git a/libports/ports.h b/libports/ports.h
index 0791841..47d4607 100644
--- a/libports/ports.h
+++ b/libports/ports.h
@@ -50,6 +50,8 @@ struct port_info
   hurd_ihash_locp_t hentry;
   struct port_info *next, **prevp; /* links on port_class list */
 };
+typedef struct port_info *port_info_t;
+
 /* FLAGS above are the following: */
 #define PORT_HAS_SENDRIGHTS    0x0001 /* send rights extant */
 #define PORT_INHIBITED         PORTS_INHIBITED
@@ -383,13 +385,19 @@ void ports_interrupt_notified_rpcs (void *object, 
mach_port_t port,
 int ports_notify_server (mach_msg_header_t *, mach_msg_header_t *);
 
 /* Notification server routines called by ports_notify_server.  */
-extern kern_return_t ports_do_mach_notify_dead_name (mach_port_t notify, 
mach_port_t deadport);
-extern kern_return_t ports_do_mach_notify_msg_accepted (mach_port_t notify, 
mach_port_t name);
-extern kern_return_t ports_do_mach_notify_no_senders (mach_port_t port, 
mach_port_mscount_t count);
-extern kern_return_t ports_do_mach_notify_port_deleted (mach_port_t notify, 
mach_port_t name);
-extern kern_return_t ports_do_mach_notify_port_destroyed (mach_port_t notify, 
mach_port_t name);
 extern kern_return_t
- ports_do_mach_notify_send_once (mach_port_t notify);
+ ports_do_mach_notify_dead_name (struct port_info *pi, mach_port_t deadport);
+extern kern_return_t
+ ports_do_mach_notify_msg_accepted (struct port_info *pi, mach_port_t name);
+extern kern_return_t
+ ports_do_mach_notify_no_senders (struct port_info *pi,
+                                 mach_port_mscount_t count);
+extern kern_return_t
+ ports_do_mach_notify_port_deleted (struct port_info *pi, mach_port_t name);
+extern kern_return_t
+ ports_do_mach_notify_port_destroyed (struct port_info *pi, mach_port_t name);
+extern kern_return_t
+ ports_do_mach_notify_send_once (struct port_info *pi);
 
 /* A default interrupt server */
 int ports_interrupt_server (mach_msg_header_t *, mach_msg_header_t *);
diff --git a/proc/Makefile b/proc/Makefile
index 2eed13c..aa31ffb 100644
--- a/proc/Makefile
+++ b/proc/Makefile
@@ -24,9 +24,7 @@ target = proc
 SRCS = wait.c hash.c host.c info.c main.c mgt.c        notify.c pgrp.c msg.c \
        cpu-types.c stubs.c
 
-MIGSFLAGS="-DPROCESS_INTRAN=pstruct_t reqport_find (process_t)" \
-       "-DPROCESS_DESTRUCTOR=process_drop (pstruct_t)" \
-       "-DPROCESS_IMPORTS=import \"proc.h\";"
+MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h
 
 MIGSTUBS = processServer.o notifyServer.o \
        ourmsgUser.o proc_excUser.o proc_excServer.o
diff --git a/proc/mig-mutate.h b/proc/mig-mutate.h
new file mode 100644
index 0000000..ad6eb32
--- /dev/null
+++ b/proc/mig-mutate.h
@@ -0,0 +1,33 @@
+/*
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Written by Justus Winter.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with the GNU Hurd.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+#define PROCESS_INTRAN                                         \
+  pstruct_t reqport_find (process_t)
+#define PROCESS_DESTRUCTOR                                     \
+  process_drop (pstruct_t)
+#define PROCESS_IMPORTS                                                \
+  import "proc.h";
+
+#define NOTIFY_INTRAN                                          \
+  port_info_t begin_using_port_info_port (mach_port_t)
+#define NOTIFY_DESTRUCTOR                                      \
+  end_using_port_info (port_info_t)
+#define NOTIFY_IMPORTS                                         \
+  import "libports/mig-decls.h";
diff --git a/proc/notify.c b/proc/notify.c
index 5a112b0..b6731ae 100644
--- a/proc/notify.c
+++ b/proc/notify.c
@@ -36,33 +36,33 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 
02139, USA.  */
    message ports die.  Both notifications get sent to the process
    port.   */
 kern_return_t
-do_mach_notify_dead_name (mach_port_t notify,
+do_mach_notify_dead_name (struct port_info *pi,
                          mach_port_t deadport)
 {
   struct proc *p;
 
-  if (notify == generic_port)
+  if (pi->port_right == generic_port)
     {
       check_dead_execdata_notify (deadport);
       mach_port_deallocate (mach_task_self (), deadport);
       return 0;
     }
 
-  p = ports_lookup_port (proc_bucket, notify, proc_class);
+  p = (struct proc *) pi;
 
-  if (!p)
+  if (!p
+      || p->p_pi.bucket != proc_bucket
+      || p->p_pi.class != proc_class)
     return EOPNOTSUPP;
 
   if (p->p_task == deadport)
     {
       process_has_exited (p);
-      ports_port_deref (p);
       mach_port_deallocate (mach_task_self (), deadport);
       return 0;
     }
   else
     {
-      ports_port_deref (p);
       return EINVAL;
     }
 }
@@ -70,35 +70,35 @@ do_mach_notify_dead_name (mach_port_t notify,
 /* We get no-senders notifications on exception ports that we
    handle through proc_handle_exceptions. */
 kern_return_t
-do_mach_notify_no_senders (mach_port_t notify,
+do_mach_notify_no_senders (struct port_info *pi,
                           mach_port_mscount_t mscount)
 {
-  return ports_do_mach_notify_no_senders (notify, mscount);
+  return ports_do_mach_notify_no_senders (pi, mscount);
 }
 
 kern_return_t
-do_mach_notify_port_deleted (mach_port_t notify,
+do_mach_notify_port_deleted (struct port_info *pi,
                             mach_port_t name)
 {
   return 0;
 }
 
 kern_return_t
-do_mach_notify_msg_accepted (mach_port_t notify,
+do_mach_notify_msg_accepted (struct port_info *pi,
                             mach_port_t name)
 {
   return 0;
 }
 
 kern_return_t
-do_mach_notify_port_destroyed (mach_port_t notify,
+do_mach_notify_port_destroyed (struct port_info *pi,
                               mach_port_t name)
 {
   return 0;
 }
 
 kern_return_t
-do_mach_notify_send_once (mach_port_t notify)
+do_mach_notify_send_once (struct port_info *pi)
 {
   return 0;
 }
diff --git a/term/devio.c b/term/devio.c
index 7c7d8fd..eedd7b8 100644
--- a/term/devio.c
+++ b/term/devio.c
@@ -731,18 +731,18 @@ device_write_reply (mach_port_t replyport,
 }
 
 error_t
-ports_do_mach_notify_send_once (mach_port_t notify)
+ports_do_mach_notify_send_once (struct port_info *pi)
 {
   error_t err;
 
   pthread_mutex_lock (&global_lock);
 
-  if (notify == phys_reply_writes)
+  if (pi->port_right == phys_reply_writes)
     {
       err = 0;
       devio_start_output ();
     }
-  else if (notify == phys_reply)
+  else if (pi->port_right == phys_reply)
     {
       if (input_pending)
        {
-- 
1.9.1




reply via email to

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