On 08/28/2015 18:18, Konstantin Belousov wrote:
On Fri, Aug 28, 2015 at 05:52:42PM +0200, Michiel Boland wrote:
set -e
for a in `seq 1000`
do
echo -n "$a "
xterm -e ssh nonexisting
done
echo ""
(The idea here is that 'ssh nonexisting' should do some work and then exit,
"xterm -e false", etc. don't appear to trigger the bug.)
Prior to the patch, one of the xterms would hang after the counter reaches a
random (reasonably small) number.
After the patch the script runs till completion.
Thank you for testing. Funny detail is that your loop does not hangs for
me, I see flapping xterms until the completion. How many cpus does your
machine have ?
I have a Q8300 (4 cpus) - I guess the timing matters.
Do I understand correctly that the problem is that if you install a signal
handler with signal() (which is what xterm does) and pull in libthr.so somehow,
then there is no thr_sighandler inserted?
I condensed the xterm problem into a small C program. Compile in such a way that
the delay loop does not get optimized out, and link with -lpthread. Eventually,
when executed often enough, this will hang in the same fashion as xterm does.
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void reapchild(int sig __unused)
{
wait(NULL);
}
static void delay(void)
{
long i, n;
n = random() % 1000000;
if (n < 0) {
n = -n;
}
for (i = 0; i < n; i++)
;
}
int main()
{
int p[2];
char dummy;
srandomdev();
if (signal(SIGCHLD, reapchild) == SIG_ERR) {
perror("signal");
exit(1);
}
if (pipe(p) == -1) {
perror("pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("fork");
exit(1);
case 0:
close(p[1]);
read(p[0], &dummy, 1);
_exit(0);
}
close(p[1]);
read(p[0], &dummy, 1);
delay();
exit(0);
}
Below is a slightly improved version of the change, to avoid unnecessary
relocations. Would be good to rebuild the world and confirm that you
see no regression (the patch also affects rtld in some way).
Ok, I will try this patch later today.
Cheers,
Michiel
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[email protected]"