diff options
author | neal <neal> | 2008-01-16 22:23:09 +0000 |
---|---|---|
committer | neal <neal> | 2008-01-16 22:23:09 +0000 |
commit | 884a51902cf63c2bb138468a8d65d394ab338070 (patch) | |
tree | 03756ada622dcad6a453f8baa74eae5141e1f295 /ruth | |
parent | dd96b569ae620aaeab26b2cb49f425caf04c0ab5 (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/ChangeLog | 5 | ||||
-rw-r--r-- | ruth/ruth.c | 55 |
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)); |