glibc/hurd/report-wait.c
Ulrich Drepper 6d52618b15 Update from main archive 961219
Thu Dec 19 23:28:33 1996  Ulrich Drepper  <drepper@cygnus.com>

	* resolv/resolv.h: Update from BIND 4.9.5-P1.
	* resolv/res_comp.c: Likewise.
	* resolv/res_debug.c: Likewise.
	* resolv/Banner: Update version number.

Thu Dec 19 20:58:53 1996  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dlfcn.h: Add extern "C" wrapper.

	* io/utime.h: Don't define NULL since this isn't allowed in POSIX.
	* io/sys/stat.h: Declare `lstat' only if __USE_BSD ||
	__USE_XOPEN_EXTENDED.
	* locale/locale.h: Define NULL.
	* math/math.c: Don't include <errno.h> to define math errors.
	* stdlib/stdlib.h: Likewise.
	* posix/unistd.h: Don't declare environ.
	* posix/sys/utsname.h (struct utsname): Declare member domainname
	as __domainname is !__USE_GNU.
	* signal/signal.h: Declare size_t only if __USE_BSD ||
	__USE_XOPEN_EXTENDED.
	* stdio/stdio.h: Don't declare cuserid when __USE_POSIX, but
	instead when __USE_XOPEN.
	* string/string.h: Define strndup only if __USE_GNU.
	* sysdeps/unix/sysv/linux/clock.c: New file.
	* sysdeps/unix/sysv/linux/timebits.h: Define CLOCKS_PER_SEC as
	1000000 per X/Open standard.
	* features.h: Add code to recognize _POSIX_C_SOURCE value 199309.
	Define __USE_POSIX199309.
	* posix/unistd.h: Declare fdatasync only if __USE_POSIX199309.
	* time/time.c: Declare nanosleep only if __USE_POSIX199309.
	Patches by Rüdiger Helsch <rh@unifix.de>.

	* locale/locale.h: Add declaration of newlocale and freelocale.

	* new-malloc/Makefile (distibute): Add mtrace.awk.
	(dist-routines): Add mcheck and mtrace.
	(install-lib, non-lib.a): Define as libmcheck.a.
	* new-malloc/malloc.h: Add declaration of __malloc_initialized.
	* new-malloc/mcheck.c: New file.
	* new-malloc/mcheck.h: New file.
	* new-malloc/mtrace.c: New file.
	* new-malloc/mtrace.awk: New file.

	* posix/unistd.h: Correct prototype for usleep.
	* sysdeps/unix/bsd/usleep.c: De-ANSI-declfy.  Correct return type.
	* sysdeps/unix/sysv/linux/usleep.c: Real implementation based on
	nanosleep.

	* signal/signal.h: Change protoype of __sigpause to take two
	arguments.  Remove prototype for sigpause.  Add two different
	macros named sigpause selected when __USE_BSD or __USE_XOPEN
	are defined.  This is necessary since the old BSD definition
	of theis function collides with the X/Open definition.
	* sysdeps/posix/sigpause.c: Change function definition to also
	fit X/Open definition.

	* sysdeps/libm-i387/e_exp.S: Make sure stack is empty when the
	function is left.
	* sysdeps/libm-i387/e_expl.S: Likewise.
	Patch by HJ Lu.

1996-12-17  Paul Eggert  <eggert@twinsun.com>

	* many, many files: Spelling corrections.
	* catgets/catgetsinfo.h (mmapped):
	Renamed from mmaped (in struct catalog_info.status).
	* mach/err_kern.sub (err_codes_unix), string/stratcliff.c (main):
	Fix spelling in message.
	* po/libc.pot: Fix spelling in message for `zic'; this anticipates
	a fix in the tzcode distribution.

Wed Dec 18 15:48:02 1996  Ulrich Drepper  <drepper@cygnus.com>

	* time/strftime.c: Implement ^ flag to cause output be converted
	to use upper case characters.

	* time/zic.c: Update from ADO tzcode1996n.

Wed Dec 18 14:29:24 1996  Erik Naggum  <erik@naggum.no>

	* time/strftime.c (add): Don't change global `i' until all is over.
	Define NULL is not already defined.

