summaryrefslogtreecommitdiff
path: root/libpthread
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2008-12-12 10:20:33 +0100
committerNeal H. Walfield <neal@gnu.org>2008-12-12 10:20:33 +0100
commit57487c9bf316f3ed262d17e4c10b284a263b8187 (patch)
tree95b3ef42f0f0d0a1be513f912855385cc9688ca8 /libpthread
parentf67f59da6de65186c674afb8e7307d6b23f48b63 (diff)
New IPC system. Update code accordingly.
hurd/ 2008-12-11 Neal H. Walfield <neal@gnu.org> Adapt RPC interfaces according to changes in IPC semantics. * messenger.h: New file. * message.h: New file. * ipc.h: New file. * headers.m4: Link sysroot/include/hurd/message.h to hurd/message.h, sysroot/include/hurd/messenger.h to hurd/messenger.h, and sysroot/include/hurd/ipc.h to hurd/ipc.h. * cap.h: Include <hurd/addr.h> and <stdbool.h>. (enum cap_type): Define cap_messenger, cap_rmessenger and cap_type_count. (cap_type_string): Handle cap_messenger and cap_rmessenger. (cap_types_compatible): Likewise. (cap_type_weak_p): Likewise. (cap_type_weaken): Likewise. (cap_type_strengthen): Likewise. (oid_t): Replace L4 type with standard type. (CAP_VOID): Define. * rpc.h [! RPC_TARGET]: Don't error out if not defined. [RPC_TARGET_ARG_]: Don't define or undefine. [RPC_TARGET_]: Likewise. [RPC_TARGET_NEED_ARG]: Ignore. Don't include <l4/ipc.h> or <l4/space.h>. Include <hurd/message.h> and <hurd/ipc.h>. (reply_buffer) [RM_INTERN]: Declare. (messenger_message_load) [RM_INTERN]: Likewise. [! RM_INTERN] Include <hurd/message-buffer.h>. (cap_t): Define. (CPP_FOREACH): Define. (CPP_SAFE_DEREF): Likewise. (RPC_ARGUMENTS): Take additional argument prefix. Use it. Update users. (RPC_CHOP): Rename from this... (RPC_CHOP2): ... to this. Update users. (RPC_TYPE_SHIFT): New define. (RPCLOADARG): Rewrite according to new marshalling semantics. (RPCSTOREARG): Likewise. (RPC_SEND_MARSHAL): Likewise. (RPC_SEND_UNMARSHAL): Likewise. (RPC_REPLY_MARSHAL): Likewise. (RPC_REPLY_UNMARSHAL): Likewise. (RPC_RECEIVE_MARSHAL): New define. (RPC_MARSHAL_GEN_): Break this into... (RPC_SEND_MARSHAL_GEN_): ... this... (RPC_RECEIVE_MARSHAL_GEN_): ... this... (RPC_REPLY_MARSHAL_GEN_): ... and this. Update users. (RPC_MARSHAL_GEN_): Redefine in terms of the new macros. (RPC_SEND_): Rewrite according to new marshalling and IPC semantics. (RPC_SEND_NONBLOCKING_): Define. (RPC_): Rewrite according to new marshalling and IPC semantics. (RPC_REPLY_): Likewise. (RPC_SIMPLE_): Don't define. (RPC_SIMPLE): Don't define. (RPC): Take additional argument ret_cap_count. Update users. (rpc_error_reply_marshal): Rewrite according to new marshalling and IPC semantics. (rpc_error_reply): Likewise. * t-rpc.c (RPC_TARGET_NEED_ARG): Don't define. (RPC_TARGET): Define. (RPC_noargs): Set to a large interger. (RPC_caps): New define. (noargs): Update interface specification according to new IDL interface. Update users. (onein): Likewise. (oneout): Likewise. (onlyin): Likewise. (onlyout): Likewise. (mix): Likewise. (noargs): Likewise. (onein): Likewise. (oneout): Likewise. (onlyin): Likewise. (onlyout): Likewise. (mix): New interface. (RPC_TARGET): Don't undefine. (main): Update to use the new RPC marshalling interface. Write a test using the new `mix' interface. * activity.h (RPC_TARGET_NEED_ARG): Don't undefine. (RPC_TARGET): Don't define. (activity_policy): Update interface specification according to new IDL interface. Update users. (activity_info): Likewise. * cap.h: (RPC_TARGET_NEED_ARG): Don't undefine. (RPC_TARGET): Don't define. (RM_object_slot_copy_out): Don't define. (RM_object_slot_copy_in): Likewise. (RM_object_slot_read): Likewise. (RM_object_reply_on_destruction): Define. (cap_copy): Update interface specification according to new IDL interface. Update users. (cap_rubout): Likewise. (cap_read): Likewise. (object_discarded_clear): Likewise. (object_discard): Likewise. (object_status): Likewise. (object_name): Likewise. (object_reply_on_destruction): New interface replacing thread_wait_destroy. (object_slot_copy_out): Remove interface. (object_slot_copy_in): Likewise. (object_slot_read): Likewise. (RPC_TARGET): Don't undefine. * exceptions.h: Don't include <l4/thread.h>. Include <l4/space.h>. (RPC_STUB_PREFIX): Redefine to `activation'. (RPC_ID_PREFIX EXCEPTION): Redefine to `ACTIVATION'. (RPC_TARGET_NEED_ARG): Don't define. (RPC_TARGET_ARG_TYPE): Likewise. (RPC_TARGET): Likewise. (EXCEPTION_fault): Rename from this... (ACTIVATION_fault): ... to this. Update users. (exception_method_id_string): Rename from this... (activation_method_id_string): ... to this. (struct exception_info): Rename from this... (struct activation_fault_info): ... to this. Update users. (EXCEPTION_INFO_FMT): Rename from this... (ACTIVATION_FAULT_INFO_FMT): ... to this. Update users. (EXCEPTION_INFO_PRINTF): Rename from this... (ACTIVATION_FAULT_INFO_PRINTF): ... to this. Update users. (fault): Update interface specification according to new IDL interface. Update users. * folio.h (RPC_TARGET_NEED_ARG): Don't undefine. (RPC_TARGET): Don't define. (folio_alloc): Update interface specification according to new IDL interface. Update users. (folio_free): Likewise. (folio_object_alloc): Likewise. (folio_policy): Likewise. (RPC_TARGET): Don't undefine. * futex.h (RPC_TARGET_NEED_ARG): Don't undefine. (RPC_TARGET): Don't define. (futex): Update interface specification according to new IDL interface. Update users. (RPC_TARGET): Don't undefine. (futex_using): New function. (futex): Implement in terms of it. (futex_wait_using): New function. (futex_wait): Implement in terms of it. (futex_wake_using): New function. (futex_wake): Implement in terms of it. * thread.h (RM_thread_wait_object_destroyed): Don't define. (RM_thread_raise_exception): Rename from this... (RM_thread_activation_collect): ... to this. (RM_thread_id): Define. (RPC_TARGET_NEED_ARG): Don't undefine. (RPC_TARGET): Don't define. (struct hurd_thread_exregs_in): Remove fields aspace, activity, exception_page, aspace_out, activity_out and exception_page_out. (thread_exregs): Update interface specification according to new IDL interface. Add additional parameters exception_messenger and exception_messenger_out. Update users. (thread_wait_object_destroyed): Remove interface. (struct exception_buffer): Don't define. (thread_raise_exception): Remove interface. (thread_id): New interface. (thread_activation_collect): Likewise. (RPC_TARGET): Don't undefine. * RPC: Update. * exceptions.h (hurd_activation_handler_init_early): New declaration. (hurd_activation_handler_init): Likewise. (hurd_utcb): Likewise. (EXCEPTION_STACK_SIZE_LOG2): Don't define. (EXCEPTION_STACK_SIZE): Likewise. (hurd_activation_state_alloc): New declaration. (exception_page_cleanup): Rename from this... (hurd_activation_state_free): ... to this. Update users. (exception_handler_activated): Rename from this... (hurd_activation_handler_activated): ... to this. (exception_handler_normal): Rename from this... (hurd_activation_handler_normal): ... to this. Update users. Take additional parameter utcb. (exception_handler_entry): Rename from this... (hurd_activation_handler_entry): ... to this. (exception_handler_end): Rename from this... (hurd_activation_handler_end): ... to this. (hurd_activation_message_register): New declaration. (hurd_activation_message_unregister): Likewise. (hurd_activation_stack_dump): Likewise. * thread.h [! __have_vg_thread_id_t] (__have_vg_thread_id_t): Define. [! __have_vg_thread_id_t && USE_L4]: Include <l4.h>. [! __have_vg_thread_id_t && !USE_L4]: Include <stdint.h>. [! __have_vg_thread_id_t] (vg_thread_id_t): Define. [! __have_vg_thread_id_t] (vg_niltid): Define. [! __have_vg_thread_id_t] (VG_THREAD_ID_FMT): Define. [! __have_activation_frame] (__have_activation_frame): Define. [! __have_activation_frame && USE_L4]: Include <l4/ipc.h>. [! __have_activation_frame] (struct hurd_message_buffer): Declare. [! __have_activation_frame] (struct activation_frame): Define in this case. Add fields normal_mode_stack and canary. [! __have_activation_frame && i386] (struct activation_frame): Change regs to have 10 elements. Add fields eax, ecx, edx, eflags, eip, ebx, edi, esi, ebp and esp. [! __have_activation_frame && !USE_L4] (struct activation_frame): Remove fields saved_sender, saved_receiver, saved_timeout, saved_error_code, saved_flags, and saved_br0 in this case. [__need_vg_thread_id_t || __need_activation_frame] (__need_vg_thread_id_t): Undefine. [__need_vg_thread_id_t || __need_activation_frame] (__need_activation_frame): Likewise. [!__need_vg_thread_id_t && !__need_activation_frame]: Include the rest of the file in this case. Include <stdint.h>, <hurd/types.h>, <hurd/addr.h>, <hurd/addr-trans.h>, <hurd/cap.h>, <hurd/messenger.h> and <setjmp.h>. (hurd_activation_frame_longjmp): New declaration. (struct hurd_fault_catcher): New definition. (hurd_fault_catcher_register): New declaration. (hurd_fault_catcher_unregister): Likewise. (struct exception_page): Rename from this... (struct vg_utcb): ... to this. Update users. Remove field exception. Add fields protected_payload, messenger_id, inline_words, inline_caps, inline_word_count, inline_cap_count, inline_data, exception_buffer, extant_messages, catchers, alternate_stack, alternate_stack_inuse, canary0, canary1. (UTCB_CANARY0): Define. (UTCB_CANARY1): Likewise. (THREAD_EXCEPTION_PAGE_SLOT): Rename from this... (THREAD_UTCB): ... to this. (THREAD_EXCEPTION_MESSENGER): Define. (THREAD_SLOTS): Likewise. (THREAD_SLOTS_LOG2): Likewise. (HURD_EXREGS_SET_EXCEPTION_PAGE): Rename from this... (HURD_EXREGS_SET_UTCB): ... to this. Update users. (HURD_EXREGS_SET_EXCEPTION_MESSENGER): Define. (HURD_EXREGS_SET_REGS): Add HURD_EXREGS_SET_EXCEPTION_MESSENGER. (vg_myself): New function. * startup.h (struct hurd_startup_data): Add field messengers. viengoos/ 2008-12-12 Neal H. Walfield <neal@gnu.org> Implement messengers and convert to new IPC semantics. * messenger.h: New file. * messenger.c: New file. * Makefile.am (viengoos_SOURCES): Add messenger.h and messenger.c. * ager.c: Include "messenger.h". (update_stats): Update notifivation code to use messengers. * cap.c: Include <hurd/messenger.h>. (cap_shootdown): Follow thread and messenger objects. * object.h (object_wait_queue_head): Use and return struct messenger *'s, not struct thread *'s. Update users. (object_wait_queue_tail): Likewise. (object_wait_queue_next): Likewise. (object_wait_queue_prev): Likewise. (object_wait_queue_enqueue): Likewise. (object_wait_queue_dequeue): Likewise. Rename from this... (object_wait_queue_unlink): ... to this. (object_wait_queue_push): New declaration. (folio_object_wait_queue_for_each): Use and return struct messenger *'s, not struct thread *'s. Update users. (object_wait_queue_for_each): Likewise. * object.c: Include <hurd/messenger.h> and "messenger.h". (folio_object_alloc): When destroying a messenger, call messenger_destroy. (folio_object_alloc): Send notifications using messengers. (object_wait_queue_head): Use and return struct messenger *'s, not struct thread *'s. (object_wait_queue_tail): Likewise. (object_wait_queue_next): Likewise. (object_wait_queue_prev): Likewise. (object_wait_queue_check): Likewise. (object_wait_queue_enqueue): Likewise. Add MESSENGER to end of the queue, not the beginning. (object_wait_queue_push): New function. (object_wait_queue_dequeue): Use and return struct messenger *'s, not struct thread *'s. Rename from this... (object_wait_queue_unlink): ... to this. * pager.c: Include "messenger.h". * thread.h: Don't include "list.h". Include <hurd/cap.h> and <hurd/thread.h>. (struct folio): Remove declaration. (THREAD_SLOTS): Don't define. (THREAD_WAIT_FUTEX): Move from here... * messenger.h (MESSENGER_WAIT_FUTEX): ... to here. * thread.h (THREAD_WAIT_DESTROY): Move from here... * messenger.h (MESSENGER_WAIT_DESTROY): ... to here. * thread.h (THREAD_WAIT_ACTIVITY_INFO): Move from here... * messenger.h (MESSENGER_WAIT_ACTIVITY_INFO): ... to here. * thread.h (struct thread): Rename field exception_page to utcb. Add field exception_messenger. Remove fields wait_queue_p, wait_queue_head, wait_queue_tail, wait_reason, wait_reason_arg, wait_reason_arg2, wait_queue and futex_waiter_node. (futex_waiters): Don't declare. (thread_exregs): Change input capabilities to not be pointers to capabilities but just capability structures. Add argument exception_messenger. Remove arguments aspace_out, activity_out and exception_page_out. Update users. (thread_activate): New declaration. (thread_raise_exception): Change MSG's type to be struct vg_message *. Update users. (thread_deliver_pending): New declaration. * thread.c (thread_deinit): Remove code to remove THREAD from a wait queue. (thread_exregs): Change input capabilities to not be pointers to capabilities but just capability structures. Update code. Add argument exception_messenger. Set THREAD's exception messenger according to it and CONTROL. Remove arguments aspace_out, activity_out and exception_page_out. Don't save the old capabilities. (thread_raise_exception): Move body of function... (thread_activate): ... to this new function. Update to use messengers. (thread_raise_exception): Implement in terms of it. (thread_deliver_pending): New function. * server.c: Include <hurd/ipc.h> and "messenger.h". (DEBUG): If label is the IPC label, use "IPC" as the function. (OBJECT_): Take additional parameter WRITABLE. Save whether the object is writable in *WRITABLE. Update users. (OBJECT): Likewise. (server_loop): Update to use messengers and the new IPC interface. Update method implementations appropriately. Don't marshal faults using exception_fault_send_marshal but the new activation_fault_send_marshal. Remove implementations of object_slot_copy_out, object_slot_copy_in and object_slot_read. Reimplement object_discard. In the thread_exregs implementation, handle the exception messenger. Implement thread_id. Remove thread_wait_object_destroyed. Implement object_reply_on_destruction. In activity_info and activity_policy, don't operate on PRINCIPAL but the invoke activity. Implement thread_activation_collect. When blocking on a futex, don't enqueue the calling thread but the reply messenger. Implement the messenger_id method. (REPLY): Redefine before processing an object invocation to reply using the reply messenger included in the request. * rm.h: Include <l4/message.h>. (rm_method_id_string): Don't handle object_slot_copy_out, object_slot_copy_in, object_slot_read, exception_collect or thread_wait_object_destroyed. Handle object_reply_on_destruction, thread_id, thread_activation_collect. (RPC_TARGET_NEED_ARG): Don't undefine. (RPC_TARGET): Don't define. (struct io_buffer): Redefine in terms of L4_NUM_BRS. (write): Update interface specification according to new IDL interface. Update users. (read): Likewise. (as_dump): Likewise. (fault): Likewise. (RPC_STUB_PREFIX): Don't undefine. (RPC_ID_PREFIX): Likewise. libhurd-mm/ 2008-12-12 Neal H. Walfield <neal@gnu.org> Update to new RPC interface and IPC semantics. Support messengers. * message-buffer.h: New file. * message-buffer.c: Likewise. * Makefile.am (libhurd_mm_a_SOURCES): Add message-buffer.h and message-buffer.c. * headers.m4: Link sysroot/include/hurd/message-buffer.h to libhurd-mm/message-buffer.h. * exceptions.c: Include <hurd/mm.h>, <hurd/rm.h> and <backtrace.h>. (hurd_fault_catcher_register): New function. (hurd_fault_catcher_unregister): Likewise. (hurd_activation_frame_longjmp): Likewise. (utcb_state_save): Rename from this... (l4_utcb_state_save): ... to this. Take a `struct activation_frame *', not a `struct exception_frame *'. (utcb_state_restore): Rename from this... (l4_utcb_state_restore): ... to this. Take a `struct activation_frame *', not a `struct exception_frame *'. (exception_fetch_exception): Rename from this... (hurd_activation_fetch): ... to this. (hurd_activation_message_register): New function. (hurd_activation_frame_longjmp): Likewise. (exception_frame_slab): Rename from this... (activation_frame_slab): ... to this. Use a static initializer. (exception_frame_slab_alloc): Rename from this... (activation_frame_slab_alloc): ... to this. Don't preserve the L4 utcb. (exception_frame_slab_dealloc): Rename from this... (activation_frame_slab_dealloc): ... to this. (exception_frame_alloc): Rename from this... (activation_frame_alloc): ... to this. If there are no preallocated frames, panic. Move the hard allocation code to... (check_activation_frame_reserve): ... this new function. (hurd_activation_stack_dump): New function. (hurd_activation_handler_normal): Take an additional parameter, the utcb. Add consistency checks. Handle IPC and closures. Update fault handling code to use the new fault interface. If unable to resolve the fault via the pager mechanism, see if a fault catcher in installed. Check the UTCB's canary. If running on the alternate stack, clear UTCB->ALTERNATE_STACK_INUSE on exit. (hurd_activation_handler_activated): Take a `struct vg_utcb *', not a `struct exception_page *'. Handle IPC and closures. Improve test to determine if the fault was a stack fault. If so, return to normal mode to handle the fault and use an alternate stack. (activation_handler_area0): New local variable. (activation_handler_msg): Likewise. (initial_utcb): Likewise. (simple_utcb_fetcher): New function. (hurd_utcb): New variable. (hurd_activation_handler_init_early): New function. (hurd_activation_handler_init): Likewise. (exception_handler_init): Remove function. (ACTIVATION_AREA_SIZE_LOG2): Define. (ACTIVATION_AREA_SIZE): Likewise. (hurd_activation_state_alloc): New function. (exception_page_cleanup): Rename from this... (hurd_activation_state_free): ... to this. Rewrite. * ia32-exception-entry.S (_hurd_activation_handler_entry): Save the eflags before executing a sub instruction. Don't try to smartly calculate the location of the UTCB. Instead, just reload it. (activation_frame_run): Use an alternate stack, if requested. Save ebx and ebi. Pass the utcb to the callback. * mm-init.c [i386]: Include <hurd/pager.h>. Include <backtrace.h>. (mm_init): Call hurd_activation_handler_init_early and hurd_activation_handler_init. Don't call exception_handler_init. (mm_init) [! NDEBUG && i386]: Test the activation code. * as-build.c (do_index): Handle indexing a cap_thread or a cap_messenger. (as_build): Likewise. * as-dump.c (do_walk): Handle indexing a cap_thread or a cap_messenger. * as-lookup.c (as_lookup_rel_internal): Likewise. * as.c (as_walk): Likewise. * storage.c: Include <backtrace.h>. (shadow_setup): Update use of rm_folio_object_alloc according to its new interface. (storage_check_reserve_internal): Likewise. (storage_free_): Likewise. (FREE_PAGES_SERIALIZE): Bump to 32. (storage_alloc): If we try to get storage more than 5 lives, print a warning that we may be experiencing live lock. * pager.h (pager_fault_t): Change info's type from `struct exception_info' to `struct activation_fault_info'. (PAGER_VOID): Define. * map.h: Don't include <hurd/exceptions.h>. Include <hurd/as.h>. (maps_lock_lock): Don't use EXCEPTION_STACK_SIZE but AS_STACK_SPACE. (map_fault): Change info's type from `struct exception_info' to `struct activation_fault_info'. * map.c (map_fault): Change info's type from `struct exception_info' to `struct activation_fault_info'. * as.h (AS_STACK_SPACE): Define. (as_lock): Use AS_STACK_SPACE instead of EXCEPTION_STACK_SIZE. (as_lock_readonly): Likewise. * as.h (AS_CHECK_SHADOW): Only check the address translator for capabilities that designate cappages. * anonymous.h (ANONYMOUS_MAGIC): Define. (struct anonymous_pager): Add field magic. * anonymous.c (fault): Assert that ANON->MAGIC has the expected value. Correctly size PAGES. (mdestroy): Assert that ANON->MAGIC has the expected value. (destroy): Likewise. (advise): Likewise. (anonymous_pager_alloc): Initialize ANON->MAGIC. benchmarks/ 2008-12-12 Neal H. Walfield <neal@gnu.org> Update according to new RPC interfaces. * activity-distribution.c (main): Update use of rm_activity_policy and rm_activity_info to be consistent with the new interface. Replace use of `struct exception_info' with `struct activation_fault_info'. * cache.c (helper): Update use of rm_activity_policy and rm_activity_info to be consistent with the new interface. * shared-memory-distribution.c (main): Likewise. hieronymus/ 2008-12-12 Neal H. Walfield <neal@gnu.org> Update according to new RPC interfaces. * hieronymus.c (activity_alloc): Update use of rm_activity_policy, rm_activity_info and rm_folio_object_alloc to be consistent with new interface. Replace use of rm_thread_wait_object_destroyed with rm_object_reply_on_destruction. libc-parts/ 2008-12-11 Neal H. Walfield <neal@gnu.org> Update to new RPC interfaces. * _exit.c (_exit): Update use of rm_folio_object_alloc to be consistent with the new interface. * backtrace.c (RA) [!RM_INTERN]: Set up a fault catch handler to avoid gratuitously faulting. (backtrace) [!RM_INTERN]: Set up a jump buffer. Jump to it on a fault. (backtrace_print): Use s_printf, not printf. * ia32-crt0.S (STACK_SIZE): Increase to 128 kb. * process-spawn.c (process_spawn): Don't use a capability slot to identify the root of the new thread's address space, allocate a thread object. Allocate messengers for the new thread and save them in STARTUP_DATA->MESSENGERS. * s_printf.c (io_buffer_flush): Use the debug output interface. (s_putchar): Don't call rm_write but use io_buffer_flush. libpthread/ 2008-12-11 Neal H. Walfield <neal@gnu.org> Update to new RPC interfaces, IPC semantics. * sysdeps/viengoos/bits/pthread-np.h: Include <hurd/exceptions.h>. (pthread_hurd_utcb_np): New declaration. * sysdeps/viengoos/pt-hurd-utcb-np.c: New file. * Makefile.am (libpthread_a_SOURCES): Add pt-hurd-utcb.c. * sysdeps/viengoos/pt-sysdep.h (EXCEPTION_AREA_SIZE): Don't define. (EXCEPTION_AREA_SIZE_LOG2): Likewise. (EXCEPTION_PAGE): Likewise. (PTHREAD_SYSDEP_MEMBERS): Remove fields exception_area, and exception_area_va. Add fields utcb and lock_message_buffer. * sysdeps/viengoos/pt-thread-alloc.c: Include <hurd/message-buffer.h>. (__pthread_thread_alloc): Initialize thread->lock_message_buffer. When executed the first time, set the thread's L4 user-defined handler. Initialize THREAD->UTCB with the thread's current utcb. Set HURD_UTCB to PTHREAD_HURD_UTCB_NP. For subsequent threads, don't manually set up the activation area. Instead, call hurd_activation_state_alloc. * sysdeps/viengoos/pt-thread-dealloc.c: Include <hurd/message-buffer.h>. (__pthread_thread_dealloc): Call __pthread_thread_halt. Don't manually clean up the activation area. Instead, call hurd_activation_state_free. Free THREAD->LOCK_MESSAGE_BUFFER. * sysdeps/viengoos/ia32/pt-setup.c (stack_setup): Pre-fault the first four pages of the new stack. (__pthread_setup): Don't set up the activation area. * sysdeps/viengoos/pt-wakeup.c (__pthread_wakeup): Use futex_wake_using with the calling thread's lock messenger. * sysdeps/viengoos/pt-block.c (__pthread_block): Use futex_wait_using and provide THREAD->LOCK_MESSAGE_BUFFER as the message buffer. * sysdeps/viengoos/pt-thread-start.c (__pthread_thread_start): Don't set the first thread's L4 user-defined handler here. (__pthread_thread_start): Update use of rm_thread_exregs according to be consistent with new interface. * sysdeps/viengoos/pt-thread-halt.c (__pthread_thread_halt): If THREAD is the current thread, call vg_suspend. * sysdeps/viengoos/pt-setactivity-np.c (pthread_setactivity_np): Update use of rm_thread_exregs according to be consistent with new interface. * sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c (signal_dispatch_lowlevel): Use __builtin_frame_address to get the current stack frame's start. Update use of rm_thread_exregs according to be consistent with new interface. ruth/ 2008-12-12 Neal H. Walfield <neal@gnu.org> Update to new RPC interfaces. * ruth.c (main): Update use of rm_folio_alloc, rm_folio_object_alloc, rm_thread_exregs, rm_activity_policy, rm_activity_info. Replace use of rm_thread_wait_object_destroy with rm_object_reply_on_destruction. Replace use of `struct exception_info' with `struct activation_fault_info'. Fix signal test's use of condition variables to not rely on the scheduler. When checking deallocation code, set up a fault handler to programmatically determine success.
Diffstat (limited to 'libpthread')
-rw-r--r--libpthread/ChangeLog53
-rw-r--r--libpthread/Makefile.am1
-rw-r--r--libpthread/sysdeps/viengoos/bits/pthread-np.h4
-rw-r--r--libpthread/sysdeps/viengoos/ia32/pt-setup.c26
-rw-r--r--libpthread/sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c11
-rw-r--r--libpthread/sysdeps/viengoos/pt-block.c14
-rw-r--r--libpthread/sysdeps/viengoos/pt-hurd-utcb-np.c28
-rw-r--r--libpthread/sysdeps/viengoos/pt-setactivity-np.c5
-rw-r--r--libpthread/sysdeps/viengoos/pt-sysdep.h24
-rw-r--r--libpthread/sysdeps/viengoos/pt-thread-alloc.c67
-rw-r--r--libpthread/sysdeps/viengoos/pt-thread-dealloc.c22
-rw-r--r--libpthread/sysdeps/viengoos/pt-thread-halt.c21
-rw-r--r--libpthread/sysdeps/viengoos/pt-thread-start.c16
-rw-r--r--libpthread/sysdeps/viengoos/pt-wakeup.c7
14 files changed, 196 insertions, 103 deletions
diff --git a/libpthread/ChangeLog b/libpthread/ChangeLog
index 0c7540c..cd6013f 100644
--- a/libpthread/ChangeLog
+++ b/libpthread/ChangeLog
@@ -1,5 +1,58 @@
2008-12-11 Neal H. Walfield <neal@gnu.org>
+ Update to new RPC interfaces, IPC semantics.
+
+ * sysdeps/viengoos/bits/pthread-np.h: Include <hurd/exceptions.h>.
+ (pthread_hurd_utcb_np): New declaration.
+ * sysdeps/viengoos/pt-hurd-utcb-np.c: New file.
+ * Makefile.am (libpthread_a_SOURCES): Add pt-hurd-utcb.c.
+
+ * sysdeps/viengoos/pt-sysdep.h (EXCEPTION_AREA_SIZE): Don't
+ define.
+ (EXCEPTION_AREA_SIZE_LOG2): Likewise.
+ (EXCEPTION_PAGE): Likewise.
+ (PTHREAD_SYSDEP_MEMBERS): Remove fields exception_area, and
+ exception_area_va. Add fields utcb and lock_message_buffer.
+ * sysdeps/viengoos/pt-thread-alloc.c: Include
+ <hurd/message-buffer.h>.
+ (__pthread_thread_alloc): Initialize thread->lock_message_buffer.
+ When executed the first time, set the thread's L4 user-defined
+ handler. Initialize THREAD->UTCB with the thread's current utcb.
+ Set HURD_UTCB to PTHREAD_HURD_UTCB_NP. For subsequent threads,
+ don't manually set up the activation area. Instead, call
+ hurd_activation_state_alloc.
+ * sysdeps/viengoos/pt-thread-dealloc.c: Include
+ <hurd/message-buffer.h>.
+ (__pthread_thread_dealloc): Call __pthread_thread_halt. Don't
+ manually clean up the activation area. Instead, call
+ hurd_activation_state_free. Free THREAD->LOCK_MESSAGE_BUFFER.
+ * sysdeps/viengoos/ia32/pt-setup.c (stack_setup): Pre-fault the
+ first four pages of the new stack.
+ (__pthread_setup): Don't set up the activation area.
+
+ * sysdeps/viengoos/pt-wakeup.c (__pthread_wakeup): Use
+ futex_wake_using with the calling thread's lock messenger.
+ * sysdeps/viengoos/pt-block.c (__pthread_block): Use
+ futex_wait_using and provide THREAD->LOCK_MESSAGE_BUFFER as the
+ message buffer.
+
+ * sysdeps/viengoos/pt-thread-start.c (__pthread_thread_start):
+ Don't set the first thread's L4 user-defined handler here.
+ (__pthread_thread_start): Update use of rm_thread_exregs according
+ to be consistent with new interface.
+ * sysdeps/viengoos/pt-thread-halt.c (__pthread_thread_halt): If
+ THREAD is the current thread, call vg_suspend.
+
+ * sysdeps/viengoos/pt-setactivity-np.c (pthread_setactivity_np):
+ Update use of rm_thread_exregs according to be consistent with new
+ interface.
+ * sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c
+ (signal_dispatch_lowlevel): Use __builtin_frame_address to get the
+ current stack frame's start. Update use of rm_thread_exregs
+ according to be consistent with new interface.
+
+2008-12-11 Neal H. Walfield <neal@gnu.org>
+
* sysdeps/generic/bits/spin-lock-inline.h: New file.
2008-12-11 Neal H. Walfield <neal@gnu.org>
diff --git a/libpthread/Makefile.am b/libpthread/Makefile.am
index a4d226d..4e820de 100644
--- a/libpthread/Makefile.am
+++ b/libpthread/Makefile.am
@@ -135,6 +135,7 @@ libpthread_a_SOURCES = pt-attr.c pt-attr-destroy.c pt-attr-getdetachstate.c \
sem-post.c sem-unlink.c \
\
pt-setactivity-np.c \
+ pt-hurd-utcb-np.c \
\
kill.c \
killpg.c \
diff --git a/libpthread/sysdeps/viengoos/bits/pthread-np.h b/libpthread/sysdeps/viengoos/bits/pthread-np.h
index a90793d..aea3bab 100644
--- a/libpthread/sysdeps/viengoos/bits/pthread-np.h
+++ b/libpthread/sysdeps/viengoos/bits/pthread-np.h
@@ -25,7 +25,11 @@
#define _BITS_PTHREAD_NP_H 1
#include <hurd/addr.h>
+#include <hurd/exceptions.h>
int pthread_setactivity_np (addr_t activity);
+/* Returns the caller's activation state block. */
+struct vg_utcb *pthread_hurd_utcb_np (void) __attribute__ ((pure));
+
#endif /* bits/pthread-np.h */
diff --git a/libpthread/sysdeps/viengoos/ia32/pt-setup.c b/libpthread/sysdeps/viengoos/ia32/pt-setup.c
index 579905c..88a60e8 100644
--- a/libpthread/sysdeps/viengoos/ia32/pt-setup.c
+++ b/libpthread/sysdeps/viengoos/ia32/pt-setup.c
@@ -73,7 +73,7 @@ stack_setup (struct __pthread *thread,
top = (uintptr_t *) ((uintptr_t) thread->stackaddr + thread->stacksize);
/* Align on 0x10 for MMX operations. */
- top = (uintptr_t) top & ~0xf;
+ top = (uintptr_t *) ((uintptr_t) top & ~0xf);
if (start_routine)
{
@@ -84,6 +84,12 @@ stack_setup (struct __pthread *thread,
*--top = (uintptr_t) entry_point;
}
+ /* We need 4 pages of stack to avoid faulting before we have set up
+ the activation area. Make it so. */
+ int i;
+ for (i = 1; i < 4; i ++)
+ top[-i * PAGESIZE] = 0;
+
return top;
}
@@ -95,23 +101,5 @@ __pthread_setup (struct __pthread *thread,
thread->mcontext.pc = (void *) &_pthread_entry_point;
thread->mcontext.sp = (void *) stack_setup (thread, start_routine, arg,
entry_point);
-
- if (__pthread_num_threads == 1)
- return 0;
-
- assert (! ADDR_IS_VOID (thread->exception_area[0]));
-
- struct exception_page *exception_page = thread->exception_area_va;
-
- /* SP is set to the end of the exception area minus one word, which
- is the location of the exception page. */
- exception_page->exception_handler_sp
- = (uintptr_t) thread->exception_area_va + EXCEPTION_AREA_SIZE;
- exception_page->exception_handler_sp -= sizeof (void *);
- * (void **) exception_page->exception_handler_sp = thread->exception_area_va;
-
- exception_page->exception_handler_ip = (uintptr_t) &exception_handler_entry;
- exception_page->exception_handler_end = (uintptr_t) &exception_handler_end;
-
return 0;
}
diff --git a/libpthread/sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c b/libpthread/sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c
index 37ef821..8dd9be7 100644
--- a/libpthread/sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c
+++ b/libpthread/sysdeps/viengoos/ia32/signal-dispatch-lowlevel.c
@@ -113,8 +113,9 @@ signal_dispatch_lowlevel (struct signal_state *ss, pthread_t tid,
if (self)
{
- /* The return address is just before the first argument. */
- intr_sp = (uintptr_t) &ss - 4;
+ /* The return address is 4 bytes offset from the start of the
+ stack frame. */
+ intr_sp = (uintptr_t) __builtin_frame_address (0) + 4;
assert (* (void **) intr_sp == __builtin_return_address (0));
}
else
@@ -127,7 +128,8 @@ signal_dispatch_lowlevel (struct signal_state *ss, pthread_t tid,
err = rm_thread_exregs (ADDR_VOID, thread->object,
HURD_EXREGS_STOP | HURD_EXREGS_ABORT_IPC
| HURD_EXREGS_GET_REGS,
- in, &out);
+ in, ADDR_VOID, ADDR_VOID, ADDR_VOID, ADDR_VOID,
+ &out, NULL, NULL, NULL, NULL);
if (err)
panic ("Failed to modify thread " ADDR_FMT,
ADDR_PRINTF (thread->object));
@@ -208,6 +210,7 @@ signal_dispatch_lowlevel (struct signal_state *ss, pthread_t tid,
rm_thread_exregs (ADDR_VOID, thread->object,
HURD_EXREGS_SET_SP_IP
| HURD_EXREGS_START | HURD_EXREGS_ABORT_IPC,
- in, &out);
+ in, ADDR_VOID, ADDR_VOID, ADDR_VOID, ADDR_VOID,
+ &out, NULL, NULL, NULL, NULL);
}
}
diff --git a/libpthread/sysdeps/viengoos/pt-block.c b/libpthread/sysdeps/viengoos/pt-block.c
index 2315b1c..548cc3f 100644
--- a/libpthread/sysdeps/viengoos/pt-block.c
+++ b/libpthread/sysdeps/viengoos/pt-block.c
@@ -26,5 +26,17 @@
void
__pthread_block (struct __pthread *thread)
{
- futex_wait (&thread->threadid, thread->threadid);
+ assert (thread->lock_message_buffer);
+
+ struct hurd_message_buffer *mb = thread->lock_message_buffer;
+#ifndef NDEBUG
+ /* Try to detect recursive locks, which we don't handle. */
+ thread->lock_message_buffer = NULL;
+#endif
+
+ futex_wait_using (mb, &thread->threadid, thread->threadid);
+
+#ifndef NDEBUG
+ thread->lock_message_buffer = mb;
+#endif
}
diff --git a/libpthread/sysdeps/viengoos/pt-hurd-utcb-np.c b/libpthread/sysdeps/viengoos/pt-hurd-utcb-np.c
new file mode 100644
index 0000000..b3a76f4
--- /dev/null
+++ b/libpthread/sysdeps/viengoos/pt-hurd-utcb-np.c
@@ -0,0 +1,28 @@
+/* pt-hurd-utcb-np.c: Return the calling thread's utcb.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <pt-internal.h>
+
+struct vg_utcb *
+pthread_hurd_utcb_np (void)
+{
+ struct __pthread *thread = _pthread_self ();
+ return thread->utcb;
+}
+
diff --git a/libpthread/sysdeps/viengoos/pt-setactivity-np.c b/libpthread/sysdeps/viengoos/pt-setactivity-np.c
index f2f0723..efcc9b7 100644
--- a/libpthread/sysdeps/viengoos/pt-setactivity-np.c
+++ b/libpthread/sysdeps/viengoos/pt-setactivity-np.c
@@ -28,12 +28,11 @@ pthread_setactivity_np (addr_t activity)
struct __pthread *self = _pthread_self ();
struct hurd_thread_exregs_in in;
- in.activity = activity;
-
struct hurd_thread_exregs_out out;
int err = rm_thread_exregs (ADDR_VOID, self->object,
HURD_EXREGS_SET_ACTIVITY,
- in, &out);
+ in, ADDR_VOID, activity, ADDR_VOID, ADDR_VOID,
+ &out, NULL, NULL, NULL, NULL);
return err;
}
diff --git a/libpthread/sysdeps/viengoos/pt-sysdep.h b/libpthread/sysdeps/viengoos/pt-sysdep.h
index 5e9fabd..0733640 100644
--- a/libpthread/sysdeps/viengoos/pt-sysdep.h
+++ b/libpthread/sysdeps/viengoos/pt-sysdep.h
@@ -31,20 +31,16 @@
#define PTHREAD_STACK_DEFAULT (2 * 1024 * 1024)
#include <hurd/exceptions.h>
-
-#define EXCEPTION_AREA_SIZE EXCEPTION_STACK_SIZE
-#define EXCEPTION_AREA_SIZE_LOG2 EXCEPTION_STACK_SIZE_LOG2
-/* The exception page is the first object. */
-#define EXCEPTION_PAGE 0
-
-#define PTHREAD_SYSDEP_MEMBERS \
- addr_t object; \
- l4_thread_id_t threadid; \
- addr_t exception_area[EXCEPTION_AREA_SIZE / PAGESIZE]; \
- void *exception_area_va; \
- /* If the above four fields are valid. */ \
- bool have_kernel_resources; \
- l4_word_t my_errno;
+#include <hurd/message-buffer.h>
+
+#define PTHREAD_SYSDEP_MEMBERS \
+ addr_t object; \
+ vg_thread_id_t threadid; \
+ struct vg_utcb *utcb; \
+ struct hurd_message_buffer *lock_message_buffer; \
+ /* If the above fields are valid. */ \
+ bool have_kernel_resources; \
+ uintptr_t my_errno;
extern inline struct __pthread *
__attribute__((__always_inline__))
diff --git a/libpthread/sysdeps/viengoos/pt-thread-alloc.c b/libpthread/sysdeps/viengoos/pt-thread-alloc.c
index 11af1d0..3cc02be 100644
--- a/libpthread/sysdeps/viengoos/pt-thread-alloc.c
+++ b/libpthread/sysdeps/viengoos/pt-thread-alloc.c
@@ -25,6 +25,7 @@
#include <hurd/storage.h>
#include <hurd/as.h>
#include <hurd/addr.h>
+#include <hurd/message-buffer.h>
#include <pt-internal.h>
@@ -38,45 +39,24 @@ __pthread_thread_alloc (struct __pthread *thread)
if (thread->have_kernel_resources)
return 0;
+ thread->lock_message_buffer = hurd_message_buffer_alloc_long ();
/* The main thread is already running of course. */
if (__pthread_num_threads == 1)
{
thread->object = __hurd_startup_data->thread;
thread->threadid = l4_myself ();
+
+ l4_set_user_defined_handle ((l4_word_t) thread);
+
+ /* Get the thread's UTCB and stash it. */
+ thread->utcb = hurd_utcb ();
+ /* Override the utcb fetch function. */
+ hurd_utcb = pthread_hurd_utcb_np;
+ assert (thread->utcb == hurd_utcb ());
}
else
{
- addr_t exception_area = as_alloc (EXCEPTION_AREA_SIZE_LOG2, 1, true);
-
- thread->exception_area_va
- = ADDR_TO_PTR (addr_extend (exception_area,
- 0, EXCEPTION_AREA_SIZE_LOG2));
-
- int i;
- for (i = 0; i < EXCEPTION_AREA_SIZE / PAGESIZE; i ++)
- {
- addr_t slot = addr_chop (PTR_TO_ADDR (thread->exception_area_va
- + i * PAGESIZE),
- PAGESIZE_LOG2);
- as_ensure (slot);
-
- struct storage storage = storage_alloc (ADDR_VOID, cap_page,
- STORAGE_LONG_LIVED,
- OBJECT_POLICY_DEFAULT,
- slot);
- if (ADDR_IS_VOID (storage.addr))
- {
- int j;
- for (j = 0; j < i; j ++)
- storage_free (thread->exception_area[j], false);
- as_free (exception_area, false);
- return EAGAIN;
- }
-
- thread->exception_area[i] = storage.addr;
- }
-
struct storage storage;
storage = storage_alloc (meta_data_activity, cap_thread,
/* Threads are rarely shortly lived. */
@@ -84,14 +64,33 @@ __pthread_thread_alloc (struct __pthread *thread)
ADDR_VOID);
if (ADDR_IS_VOID (storage.addr))
{
- int j;
- for (j = 0; j < EXCEPTION_AREA_SIZE / PAGESIZE; j ++)
- storage_free (thread->exception_area[j], false);
- as_free (exception_area, false);
+ debug (0, DEBUG_BOLD ("Out of memory"));
return EAGAIN;
}
thread->object = storage.addr;
+
+ error_t err;
+ err = hurd_activation_state_alloc (thread->object, &thread->utcb);
+ if (unlikely (err))
+ panic ("Failed to initialize thread's activation state: %d", err);
+
+ err = rm_cap_copy (ADDR_VOID,
+ thread->lock_message_buffer->receiver,
+ ADDR (VG_MESSENGER_THREAD_SLOT,
+ VG_MESSENGER_SLOTS_LOG2),
+ ADDR_VOID, thread->object,
+ 0, CAP_PROPERTIES_DEFAULT);
+ if (err)
+ panic ("Failed to set lock messenger's thread");
+
+ /* Unblock the lock messenger. */
+ err = vg_ipc (VG_IPC_RECEIVE | VG_IPC_RECEIVE_ACTIVATE
+ | VG_IPC_RETURN,
+ ADDR_VOID, thread->lock_message_buffer->receiver, ADDR_VOID,
+ ADDR_VOID, ADDR_VOID, ADDR_VOID, ADDR_VOID);
+ if (err)
+ panic ("Failed to unblock messenger's thread");
}
thread->have_kernel_resources = true;
diff --git a/libpthread/sysdeps/viengoos/pt-thread-dealloc.c b/libpthread/sysdeps/viengoos/pt-thread-dealloc.c
index 71b3d96..9e174a9 100644
--- a/libpthread/sysdeps/viengoos/pt-thread-dealloc.c
+++ b/libpthread/sysdeps/viengoos/pt-thread-dealloc.c
@@ -26,30 +26,20 @@
#include <hurd/mutex.h>
#include <hurd/as.h>
#include <hurd/addr.h>
+#include <hurd/message-buffer.h>
void
__pthread_thread_dealloc (struct __pthread *thread)
{
assert (thread != _pthread_self ());
- /* Clean up the exception page. */
- exception_page_cleanup
- (ADDR_TO_PTR (addr_extend (thread->exception_area[EXCEPTION_PAGE],
- 0, PAGESIZE_LOG2)));
+ __pthread_thread_halt (thread);
- /* Free the storage. */
- int i;
- for (i = 0; i < EXCEPTION_AREA_SIZE / PAGESIZE; i ++)
- {
- assert (! ADDR_IS_VOID (thread->exception_area[i]));
- storage_free (thread->exception_area[i], false);
- }
+ /* Clean up the activation state. */
+ hurd_activation_state_free (thread->utcb);
- /* And the address space. */
- as_free (addr_chop (PTR_TO_ADDR (thread->exception_area_va),
- EXCEPTION_AREA_SIZE_LOG2), false);
-
- storage_free (thread->object, false);
+ assert (thread->lock_message_buffer);
+ hurd_message_buffer_free (thread->lock_message_buffer);
thread->have_kernel_resources = 0;
}
diff --git a/libpthread/sysdeps/viengoos/pt-thread-halt.c b/libpthread/sysdeps/viengoos/pt-thread-halt.c
index aef1395..cfa861b 100644
--- a/libpthread/sysdeps/viengoos/pt-thread-halt.c
+++ b/libpthread/sysdeps/viengoos/pt-thread-halt.c
@@ -27,6 +27,25 @@
void
__pthread_thread_halt (struct __pthread *thread)
{
+ /* We need to be careful. This function is called in three
+ situations: by the thread itself when it is about to exit, by a
+ thread joining it, and when reusing an existing thread. Hence,
+ it must be kosher to interrupt this functions execution at any
+ point: syncronization is difficult as in the first case, there is
+ no way to indicate completion. */
if (thread->have_kernel_resources)
- thread_stop (thread->object);
+ {
+ if (thread == _pthread_self ())
+ {
+ while (1)
+ vg_suspend ();
+ }
+ else
+ {
+ error_t err = thread_stop (thread->object);
+ if (err)
+ panic ("Failed to halt " ADDR_FMT ": %d",
+ ADDR_PRINTF (thread->object), err);
+ }
+ }
}
diff --git a/libpthread/sysdeps/viengoos/pt-thread-start.c b/libpthread/sysdeps/viengoos/pt-thread-start.c
index 9db399c..f03f4c2 100644
--- a/libpthread/sysdeps/viengoos/pt-thread-start.c
+++ b/libpthread/sysdeps/viengoos/pt-thread-start.c
@@ -1,5 +1,5 @@
-/* Start thread. L4 version.
- Copyright (C) 2007 Free Software Foundation, Inc.
+/* Start thread. Viengoos version.
+ Copyright (C) 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -35,21 +35,17 @@ __pthread_thread_start (struct __pthread *thread)
{
assert (__pthread_total == 1);
assert (l4_is_thread_equal (l4_myself (), thread->threadid));
- l4_set_user_defined_handle ((l4_word_t) thread);
}
else
{
struct hurd_thread_exregs_in in;
struct hurd_thread_exregs_out out;
- in.aspace = ADDR (0, 0);
+ addr_t aspace = ADDR (0, 0);
in.aspace_cap_properties = CAP_PROPERTIES_VOID;
in.aspace_cap_properties_flags = CAP_COPY_COPY_SOURCE_GUARD;
- in.activity = ADDR_VOID;
-
- in.exception_page = addr_chop (PTR_TO_ADDR (thread->exception_area_va),
- PAGESIZE_LOG2);
+ addr_t activity = ADDR_VOID;
in.sp = (l4_word_t) thread->mcontext.sp;
in.ip = (l4_word_t) thread->mcontext.pc;
@@ -58,12 +54,12 @@ __pthread_thread_start (struct __pthread *thread)
err = rm_thread_exregs (ADDR_VOID, thread->object,
HURD_EXREGS_SET_ASPACE
| HURD_EXREGS_SET_ACTIVITY
- | HURD_EXREGS_SET_EXCEPTION_PAGE
| HURD_EXREGS_SET_SP_IP
| HURD_EXREGS_SET_USER_HANDLE
| HURD_EXREGS_START
| HURD_EXREGS_ABORT_IPC,
- in, &out);
+ in, aspace, activity, ADDR_VOID, ADDR_VOID,
+ &out, NULL, NULL, NULL, NULL);
assert (err == 0);
}
return 0;
diff --git a/libpthread/sysdeps/viengoos/pt-wakeup.c b/libpthread/sysdeps/viengoos/pt-wakeup.c
index e568a6f..60804ea 100644
--- a/libpthread/sysdeps/viengoos/pt-wakeup.c
+++ b/libpthread/sysdeps/viengoos/pt-wakeup.c
@@ -27,6 +27,10 @@
void
__pthread_wakeup (struct __pthread *thread)
{
+ struct __pthread *self = _pthread_self ();
+ assert (self != thread);
+ assert (self->lock_message_buffer);
+
/* We need to loop here as the blocked thread may not yet be
blocked! Here's what happens when a thread blocks: it registers
itself as blocked, drops the relevant lock and then actually
@@ -36,7 +40,8 @@ __pthread_wakeup (struct __pthread *thread)
long ret;
do
{
- ret = futex_wake (&thread->threadid, INT_MAX);
+ ret = futex_wake_using (self->lock_message_buffer,
+ &thread->threadid, INT_MAX);
assertx (ret <= 1, "tid: %x, ret: %d", thread->threadid, ret);
if (ret == 0)