1 /* Report on what a thread in our task is waiting for.
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
21 #include <hurd/signal.h>
25 #include <hurd/msg_server.h>
26 #include "thread_state.h"
30 describe_number (string_t description
, const char *flavor
, unsigned long int i
)
33 char *p
= __stpcpy (description
, flavor
);
35 /* Allocate space for the number at the end of DESCRIPTION. */
36 for (j
= i
; j
>= 10; j
/= 10)
49 describe_port (string_t description
, mach_port_t port
)
53 if (port
== __mach_task_self ())
55 strcpy (description
, "task-self");
59 for (i
= 0; i
< _hurd_nports
; ++i
)
60 if (port
== _hurd_ports
[i
].port
)
62 describe_number (description
, "init#", i
);
66 if (_hurd_init_dtable
)
68 for (i
= 0; i
< _hurd_init_dtablesize
; ++i
)
69 if (port
== _hurd_init_dtable
[i
])
71 describe_number (description
, "fd#", i
);
75 else if (_hurd_dtable
)
77 for (i
= 0; i
< _hurd_dtablesize
; ++i
)
78 if (_hurd_dtable
[i
] == NULL
)
80 else if (port
== _hurd_dtable
[i
]->port
.port
)
82 describe_number (description
, "fd#", i
);
85 else if (port
== _hurd_dtable
[i
]->ctty
.port
)
87 describe_number (description
, "bgfd#", i
);
92 describe_number (description
, "port#", port
);
96 /* We want _HURD_ITIMER_THREAD, but don't want to link in the itimer code
98 #if 0 /* libc.so.0.0 needs this defined, so make it a weak alias for now. */
99 extern thread_t _hurd_itimer_thread
; /* XXX */
100 weak_extern (_hurd_itimer_thread
)
102 static thread_t default_hurd_itimer_thread
;
103 weak_alias (default_hurd_itimer_thread
, _hurd_itimer_thread
)
107 _S_msg_report_wait (mach_port_t msgport
, thread_t thread
,
108 string_t description
, int *msgid
)
112 if (thread
== _hurd_msgport_thread
)
114 strcpy (description
, "msgport");
115 else if (&_hurd_msgport_thread
&& thread
== _hurd_itimer_thread
)
116 strcpy (description
, "itimer");
119 /* Make sure this is really one of our threads. */
121 struct hurd_sigstate
*ss
;
123 __mutex_lock (&_hurd_siglock
);
124 for (ss
= _hurd_sigstates
; ss
!= NULL
; ss
= ss
->next
)
125 if (ss
->thread
== thread
)
127 __mutex_unlock (&_hurd_siglock
);
129 /* To hell with you. */
132 if (ss
->suspended
!= MACH_PORT_NULL
)
133 strcpy (description
, "sigsuspend");
136 /* Examine the thread's state to see if it is blocked in an RPC. */
138 struct machine_thread_state state
;
139 mach_msg_type_number_t count
= MACHINE_THREAD_STATE_COUNT
;
142 err
= __thread_get_state (thread
, MACHINE_THREAD_STATE_FLAVOR
,
143 (integer_t
*) &state
, &count
);
146 assert (count
== MACHINE_THREAD_STATE_COUNT
);
147 if (SYSCALL_EXAMINE (&state
, msgid
))
149 /* Blocked in a system call. */
151 /* mach_msg system call. Examine its parameters. */
152 describe_port (description
, MSG_EXAMINE (&state
, msgid
));
154 strcpy (description
, "kernel");
157 description
[0] = '\0';
161 __mach_port_deallocate (__mach_task_self (), thread
);
166 _S_msg_describe_ports (mach_port_t msgport
, mach_port_t refport
,
167 mach_port_t
*ports
, mach_msg_type_number_t nports
,
168 char **desc
, mach_msg_type_number_t
*desclen
)
172 if (__USEPORT (AUTH
, msgport
!= port
))
175 end
= *desc
+ *desclen
;
180 describe_port (this, *ports
++);
181 p
= __stpncpy (p
, this, end
- p
);
182 if (p
== end
&& p
[-1] != '\0')
186 *desclen
= p
- *desc
;