From 21297437bb37c5f1aedb615fd41e93efc12f556a Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 18 Feb 2002 20:57:51 +0000 Subject: [PATCH] * sysdeps/mach/configure.in: Check for or and add -DNDR_DEF_HEADER=... to DEFINES. * sysdeps/mach/configure: Regenerated. * mach/mach_init.c [NDR_DEF_HEADER]: #include it. * hurd/hurdfault.c (_hurdsig_fault_init): Add a cast. * hurd/hurd/signal.h: Include for `jmp_buf' decl. * mach/msgserver.c (__mach_msg_server_timeout) [! MACH_RCV_LARGE]: Double MAX_SIZE and don't retry on MACH_RCV_TOO_LARGE. * sysdeps/mach/hurd/times.c [NO_CREATION_TIME] (startup_time): New static variable. [NO_CREATION_TIME] (times_init): New static function in __libc_subinit. (__times) [NO_CREATION_TIME]: Use startup_time in lieu of task creation_time from task_basic_info. (__times): Use __gettimeofday instead of __host_get_time. * hurd/intr-msg.c (_hurd_intr_rpc_mach_msg) [! MACH_MSG_TYPE_BIT]: Use untyped Mach IPC message format. * hurd/catch-exc.c: Include , missing from last change. --- ChangeLog | 26 ++++++++++++ hurd/catch-exc.c | 1 + hurd/hurd/signal.h | 5 ++- hurd/hurdfault.c | 3 +- hurd/intr-msg.c | 84 ++++++++++++++++++++++++++++++++++++++- mach/mach_init.c | 5 +++ mach/msgserver.c | 17 +++++++- sysdeps/mach/configure | 67 +++++++++++++++++++++++++++++++ sysdeps/mach/configure.in | 5 +++ sysdeps/mach/hurd/times.c | 23 ++++++++--- 10 files changed, 224 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 513702ff2fa..eba6c7cec67 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,31 @@ +2002-02-18 Roland McGrath + + * sysdeps/mach/configure.in: Check for + or and add -DNDR_DEF_HEADER=... to DEFINES. + * sysdeps/mach/configure: Regenerated. + * mach/mach_init.c [NDR_DEF_HEADER]: #include it. + + * hurd/hurdfault.c (_hurdsig_fault_init): Add a cast. + + * hurd/hurd/signal.h: Include for `jmp_buf' decl. + + * mach/msgserver.c (__mach_msg_server_timeout) [! MACH_RCV_LARGE]: + Double MAX_SIZE and don't retry on MACH_RCV_TOO_LARGE. + 2002-02-17 Roland McGrath + * sysdeps/mach/hurd/times.c + [NO_CREATION_TIME] (startup_time): New static variable. + [NO_CREATION_TIME] (times_init): New static function in __libc_subinit. + (__times) [NO_CREATION_TIME]: Use startup_time in lieu of task + creation_time from task_basic_info. + (__times): Use __gettimeofday instead of __host_get_time. + + * hurd/intr-msg.c (_hurd_intr_rpc_mach_msg) [! MACH_MSG_TYPE_BIT]: + Use untyped Mach IPC message format. + + * hurd/catch-exc.c: Include , missing from last change. + * hurd/Versions (libc: GLIBC_2.0): Add _S_catch_exception_raise_state, _S_catch_exception_raise_state_identity, _hurdsig_fault_catch_exception_raise_state, diff --git a/hurd/catch-exc.c b/hurd/catch-exc.c index 6c58793a98d..33366e0d1a9 100644 --- a/hurd/catch-exc.c +++ b/hurd/catch-exc.c @@ -18,6 +18,7 @@ #include #include +#include /* Called by the microkernel when a thread gets an exception. */ diff --git a/hurd/hurd/signal.h b/hurd/hurd/signal.h index c955ae3ab5b..238a73f19c0 100644 --- a/hurd/hurd/signal.h +++ b/hurd/hurd/signal.h @@ -1,5 +1,5 @@ /* Implementing POSIX.1 signals under the Hurd. - Copyright (C) 1993, 94, 95, 96, 98, 99 Free Software Foundation, Inc. + Copyright (C) 1993,94,95,96,98,99,2002 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 @@ -38,6 +38,7 @@ #include #include /* For `struct mutex'. */ +#include /* For `jmp_buf'. */ #include #include /* We cache sigstate in a threadvar. */ struct hurd_signal_preemptor; /* */ @@ -204,7 +205,7 @@ _hurd_critical_section_unlock (void *our_lock) __spin_unlock (&ss->critical_section_lock); pending = ss->pending & ~ss->blocked; __spin_unlock (&ss->lock); - if (pending) + if (! __sigisemptyset (&pending)) /* There are unblocked signals pending, which weren't delivered because we were in the critical section. Tell the signal thread to deliver them now. */ diff --git a/hurd/hurdfault.c b/hurd/hurdfault.c index ceb2f8c679e..6313f16e2e0 100644 --- a/hurd/hurdfault.c +++ b/hurd/hurdfault.c @@ -193,7 +193,8 @@ _hurdsig_fault_init (void) assert (MACH_PORT_RECEIVE_STATUS_COUNT == sizeof lim / sizeof (natural_t)); err = __mach_port_set_attributes (__mach_task_self (), forward_sigexc, MACH_PORT_RECEIVE_STATUS, - &lim, MACH_PORT_RECEIVE_STATUS_COUNT); + (mach_port_info_t) &lim, + MACH_PORT_RECEIVE_STATUS_COUNT); } #else err = __mach_port_set_qlimit (__mach_task_self (), forward_sigexc, 1); diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c index ae997b2bb23..e75fca81fb6 100644 --- a/hurd/intr-msg.c +++ b/hurd/intr-msg.c @@ -1,5 +1,5 @@ /* Replacement for mach_msg used in interruptible Hurd RPCs. - Copyright (C) 95,96,97,98,99,2000,01 Free Software Foundation, Inc. + Copyright (C) 1995,96,97,98,99,2000,01,02 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 @@ -25,6 +25,9 @@ #include "intr-msg.h" +#ifdef NDR_CHAR_ASCII /* OSF Mach flavors have different names. */ +# define mig_reply_header_t mig_reply_error_t +#endif error_t _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, @@ -40,7 +43,15 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, const mach_msg_option_t user_option = option; const mach_msg_timeout_t user_timeout = timeout; - struct clobber { int i[2]; }; + struct clobber + { +#ifdef NDR_CHAR_ASCII + NDR_record_t ndr; +#else + mach_msg_type_t type; +#endif + error_t err; + }; union msg { mach_msg_header_t header; @@ -48,7 +59,11 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, struct { mach_msg_header_t header; +#ifdef NDR_CHAR_ASCII + NDR_record_t ndr; +#else int type; +#endif int code; } check; struct @@ -147,8 +162,12 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, the message buffer and we might need to clean up the port rights. */ case MACH_SEND_TIMED_OUT: case MACH_SEND_INVALID_NOTIFY: +#ifdef MACH_SEND_NO_NOTIFY case MACH_SEND_NO_NOTIFY: +#endif +#ifdef MACH_SEND_NOTIFY_IN_PROGRESS case MACH_SEND_NOTIFY_IN_PROGRESS: +#endif if (MACH_MSGH_BITS_REMOTE (msg->msgh_bits) == MACH_MSG_TYPE_MOVE_SEND) { __mach_port_deallocate (__mach_task_self (), msg->msgh_remote_port); @@ -159,6 +178,7 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, } if (msg->msgh_bits & MACH_MSGH_BITS_COMPLEX) { +#ifndef MACH_MSG_PORT_DESCRIPTOR /* Check for MOVE_SEND rights in the message. These hold refs that we need to release in case the message is in fact never re-sent later. Since it might in fact be re-sent, we turn @@ -228,6 +248,62 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, ++(void **) ty; } } +#else /* Untyped Mach IPC flavor. */ + mach_msg_body_t *body = (void *) (msg + 1); + mach_msg_descriptor_t *desc = (void *) (body + 1); + mach_msg_descriptor_t *desc_end = desc + body->msgh_descriptor_count; + for (; desc < desc_end; ++desc) + switch (desc->type.type) + { + case MACH_MSG_PORT_DESCRIPTOR: + switch (desc->port.disposition) + { + case MACH_MSG_TYPE_MOVE_SEND: + __mach_port_deallocate (mach_task_self (), + desc->port.name); + desc->port.disposition = MACH_MSG_TYPE_COPY_SEND; + break; + case MACH_MSG_TYPE_COPY_SEND: + case MACH_MSG_TYPE_MOVE_RECEIVE: + break; + default: + assert (! "unexpected port type in interruptible RPC"); + } + break; + case MACH_MSG_OOL_DESCRIPTOR: + if (desc->out_of_line.deallocate) + __vm_deallocate (__mach_task_self (), + (vm_address_t) desc->out_of_line.address, + desc->out_of_line.size); + break; + case MACH_MSG_OOL_PORTS_DESCRIPTOR: + switch (desc->ool_ports.disposition) + { + case MACH_MSG_TYPE_MOVE_SEND: + { + mach_msg_size_t i; + const mach_port_t *ports = desc->ool_ports.address; + for (i = 0; i < desc->ool_ports.count; ++i) + __mach_port_deallocate (__mach_task_self (), ports[i]); + desc->ool_ports.disposition = MACH_MSG_TYPE_COPY_SEND; + break; + } + case MACH_MSG_TYPE_COPY_SEND: + case MACH_MSG_TYPE_MOVE_RECEIVE: + break; + default: + assert (! "unexpected port type in interruptible RPC"); + } + if (desc->ool_ports.deallocate) + __vm_deallocate (__mach_task_self (), + (vm_address_t) desc->ool_ports.address, + desc->ool_ports.count + * sizeof (mach_port_t)); + break; + default: + assert (! "unexpected descriptor type in interruptible RPC"); + } +#endif } break; @@ -285,6 +361,7 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, case MACH_MSG_SUCCESS: { /* We got a reply. Was it EINTR? */ +#ifdef MACH_MSG_TYPE_BIT const union { mach_msg_type_t t; @@ -292,10 +369,13 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, } check = { t: { MACH_MSG_TYPE_INTEGER_T, sizeof (integer_t) * 8, 1, TRUE, FALSE, FALSE, 0 } }; +#endif if (m->reply.RetCode == EINTR && m->header.msgh_size == sizeof m->reply && +#ifdef MACH_MSG_TYPE_BIT m->check.type == check.i && +#endif !(m->header.msgh_bits & MACH_MSGH_BITS_COMPLEX)) { /* It is indeed EINTR. Is the interrupt for us? */ diff --git a/mach/mach_init.c b/mach/mach_init.c index 0dd33e44d9c..552d2685ffe 100644 --- a/mach/mach_init.c +++ b/mach/mach_init.c @@ -24,6 +24,11 @@ mach_port_t __mach_task_self_; vm_size_t __vm_page_size = 0; /* Must be data not bss for weak alias. */ weak_alias (__vm_page_size, vm_page_size) +#ifdef NDR_DEF_HEADER +/* This defines NDR_record, which the MiG-generated stubs use. XXX namespace */ +# include NDR_DEF_HEADER +#endif + void __mach_init (void) { diff --git a/mach/msgserver.c b/mach/msgserver.c index 6471877a78f..82dc3d0c8fd 100644 --- a/mach/msgserver.c +++ b/mach/msgserver.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994, 1995, 1996, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1993,94,95,96,2001,02 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 @@ -49,6 +49,12 @@ /* * HISTORY * $Log$ + * Revision 1.9 2002/02/18 20:56:35 roland + * 2002-02-18 Roland McGrath + * + * * mach/msgserver.c (__mach_msg_server_timeout) [! MACH_RCV_LARGE]: + * Double MAX_SIZE and don't retry on MACH_RCV_TOO_LARGE. + * * Revision 1.8 2002/02/17 07:13:32 roland * 2002-02-16 Roland McGrath * @@ -116,8 +122,12 @@ __mach_msg_server_timeout (boolean_t (*demux) (mach_msg_header_t *request, if (max_size == 0) { +#ifdef MACH_RCV_LARGE option |= MACH_RCV_LARGE; max_size = 2 * __vm_page_size; /* Generic. Good? XXX */ +#else + max_size = 4 * __vm_page_size; /* XXX */ +#endif } request = __alloca (max_size); @@ -187,6 +197,7 @@ __mach_msg_server_timeout (boolean_t (*demux) (mach_msg_header_t *request, switch (mr) { case MACH_RCV_TOO_LARGE: +#ifdef MACH_RCV_LARGE /* The request message is larger than MAX_SIZE, and has not been dequeued. The message header has the actual size of the message. We recurse here in hopes that the compiler @@ -194,6 +205,10 @@ __mach_msg_server_timeout (boolean_t (*demux) (mach_msg_header_t *request, space instead of way too much. */ return __mach_msg_server_timeout (demux, request->Head.msgh_size, rcv_name, option, timeout); +#else + /* XXX the kernel has destroyed the msg */ + break; +#endif case MACH_SEND_INVALID_DEST: /* The reply can't be delivered, so destroy it. This error diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure index 7a269602374..250a2929e56 100644 --- a/sysdeps/mach/configure +++ b/sysdeps/mach/configure @@ -236,3 +236,70 @@ if test $libc_cv_mach_host_page_size = yes; then EOF fi + +ac_safe=`echo "mach/machine/ndr_def.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for mach/machine/ndr_def.h""... $ac_c" 1>&6 +echo "configure:243: checking for mach/machine/ndr_def.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + DEFINES="$DEFINES -DNDR_DEF_HEADER=''" +else + echo "$ac_t""no" 1>&6 +ac_safe=`echo "machine/ndr_def.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for machine/ndr_def.h""... $ac_c" 1>&6 +echo "configure:274: checking for machine/ndr_def.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + DEFINES="$DEFINES -DNDR_DEF_HEADER=''" +else + echo "$ac_t""no" 1>&6 +fi + +fi + diff --git a/sysdeps/mach/configure.in b/sysdeps/mach/configure.in index 05dc45b61dd..fc74e9cb7b4 100644 --- a/sysdeps/mach/configure.in +++ b/sysdeps/mach/configure.in @@ -68,3 +68,8 @@ AC_EGREP_HEADER(host_page_size, mach/mach_host.defs, if test $libc_cv_mach_host_page_size = yes; then AC_DEFINE([HAVE_HOST_PAGE_SIZE]) fi + +AC_CHECK_HEADER(mach/machine/ndr_def.h, [dnl + DEFINES="$DEFINES -DNDR_DEF_HEADER=''"], [dnl +AC_CHECK_HEADER(machine/ndr_def.h, [dnl + DEFINES="$DEFINES -DNDR_DEF_HEADER=''"])]) diff --git a/sysdeps/mach/hurd/times.c b/sysdeps/mach/hurd/times.c index e2327570901..2065aac49aa 100644 --- a/sysdeps/mach/hurd/times.c +++ b/sysdeps/mach/hurd/times.c @@ -33,6 +33,17 @@ clock_from_time_value (const time_value_t *t) return t->seconds * 1000000 + t->microseconds; } +#if NO_CREATION_TIME +static time_value_t startup_time; +static void times_init (void) __attribute__ ((unused)); +static void +times_init (void) +{ + __gettimeofday ((struct timeval *) &startup_time, NULL); +} +text_set_element (__libc_subinit, times_init); +#endif + /* Store the CPU time used by this process and all its dead children (and their dead children) in BUFFER. Return the elapsed real time, or (clock_t) -1 for errors. @@ -66,15 +77,15 @@ __times (struct tms *tms) /* XXX This can't be implemented until getrusage(RUSAGE_CHILDREN) can be. */ tms->tms_cutime = tms->tms_cstime = 0; - err = __host_get_time (__mach_host_self (), &now); - if (err) - return __hurd_fail (err); + if (__gettimeofday ((struct timeval *) &now, NULL) < 0) + return -1; #if NO_CREATION_TIME - return 0; /* XXX */ +# define our_creation_time startup_time #else - return (clock_from_time_value (&now) - - clock_from_time_value (&bi.creation_time)); +# define our_creation_time bi.startup_time #endif + return (clock_from_time_value (&now) + - clock_from_time_value (&our_creation_time)); } weak_alias (__times, times) -- 2.39.2