summaryrefslogtreecommitdiff
path: root/ruth
diff options
context:
space:
mode:
authorneal <neal>2008-01-16 22:23:09 +0000
committerneal <neal>2008-01-16 22:23:09 +0000
commit884a51902cf63c2bb138468a8d65d394ab338070 (patch)
tree03756ada622dcad6a453f8baa74eae5141e1f295 /ruth
parentdd96b569ae620aaeab26b2cb49f425caf04c0ab5 (diff)
hurd/
2008-01-16 Neal H. Walfield <neal@gnu.org> * thread.h (RM_thread_wait_object_destroyed): New define. (thread_wait_object_destroyed): New method. * folio.h (folio_object_alloc): Take additional parameter return_code. viengoos/ 2008-01-16 Neal H. Walfield <neal@gnu.org> * thread.h (THREAD_WAIT_FUTEX): New define. (THREAD_WAIT_DESTROY): Likewise. (struct thread): Remove fields futex_block and futex_offset. Add fields wait_reason and wait_reason_arg. Update users. * object.h (folio_object_alloc): Take additional argument return_code. Update users. (folio_object_wait_queue_for_each): New macro. * object.c: Include <hurd/thread.h>. (folio_object_alloc): Take additional argument return_code. Wake any threads blocked on the object being destroyed. * server.c (server_loop): Update folio_object_alloc method implementation to new API. Pass RETURN_CODE to the call to folio_object_alloc. Implement the thread_wait_object_destroyed method. * t-activity.c (allocate_object): Update rm_folio_object_alloc use to reflect API changes. (test): Likewise. * t-as.c (allocate_object): Likewise. libhurd-mm/ 2008-01-16 Neal H. Walfield <neal@gnu.org> * storage.c (shadow_setup): Update rm_folio_object_alloc use to reflect API changes. (storage_alloc_): Likewise. (storage_free_): Likewise. ruth/ 2008-01-16 Neal H. Walfield <neal@gnu.org> * ruth.c (main): Update rm_folio_object_alloc use to reflect API changes. Add test case for thread_wait_object_destroy.
Diffstat (limited to 'ruth')
-rw-r--r--ruth/ChangeLog5
-rw-r--r--ruth/ruth.c55
2 files changed, 56 insertions, 4 deletions
diff --git a/ruth/ChangeLog b/ruth/ChangeLog
index 05b5aa9..16c9f63 100644
--- a/ruth/ChangeLog
+++ b/ruth/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-16 Neal H. Walfield <neal@gnu.org>
+
+ * ruth.c (main): Update rm_folio_object_alloc use to reflect API
+ changes. Add test case for thread_wait_object_destroy.
+
2008-01-15 Neal H. Walfield <neal@gnu.org>
* ruth.c: Include <hurd/futex.h>.
diff --git a/ruth/ruth.c b/ruth/ruth.c
index d79ed1e..1b5e395 100644
--- a/ruth/ruth.c
+++ b/ruth/ruth.c
@@ -149,7 +149,7 @@ main (int argc, char *argv[])
panic ("capalloc");
err = rm_folio_object_alloc (activity, folio, i, cap_page,
- OBJECT_POLICY_DEFAULT,
+ OBJECT_POLICY_DEFAULT, 0,
addr, ADDR_VOID);
assert ((err == 0) == (0 <= i && i < FOLIO_OBJECTS));
@@ -438,7 +438,7 @@ main (int argc, char *argv[])
a[i].child = capalloc ();
err = rm_folio_object_alloc (activity, folio, obj ++,
cap_activity_control,
- OBJECT_POLICY_DEFAULT,
+ OBJECT_POLICY_DEFAULT, 0,
a[i].child, ADDR_VOID);
assert (err == 0);
@@ -449,7 +449,7 @@ main (int argc, char *argv[])
a[i].page = capalloc ();
err = rm_folio_object_alloc (a[i].child, a[i].folio, 0, cap_page,
- OBJECT_POLICY_DEFAULT,
+ OBJECT_POLICY_DEFAULT, 0,
a[i].page, ADDR_VOID);
assert (err == 0);
@@ -480,7 +480,7 @@ main (int argc, char *argv[])
use the object. If this fails, we assume that the folio was
destroyed. */
err = rm_folio_object_alloc (a[i].child, a[i].folio, 1, cap_page,
- OBJECT_POLICY_DEFAULT,
+ OBJECT_POLICY_DEFAULT, 0,
a[i].page, ADDR_VOID);
assert (err);
@@ -644,6 +644,53 @@ main (int argc, char *argv[])
}
{
+ printf ("Checking thread_wait_object_destroy... ");
+
+ struct storage storage = storage_alloc (activity, cap_page,
+ STORAGE_MEDIUM_LIVED,
+ ADDR_VOID);
+ assert (! ADDR_IS_VOID (storage.addr));
+
+ void *start (void *arg)
+ {
+ uintptr_t ret = 0;
+ error_t err;
+ err = rm_thread_wait_object_destroyed (ADDR_VOID, storage.addr, &ret);
+ debug (5, "object destroy returned: err: %d, ret: %d", err, ret);
+ assert (err == 0);
+ assert (ret == 10);
+ return 0;
+ }
+
+ pthread_t tid;
+ error_t err = pthread_create (&tid, NULL, start, 0);
+ assert (err == 0);
+
+ int i;
+ for (i = 0; i < 100; i ++)
+ l4_yield ();
+
+ /* Deallocate the object. */
+ debug (5, "Destroying object");
+ rm_folio_object_alloc (ADDR_VOID,
+ addr_chop (storage.addr, FOLIO_OBJECTS_LOG2),
+ addr_extract (storage.addr, FOLIO_OBJECTS_LOG2),
+ cap_void,
+ OBJECT_POLICY_VOID, 10, ADDR_VOID, ADDR_VOID);
+ /* Release the memory. */
+ storage_free (storage.addr, true);
+
+ void *status;
+ err = pthread_join (tid, &status);
+ assert (err == 0);
+ debug (5, "Joined thread");
+
+ printf ("ok.\n");
+ }
+
+ {
+ printf ("Checking read-only pages... ");
+
addr_t addr = as_alloc (PAGESIZE_LOG2, 1, true);
assert (! ADDR_IS_VOID (addr));