Daemon News Ezine BSD News BSD Mall BSD Support Forum BSD Advocacy BSD Updates

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[no subject]



This is not a usable solution for a package building cluster.

I end with a process consuming all CPU resources and hanging for
waiting for a lock to get released what never happens.

Problem is exit(). Replaceing exit() with _exit() did not help.

[Switching to Process 4968, Thread 1]
0x28050784 in sigprocmask () from /usr/libexec/ld-elf.so.1
(gdb) bt
#0  0x28050784 in sigprocmask () from /usr/libexec/ld-elf.so.1
#1  0x2804f2d1 in xprintf () from /usr/libexec/ld-elf.so.1
#2  0x2804df78 in find_symdef () from /usr/libexec/ld-elf.so.1
#3  0x2838dbd8 in exit () from /usr/lib/libc_r.so.4
#4  0x08048c77 in _start ()

I tried to add the following lines as proposed by Alexander Kabaev
to libexec/rtld-elf/i386/lockdflt.c

> Martin, try to add the loop below to the wlock_acquire function
> to make it look more like lock80386_acquire:
>         while (l->lock != 0)
>             ;   /* Spin */

Now it hangs there ...

[Switching to Process 93059, Thread 1]
0x28050923 in wlock_acquire (lock=0x28067000)
    at /usr/src/libexec/rtld-elf/i386/lockdflt.c:188
188             while (l->lock != 0)
(gdb) bt
#0  0x28050923 in wlock_acquire (lock=0x28067000)
    at /usr/src/libexec/rtld-elf/i386/lockdflt.c:188
#1  0x280505ee in wlock_acquire () at /usr/src/libexec/rtld-elf/rtld.c:202
#2  0x2804ee60 in rtld_exit () at /usr/src/libexec/rtld-elf/rtld.c:1428
#3  0x28390bd8 in exit () from /usr/lib/libc_r.so.4
#4  0x08048c77 in _start ()

(gdb) p l->lock
$2 = 2

(gdb) p tmp_oldsigmask
$3 = {__bits = {0, 0, 0, 0}}

(gdb) p fullsigmask
$4 = {__bits = {4294963463, 4294967295, 4294967295, 4294967295}}

I tried to do this:

(gdb) set l->lock=0
(gdb) c

And got this ...

/usr/libexec/ld-elf.so.1: Application locking error: 1 readers
and 1 writers in
dynamic linker.  See DLLOCKINIT(3) in manual pages.

I'll now try to change it like this:

static void
wlock_acquire(void *lock)
{
    Lock *l = (Lock *)lock;
    sigset_t tmp_oldsigmask;

    for ( ; ; ) {
        sigprocmask(SIG_BLOCK, &fullsigmask, &tmp_oldsigmask);
        if (cmpxchgl(0, WAFLAG, &l->lock) == 0)
            break;
        sigprocmask(SIG_SETMASK, &tmp_oldsigmask, NULL);
+            while (l->lock & WAFLAG)
+            ;   /* Spin */
    }
    oldsigmask = tmp_oldsigmask;
}

Anybody has any clue how to fix this issue ?

Martin

Martin Blapp, <mb@xxxxxx> <mbr@xxxxxxxxxxx>
------------------------------------------------------------------
ImproWare AG, UNIXSP & ISP, Zurlindenstrasse 29, 4133 Pratteln, CH
Phone: +41 061 826 93 00: +41 61 826 93 01
PGP: <finger -l mbr@xxxxxxxxxxx>
PGP Fingerprint: B434 53FC C87C FE7B 0A18 B84C 8686 EF22 D300 551E
------------------------------------------------------------------


To Unsubscribe: send mail to majordomo@xxxxxxxxxxx
with "unsubscribe freebsd-openoffice" in the body of the message