1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
2005-08-10 Sergio Lopez <koro@sinrega.org>
* seqnos.c (_pager_stubs_update_seqno): New function.
* priv.h (_pager_stubs_update_seqno): New function.
* notify-stubs.c (_pager_do_seqnos_mach_notify_port_deleted):
Call _pager_stubs_update_seqno to properly update seqno.
(_pager_do_seqnos_mach_notify_msg_accepted): Likewise.
(_pager_do_seqnos_mach_notify_port_destroyed): Likewise.
(_pager_do_seqnos_mach_notify_send_once): Likewise.
(_pager_do_seqnos_mach_notify_dead_name): Likewise.
* stubs.c (_pager_seqnos_memory_object_data_write): Likewise.
(_pager_seqnos_memory_object_supply_completed): Likewise.
---
libpager/notify-stubs.c | 6 ++++++
libpager/priv.h | 1 +
libpager/seqnos.c | 22 ++++++++++++++++++++++
libpager/stubs.c | 9 +++++++++
4 files changed, 38 insertions(+)
--- a/libpager/notify-stubs.c
+++ b/libpager/notify-stubs.c
@@ -18,6 +18,7 @@
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>
@@ -29,6 +30,7 @@ _pager_do_seqnos_mach_notify_port_delete
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_stubs_update_seqno (notify, seqno);
return 0;
}
@@ -40,6 +42,7 @@ _pager_do_seqnos_mach_notify_msg_accepte
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_stubs_update_seqno (notify, seqno);
return 0;
}
@@ -51,6 +54,7 @@ _pager_do_seqnos_mach_notify_port_destro
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_stubs_update_seqno (notify, seqno);
return 0;
}
@@ -60,6 +64,7 @@ _pager_do_seqnos_mach_notify_send_once (
mach_port_seqno_t seqno
__attribute__ ((unused)))
{
+ _pager_stubs_update_seqno (notify, seqno);
return 0;
}
@@ -71,5 +76,6 @@ _pager_do_seqnos_mach_notify_dead_name (
mach_port_t name
__attribute__ ((unused)))
{
+ _pager_stubs_update_seqno (notify, seqno);
return 0;
}
--- a/libpager/priv.h
+++ b/libpager/priv.h
@@ -134,6 +134,7 @@ struct port_class *_pager_class;
void _pager_wait_for_seqno (struct pager *, int);
void _pager_release_seqno (struct pager *, int);
+void _pager_stubs_update_seqno (mach_port_t, int);
void _pager_block_termination (struct pager *);
void _pager_allow_termination (struct pager *);
error_t _pager_pagemap_resize (struct pager *, vm_address_t);
--- a/libpager/seqnos.c
+++ b/libpager/seqnos.c
@@ -47,3 +47,25 @@ _pager_release_seqno (struct pager *p,
condition_broadcast (&p->wakeup);
}
}
+
+
+/* This function is called by stub functions to properly update
+ seqno. */
+void
+_pager_stubs_update_seqno (mach_port_t object,
+ int 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);
+ }
+}
+
--- a/libpager/stubs.c
+++ b/libpager/stubs.c
@@ -29,6 +29,9 @@ _pager_seqnos_memory_object_copy (mach_p
mach_port_t new)
{
printf ("m_o_copy called\n");
+
+ _pager_stubs_update_seqno (old, seq);
+
return EOPNOTSUPP;
}
@@ -41,6 +44,9 @@ _pager_seqnos_memory_object_data_write (
vm_size_t data_cnt)
{
printf ("m_o_data_write called\n");
+
+ _pager_stubs_update_seqno (old, seq);
+
return EOPNOTSUPP;
}
@@ -54,6 +60,9 @@ _pager_seqnos_memory_object_supply_compl
vm_offset_t err_off)
{
printf ("m_o_supply_completed called\n");
+
+ _pager_stubs_update_seqno (obj, seq);
+
return EOPNOTSUPP;
}
|