summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@schwinge.name>2011-11-24 09:42:28 +0100
committerThomas Schwinge <thomas@schwinge.name>2011-11-24 09:42:28 +0100
commit3253311ede487203c84fab4f8af696671f0f6568 (patch)
treea76e66c052e02409aa08a9ea57ccb4d319d2eec7
parent473aaa2d4d27ee40b00bcb64b8f6f6450a61209e (diff)
parentac67fbb6e2a503e27a579bdd92bfcd180f377ac4 (diff)
Merge remote-tracking branch 'darnassus/master'
-rw-r--r--libpager/demuxer.c20
-rw-r--r--libpager/notify-stubs.c43
-rw-r--r--libpager/priv.h9
-rw-r--r--libpager/seqnos.c26
-rw-r--r--libpager/stubs.c18
5 files changed, 67 insertions, 49 deletions
diff --git a/libpager/demuxer.c b/libpager/demuxer.c
index d6b99fc2..79c0ddc5 100644
--- a/libpager/demuxer.c
+++ b/libpager/demuxer.c
@@ -1,5 +1,5 @@
/* Demuxer for pager library
- Copyright (C) 1994, 1995, 2002 Free Software Foundation
+ Copyright (C) 1994, 1995, 2002, 2011 Free Software Foundation
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -33,20 +33,8 @@ pager_demuxer (mach_msg_header_t *inp,
int result = _pager_seqnos_memory_object_server (inp, outp)
|| _pager_seqnos_notify_server (inp, outp);
if (!result)
- {
- struct pager *p;
-
- p = ports_lookup_port (0, inp->msgh_local_port, _pager_class);
- if (p)
- {
- /* Synchronize our bookkeeping of the port's seqno with
- the one consumed by this bogus message. */
- mutex_lock (&p->interlock);
- _pager_wait_for_seqno (p, inp->msgh_seqno);
- _pager_release_seqno (p, inp->msgh_seqno);
- mutex_unlock (&p->interlock);
- ports_port_deref (p);
- }
- }
+ /* Synchronize our bookkeeping of the port's seqno with the one consumed by
+ this bogus message. */
+ _pager_update_seqno (inp->msgh_local_port, inp->msgh_seqno);
return result;
}
diff --git a/libpager/notify-stubs.c b/libpager/notify-stubs.c
index 728163e4..2d791aac 100644
--- a/libpager/notify-stubs.c
+++ b/libpager/notify-stubs.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995, 2011 Free Software Foundation, Inc.
Written by Michael I. Bushnell.
This file is part of the GNU Hurd.
@@ -18,58 +18,59 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
+#include "priv.h"
#include "notify_S.h"
#include <errno.h>
error_t
-_pager_do_seqnos_mach_notify_port_deleted (mach_port_t notify
- __attribute__ ((unused)),
- mach_port_seqno_t seqno
- __attribute__ ((unused)),
+_pager_do_seqnos_mach_notify_port_deleted (mach_port_t notify,
+ mach_port_seqno_t seqno,
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_update_seqno (notify, seqno);
+
return 0;
}
error_t
-_pager_do_seqnos_mach_notify_msg_accepted (mach_port_t notify
- __attribute__ ((unused)),
- mach_port_seqno_t seqno
- __attribute__ ((unused)),
+_pager_do_seqnos_mach_notify_msg_accepted (mach_port_t notify,
+ mach_port_seqno_t seqno,
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_update_seqno (notify, seqno);
+
return 0;
}
error_t
-_pager_do_seqnos_mach_notify_port_destroyed (mach_port_t notify
- __attribute__ ((unused)),
- mach_port_seqno_t seqno
- __attribute__ ((unused)),
+_pager_do_seqnos_mach_notify_port_destroyed (mach_port_t notify,
+ mach_port_seqno_t seqno,
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_update_seqno (notify, seqno);
+
return 0;
}
error_t
-_pager_do_seqnos_mach_notify_send_once (mach_port_t notify
- __attribute__ ((unused)),
- mach_port_seqno_t seqno
- __attribute__ ((unused)))
+_pager_do_seqnos_mach_notify_send_once (mach_port_t notify,
+ mach_port_seqno_t seqno)
{
+ _pager_update_seqno (notify, seqno);
+
return 0;
}
error_t
-_pager_do_seqnos_mach_notify_dead_name (mach_port_t notify
- __attribute__ ((unused)),
- mach_port_seqno_t seqno
- __attribute__ ((unused)),
+_pager_do_seqnos_mach_notify_dead_name (mach_port_t notify,
+ mach_port_seqno_t seqno,
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_update_seqno (notify, seqno);
+
return 0;
}
diff --git a/libpager/priv.h b/libpager/priv.h
index 80afff1b..586bccbf 100644
--- a/libpager/priv.h
+++ b/libpager/priv.h
@@ -1,5 +1,5 @@
/* Private data for pager library.
- Copyright (C) 1994,95,96,97,99, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1994-1997, 1999, 2000, 2011 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -50,7 +50,7 @@ struct pager
memory_object_control_t memobjcntl;
memory_object_name_t memobjname;
- int seqno;
+ mach_port_seqno_t seqno;
int noterm; /* number of threads blocking termination */
@@ -131,8 +131,9 @@ extern int _pager_page_errors[];
struct port_class *_pager_class;
-void _pager_wait_for_seqno (struct pager *, int);
-void _pager_release_seqno (struct pager *, int);
+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_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 94cce93b..7d8bcba7 100644
--- a/libpager/seqnos.c
+++ b/libpager/seqnos.c
@@ -1,5 +1,5 @@
/* Sequence number synchronization routines for pager library
- Copyright (C) 1994 Free Software Foundation
+ Copyright (C) 1994, 2011 Free Software Foundation
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -23,7 +23,7 @@
return. */
void
_pager_wait_for_seqno (struct pager *p,
- int seqno)
+ mach_port_seqno_t seqno)
{
while (seqno != p->seqno + 1)
{
@@ -37,7 +37,7 @@ _pager_wait_for_seqno (struct pager *p,
_pager_wait_for_seqno) to be handled. */
void
_pager_release_seqno (struct pager *p,
- int seqno)
+ mach_port_seqno_t seqno)
{
assert (seqno == p->seqno + 1);
p->seqno = seqno;
@@ -47,3 +47,23 @@ _pager_release_seqno (struct pager *p,
condition_broadcast (&p->wakeup);
}
}
+
+
+/* Just update the seqno. */
+void
+_pager_update_seqno (mach_port_t object,
+ mach_port_seqno_t seqno)
+{
+ struct pager *p;
+
+ p = ports_lookup_port (0, object, _pager_class);
+ if (p)
+ {
+ mutex_lock (&p->interlock);
+ _pager_wait_for_seqno (p, seqno);
+ _pager_release_seqno (p, seqno);
+ mutex_unlock (&p->interlock);
+
+ ports_port_deref (p);
+ }
+}
diff --git a/libpager/stubs.c b/libpager/stubs.c
index b455699e..84782120 100644
--- a/libpager/stubs.c
+++ b/libpager/stubs.c
@@ -1,5 +1,5 @@
/* Unused memory object interface stubs
- Copyright (C) 1994 Free Software Foundation
+ Copyright (C) 1994, 2011 Free Software Foundation
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -21,19 +21,22 @@
#include <stdio.h>
kern_return_t
-_pager_seqnos_memory_object_copy (mach_port_t old,
+_pager_seqnos_memory_object_copy (mach_port_t obj,
mach_port_seqno_t seq,
- memory_object_control_t old_ctl,
+ memory_object_control_t obj_ctl,
vm_offset_t off,
vm_size_t len,
mach_port_t new)
{
printf ("m_o_copy called\n");
+
+ _pager_update_seqno (obj, seq);
+
return EOPNOTSUPP;
}
kern_return_t
-_pager_seqnos_memory_object_data_write (mach_port_t old,
+_pager_seqnos_memory_object_data_write (mach_port_t obj,
mach_port_seqno_t seq,
mach_port_t ctl,
vm_offset_t off,
@@ -41,6 +44,9 @@ _pager_seqnos_memory_object_data_write (mach_port_t old,
vm_size_t data_cnt)
{
printf ("m_o_data_write called\n");
+
+ _pager_update_seqno (obj, seq);
+
return EOPNOTSUPP;
}
@@ -54,6 +60,8 @@ _pager_seqnos_memory_object_supply_completed (mach_port_t obj,
vm_offset_t err_off)
{
printf ("m_o_supply_completed called\n");
+
+ _pager_update_seqno (obj, seq);
+
return EOPNOTSUPP;
}
-