nss and pthreads and wine, oh my!
Daniel Eischen
eischen at vigrid.com
Tue Dec 9 21:40:01 PST 2003
On Tue, 9 Dec 2003, Craig Boston wrote:
> I've come across a problem that I believe had been plaguing me on -CURRENT for
> a while but I just now was able to track down a possible cause. The symptoms
> are that wine is unable to run any Win32 program that uses gethostbyname or
> getaddrinfo. I'm seeing this on a recent 5.2-BETA and also an older
> 5.1-RELEASE, so I can rule out the statfs ABI changes. Wine is built from
> source on both and without CPUTYPE on the 5.2-BETA machine.
>
> After building wine (and libc) with debug symbols, I can reproduce the
> following backtrace of where the crash occurs:
>
> #0 0x5ce20000 in ?? ()
> #1 0x5c0f3c98 in _nsdispatch (retval=0x5c71f054, disp_tab=0x5c131400,
> database=0x5c12c920 "hosts", method_name=0x5c12c912 "gethostbyname",
> defaults=0x5c1313d0) at /usr/src/lib/libc/net/nsdispatch.c:574
> #2 0x5c0f3004 in gethostbyname2 (name=0x5d031c40 "test",
> type=2) at /usr/src/lib/libc/net/gethostnamadr.c:88
> #3 0x5c0f2f9e in gethostbyname (name=0x5d031c40 "test")
> at /usr/src/lib/libc/net/gethostnamadr.c:72
>
> line 574 of nsdispatch.c looks like this:
>
> 574 result = _pthread_rwlock_rdlock(&nss_lock);
>
> Now, I've never really delved into libc before, so everything from this point
> is pure guesswork. However, it strikes me as odd that nsdispatch() is
> calling pthread locking primitives in the non-reentrant C library (wine is
> linked against libc.so.5).
>
> A quick grep of the source code shows that the only other thing similar in
> libc is in the RPC code, but in that case it uses a macro that checks
> __isthreaded before calling the pthread function. According to the comments,
> __isthreaded is only set if a process has more than 1 thread. So, I tried
> wrapping all of the pthreads stuff in nsdispatch.c with if(__isthreaded)
> blocks and presto, wine is working again.
>
> I have no idea why wine seems to be the only program that behaves this way...
> At this point I'm not sure if it's a bug in libc or a bug in wine. Has
> anybody else seen similar behavior out of wine or anything else?
>
> Are there any threads gurus out there who know what the 'right thing' for
> nsdispatch to do is?
Yes, I think libc should only call locking primitives when
__isthread != 0.
I am a bit confused though, because I would think nsdispatch works
for other cases and don't know why it isn't for wine. What thread
library are you using?
--
Dan Eischen
More information about the freebsd-current
mailing list