[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
- [hurd] branch upstream updated (d8b7d42 -> 55dd7de), Samuel Thibault, 2014/05/27
- [hurd] 02/61: Fix spurious unlock on error, Samuel Thibault, 2014/05/27
- [hurd] 04/61: hurd: add a new type for the exec_startup protocol, Samuel Thibault, 2014/05/27
- [hurd] 10/61: console-client: drop DIST_FILES from Makefile, Samuel Thibault, 2014/05/27
- [hurd] 05/61: exec: fix receiver lookup, Samuel Thibault, 2014/05/27
- [hurd] 08/61: hurd: add a new type interrupt_t for the interrupt protocol, Samuel Thibault, 2014/05/27
- [hurd] 09/61: libports: fix receiver lookup, Samuel Thibault, 2014/05/27
- [hurd] 06/61: libdiskfs: fix receiver lookup, Samuel Thibault, 2014/05/27
- [hurd] 11/61: boot: remove the ourdevice hack, Samuel Thibault, 2014/05/27
- [hurd] 01/61: libpager: fix receiver lookups,
Samuel Thibault <=
- [hurd] 03/61: Merge branch 'master' of git.savannah.gnu.org:/srv/git/hurd/hurd, Samuel Thibault, 2014/05/27
- [hurd] 19/61: Add missing receiver lookup fix, Samuel Thibault, 2014/05/27
- [hurd] 13/61: libpager: fix notify_port_t receiver lookups, Samuel Thibault, 2014/05/27
- [hurd] 20/61: libdiskfs: set the default sync interval to 30 seconds, Samuel Thibault, 2014/05/27
- [hurd] 12/61: console: fix notify_port_t receiver lookups, Samuel Thibault, 2014/05/27
- [hurd] 21/61: libports: work around bugs in server termination, Samuel Thibault, 2014/05/27
- [hurd] 18/61: Merge branch 'master' of git.savannah.gnu.org:/srv/git/hurd/hurd, Samuel Thibault, 2014/05/27
- [hurd] 16/61: build: Remove configure check for libcrypt., Samuel Thibault, 2014/05/27
- [hurd] 28/61: fatfs: improve diskfs_node_iterate, Samuel Thibault, 2014/05/27
- [hurd] 26/61: fatfs: simplify expression, Samuel Thibault, 2014/05/27