commit-hurd
[Top][All Lists]
Advanced

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

[hurd] 01/61: libpager: fix receiver lookups


From: Samuel Thibault
Subject: [hurd] 01/61: libpager: fix receiver lookups
Date: Tue, 27 May 2014 08:32:08 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit b7cbdde8854ee4c51ec9cd49ce639bd02d646355
Author: Justus Winter <address@hidden>
Date:   Mon Mar 3 20:48:20 2014 +0100

    libpager: fix receiver lookups
    
    Previously, the receiver lookup was done manually in all the server
    functions.  Use mig translator functions instead.
    
    * libpager/mig-decls.h: New file.
    * libpager/mig-mutate.h: Likewise.
    * libpager/Makefile (MIGSFLAGS): Include mig-mutate.h.
    * libpager/chg-compl.c: Fix receiver lookups.
    * libpager/data-request.c: Likewise.
    * libpager/data-return.c: Likewise.
    * libpager/data-unlock.c: Likewise.
    * libpager/lock-completed.c: Likewise.
    * libpager/object-init.c: Likewise.
    * libpager/object-terminate.c: Likewise.
    * libpager/stubs.c: Likewise.
    * libpager/seqnos.c (_pager_update_seqno): Move the actual
    functionality...
    (_pager_update_seqno_p): ... into a new function that can be called
    with a pointer to struct pager.
    * libpager/priv.h (_pager_update_seqno_p): New declaration.
---
 libpager/Makefile           |  2 +-
 libpager/chg-compl.c        | 10 ++++------
 libpager/data-request.c     | 10 +++-------
 libpager/data-return.c      | 13 +++++--------
 libpager/data-unlock.c      |  8 +++-----
 libpager/lock-completed.c   |  8 +++-----
 libpager/mig-decls.h        | 42 ++++++++++++++++++++++++++++++++++++++++++
 libpager/mig-mutate.h       | 22 ++++++++++++++++++++++
 libpager/object-init.c      |  9 +++------
 libpager/object-terminate.c |  9 +++------
 libpager/priv.h             |  1 +
 libpager/seqnos.c           | 14 ++++++++++++--
 libpager/stubs.c            | 12 ++++++------
 13 files changed, 108 insertions(+), 52 deletions(-)

diff --git a/libpager/Makefile b/libpager/Makefile
index 7c4da38..b622295 100644
--- a/libpager/Makefile
+++ b/libpager/Makefile
@@ -31,7 +31,7 @@ HURDLIBS= ports
 LDLIBS += -lpthread
 OBJS = $(SRCS:.c=.o) memory_objectServer.o notifyServer.o
 
-MIGSFLAGS = -DSEQNOS
+MIGSFLAGS = -DSEQNOS -imacros $(srcdir)/mig-mutate.h
 MIGCOMSFLAGS = -prefix _pager_
 
 include ../Makeconf
diff --git a/libpager/chg-compl.c b/libpager/chg-compl.c
index 0b0c99c..d77c46c 100644
--- a/libpager/chg-compl.c
+++ b/libpager/chg-compl.c
@@ -22,16 +22,15 @@
    when a memory_object_change_attributes call has completed.  Read this
    in combination with pager-attr.c.  */
 kern_return_t