Tue Dec 17 09:49:03 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libio/iovsprintf.c (_IO_vsprintf): Change `&sf' to `&sf._sbf._f'
	to avoid the need for a cast.
	* libio/iovsscanf.c (_IO_vsscanf): Likewise.

	* sunrpc/rpc/xdr.h: Add prototype for xdr_free.
1996-12-20 01:39:50 +00:00

182 lines
4.4 KiB
C

/* Report on what a thread in our task is waiting for.
Copyright (C) 1996 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <hurd.h>
#include <hurd/signal.h>
#include <hurd/fd.h>
#include <string.h>
#include <assert.h>
#include <hurd/msg_server.h>
#include "thread_state.h"
#include "intr-msg.h"
static void
describe_number (string_t description, const char *flavor, unsigned long int i)
{
unsigned long int j;
char *p = __stpcpy (description, flavor);
/* Allocate space for the number at the end of DESCRIPTION. */
for (j = i; j >= 10; j /= 10)
p++;
p[1] = '\0';
do
{
*p-- = '0' + i % 10;
i /= 10;
} while (i != 0);
assert (*p == '#');
}
static void
describe_port (string_t description, mach_port_t port)
{
int i;
if (port == __mach_task_self ())
{
strcpy (description, "task-self");
return;
}
for (i = 0; i < _hurd_nports; ++i)
if (port == _hurd_ports[i].port)
{
describe_number (description, "init#", i);
return;
}
if (_hurd_init_dtable)
{
for (i = 0; i < _hurd_init_dtablesize; ++i)
if (port == _hurd_init_dtable[i])
{
describe_number (description, "fd#", i);
return;
}
}
else if (_hurd_dtable)
{
for (i = 0; i < _hurd_dtablesize; ++i)
if (_hurd_dtable[i] == NULL)
continue;
else if (port == _hurd_dtable[i]->port.port)
{
describe_number (description, "fd#", i);
return;
}
else if (port == _hurd_dtable[i]->ctty.port)
{
describe_number (description, "bgfd#", i);
return;
}
}
describe_number (description, "port#", port);
}
/* Common defn so we don't link in the itimer code unnecessarily. */
thread_t _hurd_itimer_thread; /* XXX */
kern_return_t
_S_msg_report_wait (mach_port_t msgport, thread_t thread,
string_t description, int *msgid)
{
*msgid = 0;
if (thread == _hurd_msgport_thread)
/* Cute. */
strcpy (description, "msgport");
else if (thread == _hurd_itimer_thread)
strcpy (description, "itimer");
else
{
/* Make sure this is really one of our threads. */
struct hurd_sigstate *ss;
__mutex_lock (&_hurd_siglock);
for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
if (ss->thread == thread)
break;
__mutex_unlock (&_hurd_siglock);
if (ss == NULL)
/* To hell with you. */
return EINVAL;
if (ss->suspended != MACH_PORT_NULL)
strcpy (description, "sigsuspend");
else
{
/* Examine the thread's state to see if it is blocked in an RPC. */
struct machine_thread_state state;
mach_msg_type_number_t count = MACHINE_THREAD_STATE_COUNT;
error_t err;
err = __thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR,
(integer_t *) &state, &count);
if (err)
return err;
assert (count == MACHINE_THREAD_STATE_COUNT);
if (SYSCALL_EXAMINE (&state, msgid))
{
/* Blocked in a system call. */
if (*msgid == -25)
/* mach_msg system call. Examine its parameters. */
describe_port (description, MSG_EXAMINE (&state, msgid));
else
strcpy (description, "kernel");
}
else
description[0] = '\0';
}
}
__mach_port_deallocate (__mach_task_self (), thread);
return 0;
}
kern_return_t
_S_msg_describe_ports (mach_port_t msgport, mach_port_t refport,
mach_port_t *ports, mach_msg_type_number_t nports,
char **desc, mach_msg_type_number_t *desclen)
{
char *p, *end;
if (__USEPORT (AUTH, msgport != port))
return EPERM;
end = *desc + *desclen;
p = *desc;
while (nports-- > 0)
{
char this[200];
describe_port (this, *ports++);
p = __stpncpy (p, this, end - p);
if (p == end && p[-1] != '\0')
return ENOMEM;
}
*desclen = p - *desc;
return 0;
}