1
0
mirror of https://sourceware.org/git/glibc.git synced 2026-01-06 11:51:29 +03:00

* Versions.def (libc): Move GLIBC_2.2 dependency from GLIBC_2.1.1 to

GLIBC_2.1.3.

1999-11-13  Roland McGrath  <roland@baalperazim.frob.com>
This commit is contained in:
Roland McGrath
1999-11-13 23:52:38 +00:00
parent 28f08f3fd1
commit 0bd019279b
9 changed files with 225 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
/* Report on what a thread in our task is waiting for.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1999 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
@@ -26,51 +26,57 @@
#include "thread_state.h"
#include "intr-msg.h"
static void
describe_number (string_t description, const char *flavor, unsigned long int i)
static char *
describe_number (string_t description, const char *flavor, long int i)
{
unsigned long int j;
char *p = __stpcpy (description, flavor);
char *p = flavor ? description : __stpcpy (description, flavor);
char *end;
/* Handle sign. */
if (i < 0)
{
i = -i;
*p++ = '-';
}
/* Allocate space for the number at the end of DESCRIPTION. */
for (j = i; j >= 10; j /= 10)
p++;
p[1] = '\0';
end = p + 1;
*end = '\0';
do
{
*p-- = '0' + i % 10;
i /= 10;
} while (i != 0);
assert (*p == '#');
return end;
}
static void
static char *
describe_port (string_t description, mach_port_t port)
{
int i;
if (port == MACH_PORT_NULL)
return __stpcpy (description, "(null)");
if (port == MACH_PORT_DEAD)
return __stpcpy (description, "(dead)");
if (port == __mach_task_self ())
{
strcpy (description, "task-self");
return;
}
return __stpcpy (description, "task-self");
for (i = 0; i < _hurd_nports; ++i)
if (port == _hurd_ports[i].port)
{
describe_number (description, "init#", i);
return;
}
return describe_number (description, "init#", i);
if (_hurd_init_dtable)
{
for (i = 0; i < _hurd_init_dtablesize; ++i)
if (port == _hurd_init_dtable[i])
{
describe_number (description, "fd#", i);
return;
}
return describe_number (description, "fd#", i);
}
else if (_hurd_dtable)
{
@@ -78,18 +84,12 @@ describe_port (string_t description, mach_port_t port)
if (_hurd_dtable[i] == NULL)
continue;
else if (port == _hurd_dtable[i]->port.port)
{
describe_number (description, "fd#", i);
return;
}
return describe_number (description, "fd#", i);
else if (port == _hurd_dtable[i]->ctty.port)
{
describe_number (description, "bgfd#", i);
return;
}
return describe_number (description, "bgfd#", i);
}
describe_number (description, "port#", port);
return describe_number (description, "port#", port);
}
@@ -146,12 +146,68 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
assert (count == MACHINE_THREAD_STATE_COUNT);
if (SYSCALL_EXAMINE (&state, msgid))
{
mach_port_t send_port, rcv_port;
mach_msg_option_t option;
mach_msg_timeout_t timeout;
/* 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");
if (*msgid == -25
/* mach_msg system call. Examine its parameters. */
&& MSG_EXAMINE (&state, msgid, &send_port, &rcv_port,
&option, &timeout) == 0)
{
char *p;
if (send_port != MACH_PORT_NULL && *msgid != 0)
{
/* For the normal case of RPCs, we consider the
destination port to be the interesting thing
whether we are in fact sending or receiving at the
moment. That tells us who we are waiting for the
reply from. */
if (send_port == ss->intr_port)
{
/* This is a Hurd interruptible RPC.
Mark it by surrounding the port description
string with [...] brackets. */
description[0] = '[';
p = describe_port (description + 1, send_port);
*p++ = ']';
*p = '\0';
}
else
(void) describe_port (description, send_port);
}
else if (rcv_port != MACH_PORT_NULL)
{
/* This system call had no send port, but had a
receive port. The msgid we extracted is then just
some garbage or perhaps the msgid of the last
message this thread received, but it's not a
helpful thing to return. */
strcpy (describe_port (description, rcv_port), ":rcv");
*msgid = 0;
}
else if ((option & (MACH_RCV_MSG|MACH_RCV_TIMEOUT))
== (MACH_RCV_MSG|MACH_RCV_TIMEOUT))
{
/* A receive with no valid port can be used for a
pure timeout. Report the timeout value (counted
in milliseconds); note this is the original total
time, not the time remaining. */
strcpy (describe_number (description, 0, timeout), "ms");
*msgid = 0;
}
else
{
strcpy (description, "mach_msg");
*msgid = 0;
}
}
else /* Some other system call. */
{
(void) describe_number (description, "syscall#", *msgid);
*msgid = 0;
}
}
else
description[0] = '\0';