-_pager_seqnos_memory_object_change_completed (mach_port_t obj,
+_pager_seqnos_memory_object_change_completed (struct pager *p,
                                       mach_port_seqno_t seq,
                                       boolean_t maycache,
                                       memory_object_copy_strategy_t strat)
 {
-  struct pager *p;
   struct attribute_request *ar;
-  
-  p = ports_lookup_port (0, obj, _pager_class);
-  if (!p)
+
+  if (!p
+      || p->port.class != _pager_class)
     {
       printf ("Bad change completed\n");
       return EOPNOTSUPP;
@@ -50,6 +49,5 @@ _pager_seqnos_memory_object_change_completed (mach_port_t obj,
   
   _pager_release_seqno (p, seq);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
   return 0;
 }
diff --git a/libpager/data-request.c b/libpager/data-request.c
index 34b8b43..82ce904 100644
--- a/libpager/data-request.c
+++ b/libpager/data-request.c
@@ -22,22 +22,21 @@
 
 /* Implement pagein callback as described in <mach/memory_object.defs>. */
 kern_return_t
-_pager_seqnos_memory_object_data_request (mach_port_t object,
+_pager_seqnos_memory_object_data_request (struct pager *p,
                                          mach_port_seqno_t seqno,
                                          mach_port_t control,
                                          vm_offset_t offset,
                                          vm_size_t length,
                                          vm_prot_t access)
 {
-  struct pager *p;
   short *pm_entry;
   int doread, doerror;
   error_t err;
   vm_address_t page;
   int write_lock;
 
-  p = ports_lookup_port (0, object, _pager_class);
-  if (!p)
+  if (!p
+      || p->port.class != _pager_class)
     return EOPNOTSUPP;
 
   /* Acquire the right to meddle with the pagemap */
@@ -126,7 +125,6 @@ _pager_seqnos_memory_object_data_request (mach_port_t 
object,
   _pager_mark_object_error (p, offset, length, 0);
   _pager_allow_termination (p);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
   return 0;
 
  error_read:
@@ -136,7 +134,6 @@ _pager_seqnos_memory_object_data_request (mach_port_t 
object,
   pthread_mutex_lock (&p->interlock);
   _pager_allow_termination (p);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
   return 0;
 
  allow_release_out:
@@ -144,6 +141,5 @@ _pager_seqnos_memory_object_data_request (mach_port_t 
object,
  release_out:
   _pager_release_seqno (p, seqno);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
   return 0;
 }
diff --git a/libpager/data-return.c b/libpager/data-return.c
index 6a3b903..ee6c6e8 100644
--- a/libpager/data-return.c
+++ b/libpager/data-return.c
@@ -26,7 +26,7 @@
    as for _pager_seqnos_memory_object_data_return; the additional
    INITIALIZING arg identifies which function is calling us. */
 kern_return_t
-_pager_do_write_request (mach_port_t object,
+_pager_do_write_request (struct pager *p,
                         mach_port_seqno_t seqno,
                         mach_port_t control,
                         vm_offset_t offset,
@@ -36,7 +36,6 @@ _pager_do_write_request (mach_port_t object,
                         int kcopy,
                         int initializing)
 {
-  struct pager *p;
   short *pm_entries;
   int npages, i;
   char *notified;
@@ -47,8 +46,8 @@ _pager_do_write_request (mach_port_t object,
   int wakeup;
   int omitdata = 0;
 
-  p = ports_lookup_port (0, object, _pager_class);
-  if (!p)
+  if (!p
+      || p->port.class != _pager_class)
     return EOPNOTSUPP;
 
   /* Acquire the right to meddle with the pagemap */
@@ -249,19 +248,17 @@ _pager_do_write_request (mach_port_t object,
        }
     }
 
-  ports_port_deref (p);
   return 0;
 
  release_out:
   _pager_release_seqno (p, seqno);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
   return 0;
 }
 
 /* Implement pageout call back as described by <mach/memory_object.defs>. */
 kern_return_t
-_pager_seqnos_memory_object_data_return (mach_port_t object,
+_pager_seqnos_memory_object_data_return (struct pager *p,
                                         mach_port_seqno_t seqno,
                                         mach_port_t control,
                                         vm_offset_t offset,
@@ -270,6 +267,6 @@ _pager_seqnos_memory_object_data_return (mach_port_t object,
                                         int dirty,
                                         int kcopy)
 {
-  return _pager_do_write_request (object, seqno, control, offset, data,
+  return _pager_do_write_request (p, seqno, control, offset, data,
                                  length, dirty, kcopy, 0);
 }
diff --git a/libpager/data-unlock.c b/libpager/data-unlock.c
index 02339ab..599237c 100644
--- a/libpager/data-unlock.c
+++ b/libpager/data-unlock.c
@@ -22,18 +22,17 @@
 /* Implement kernel requests for access as described in
    <mach/memory_object.defs>. */
 kern_return_t
-_pager_seqnos_memory_object_data_unlock (mach_port_t object,
+_pager_seqnos_memory_object_data_unlock (struct pager *p,
                                         mach_port_seqno_t seqno,
                                         mach_port_t control,
                                         vm_offset_t offset,
                                         vm_size_t length,
                                         vm_prot_t access)
 {
-  struct pager *p;
   volatile int err;
 
-  p = ports_lookup_port (0, object, _pager_class);
-  if (!p)
+  if (!p
+      || p->port.class != _pager_class)
     return EOPNOTSUPP;
 
   pthread_mutex_lock (&p->interlock);
@@ -84,6 +83,5 @@ _pager_seqnos_memory_object_data_unlock (mach_port_t object,
       _pager_mark_next_request_error (p, offset, length, err);
     }
  out:
-  ports_port_deref (p);
   return 0;
 }
diff --git a/libpager/lock-completed.c b/libpager/lock-completed.c
index 9ab640f..a3f3f16 100644
--- a/libpager/lock-completed.c
+++ b/libpager/lock-completed.c
@@ -23,18 +23,17 @@
    when a memory_object_lock_request call has completed.  Read this
    in combination with lock-object.c.  */
 kern_return_t
-_pager_seqnos_memory_object_lock_completed (mach_port_t object,
+_pager_seqnos_memory_object_lock_completed (struct pager *p,
                                            mach_port_seqno_t seqno,
                                            mach_port_t control,
                                            vm_offset_t offset,
                                            vm_size_t length)
 {
   error_t err = 0;
-  struct pager *p;
   struct lock_request *lr;
 
-  p = ports_lookup_port (0, object, _pager_class);
-  if (!p)
+  if (!p
+      || p->port.class != _pager_class)
     return EOPNOTSUPP;
 
   pthread_mutex_lock (&p->interlock);
@@ -62,7 +61,6 @@ _pager_seqnos_memory_object_lock_completed (mach_port_t 
object,
  out:
   _pager_release_seqno (p, seqno);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
 
   return err;
 }
diff --git a/libpager/mig-decls.h b/libpager/mig-decls.h
new file mode 100644
index 0000000..0c7b402
--- /dev/null
+++ b/libpager/mig-decls.h
@@ -0,0 +1,42 @@
+/*
+   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 __LIBPAGER_MIG_DECLS_H__
+#define __LIBPAGER_MIG_DECLS_H__
+
+#include "priv.h"
+
+typedef struct pager *pager_t;
+
+/* Called by server stub functions.  */
+
+static inline struct pager * __attribute__ ((unused))
+begin_using_pager (mach_port_t port)
+{
+  return ports_lookup_port (0, port, _pager_class);
+}
+
+static inline void __attribute__ ((unused))
+end_using_pager (struct pager *p)
+{
+  if (p)
+    ports_port_deref (p);
+}
+
+#endif /* __LIBPAGER_MIG_DECLS_H__ */
diff --git a/libpager/mig-mutate.h b/libpager/mig-mutate.h
new file mode 100644
index 0000000..54f7de8
--- /dev/null
+++ b/libpager/mig-mutate.h
@@ -0,0 +1,22 @@
+/*
+   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 MEMORY_OBJECT_INTRAN pager_t begin_using_pager (memory_object_t)
+#define MEMORY_OBJECT_DESTRUCTOR end_using_pager (pager_t)
+#define MEMORY_OBJECT_IMPORTS import "mig-decls.h";
diff --git a/libpager/object-init.c b/libpager/object-init.c
index 90ffc01..6683e24 100644
--- a/libpager/object-init.c
+++ b/libpager/object-init.c
@@ -22,16 +22,14 @@
 /* Implement the object initialiation call as described in
    <mach/memory_object.defs>.  */
 kern_return_t
-_pager_seqnos_memory_object_init (mach_port_t object, 
+_pager_seqnos_memory_object_init (struct pager *p,
                                  mach_port_seqno_t seqno,
                                  mach_port_t control,
                                  mach_port_t name,
                                  vm_size_t pagesize)
 {
-  struct pager *p;
-
-  p = ports_lookup_port (0, object, _pager_class);
-  if (!p)
+  if (!p
+      || p->port.class != _pager_class)
     return EOPNOTSUPP;
 
   pthread_mutex_lock (&p->interlock);
@@ -73,7 +71,6 @@ _pager_seqnos_memory_object_init (mach_port_t object,
  out:
   _pager_release_seqno (p, seqno);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
 
   return 0;
 }
diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c
index 896e2c2..365ba27 100644
--- a/libpager/object-terminate.c
+++ b/libpager/object-terminate.c
@@ -22,15 +22,13 @@
 /* Implement the object termination call from the kernel as described
    in <mach/memory_object.defs>. */
 kern_return_t
-_pager_seqnos_memory_object_terminate (mach_port_t object, 
+_pager_seqnos_memory_object_terminate (struct pager *p,
                                       mach_port_seqno_t seqno,
                                       mach_port_t control,
                                       mach_port_t name)
 {
-  struct pager *p;
-  
-  p = ports_lookup_port (0, object, _pager_class);
-  if (!p)
+  if (!p
+      || p->port.class != _pager_class)
     return EOPNOTSUPP;
 
   pthread_mutex_lock (&p->interlock);
@@ -79,7 +77,6 @@ _pager_seqnos_memory_object_terminate (mach_port_t object,
  out:
   _pager_release_seqno (p, seqno);
   pthread_mutex_unlock (&p->interlock);
-  ports_port_deref (p);
 
   return 0;
 }
diff --git a/libpager/priv.h b/libpager/priv.h
index 7aa0fb4..d49cbb9 100644
--- a/libpager/priv.h
+++ b/libpager/priv.h
@@ -139,6 +139,7 @@ struct port_class *_pager_class;
 void _pager_wait_for_seqno (struct pager *, mach_port_seqno_t);
 void _pager_release_seqno (struct pager *, mach_port_seqno_t);
 void _pager_update_seqno (mach_port_t, mach_port_seqno_t);
+void _pager_update_seqno_p (struct pager *, mach_port_seqno_t);
 void _pager_block_termination (struct pager *);
 void _pager_allow_termination (struct pager *);
 error_t _pager_pagemap_resize (struct pager *, vm_address_t);
diff --git a/libpager/seqnos.c b/libpager/seqnos.c
index 77bfbf2..cab2f33 100644
--- a/libpager/seqnos.c
+++ b/libpager/seqnos.c
@@ -57,13 +57,23 @@ _pager_update_seqno (mach_port_t object,
   struct pager *p;
 
   p = ports_lookup_port (0, object, _pager_class);
+  _pager_update_seqno_p (p, seqno);
   if (p)
+    ports_port_deref (p);
+}
+
+
+/* Just update the seqno, pointer version.  */
+void
+_pager_update_seqno_p (struct pager *p,
+                       mach_port_seqno_t seqno)
+{
+  if (p
+      && p->port.class == _pager_class)
     {
       pthread_mutex_lock (&p->interlock);
       _pager_wait_for_seqno (p, seqno);
       _pager_release_seqno (p, seqno);
       pthread_mutex_unlock (&p->interlock);
-
-      ports_port_deref (p);
     }
 }
diff --git a/libpager/stubs.c b/libpager/stubs.c
index 8478212..411f483 100644
--- a/libpager/stubs.c
+++ b/libpager/stubs.c
@@ -21,7 +21,7 @@
 #include <stdio.h>
 
 kern_return_t
-_pager_seqnos_memory_object_copy (mach_port_t obj,
+_pager_seqnos_memory_object_copy (struct pager *p,
                           mach_port_seqno_t seq,
                           memory_object_control_t obj_ctl,
                           vm_offset_t off,
@@ -30,13 +30,13 @@ _pager_seqnos_memory_object_copy (mach_port_t obj,
 {
   printf ("m_o_copy called\n");
 
-  _pager_update_seqno (obj, seq);
+  _pager_update_seqno_p (p, seq);
 
   return EOPNOTSUPP;
 }
 
 kern_return_t
-_pager_seqnos_memory_object_data_write (mach_port_t obj,
+_pager_seqnos_memory_object_data_write (struct pager *p,
                                 mach_port_seqno_t seq,
                                 mach_port_t ctl,
                                 vm_offset_t off,
@@ -45,13 +45,13 @@ _pager_seqnos_memory_object_data_write (mach_port_t obj,
 {
   printf ("m_o_data_write called\n");
 
-  _pager_update_seqno (obj, seq);
+  _pager_update_seqno_p (p, seq);
 
   return EOPNOTSUPP;
 }
 
 kern_return_t
-_pager_seqnos_memory_object_supply_completed (mach_port_t obj,
+_pager_seqnos_memory_object_supply_completed (struct pager *p,
                                       mach_port_seqno_t seq,
                                       mach_port_t ctl,
                                       vm_offset_t off,
@@ -61,7 +61,7 @@ _pager_seqnos_memory_object_supply_completed (mach_port_t obj,
 {
   printf ("m_o_supply_completed called\n");
 
-  _pager_update_seqno (obj, seq);
+  _pager_update_seqno_p (p, seq);
 
   return EOPNOTSUPP;
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

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