[sldev] OSX mutex-related lockups
Steve
steve at lindenlab.com
Tue Aug 7 14:25:41 PDT 2007
Thank you for bringing this to our attention.
The design intention is for mutexes to be unnested and to enforce good
threading design to avoid deadlocks. I am making the change right now
and will test for deadlocks on Windows.
I will also note that we are in the process of re-architecting the
Viewer main loop and startup sequence to be able to detect infinite
loops and deadlocks and improve our error detection and handling. More
information about that later.
-Steve
Trevor Powell wrote:
> This may have been raised before; I'm pretty new to SL development,
> and I haven't read absolutely all of the list archives yet, but I
> haven't seen any comments about it yet.. and as an extra caveat, I'm
> still working with the 1.18.0.6 code; I haven't looked at the source
> for 1.18.1.2 yet. For all I know, this may have already been
> addressed, in which case, please disregard everything that follows. :)
>
>
>
> While testing various patches in an OS X build, I've noticed an issue
> with mutexes. Inside llthread.cpp, line 269, llMutexes create their
> internal mutex objects using the "APR_THREAD_MUTEX_DEFAULT" mutex
> behaviour.
>
> Apparently, under Win32 (I'm reliably informed), this default
> behaviour is the equivalent of APR_THREAD_MUTEX_NESTED, whereas under
> OSX (I've determined through testing), it's the equivalent of
> APR_THREAD_MUTEX_UNNESTED. I haven't tested under Linux, but I
> suspect that it's probably treated as UNNESTED there, as well.
>
>
> So this means that if code within a single thread tries to lock a
> single llMutex twice before unlocking it again, it will appear to run
> correctly in all Win32 builds, but will cause a lockup when that same
> code runs under OS X.
>
> In my local build, I've modified the llMutex class to explicitly
> request the 'NESTED' mutex type, and this seems to have resolved a
> couple of frequent OS X lockups I've suffered while testing various
> patches. I'd propose making this change part of the official source;
> I figure that anything which makes the different platforms work more
> in the same way can only be a good thing, right?
>
> Alternately, it'd be just as good to switch the official source to
> explicitly use 'UNNESTED' mutexes and so share the OS X lockups with
> the Win32 folks, so that Win32-using patch authors become able to
> debug their own mutex issues, which are currently invisible to them.
> The base code appears to have all been written assuming that mutexes
> will follow the UNNESTED mutex behaviour anyway; it's only been in
> patches where I've seen code which assumed mutexes work the other
> way. But I don't actually have any preference one way or the other,
> as long as we all have the same mutex behaviour on the various
> platforms when we're done.
>
>
> It's also worth noting that there are a few mutexes created in SL
> which don't go through the llMutex class, most notably in llapr.cpp
> and in llpumpio.cpp. These also currently use the DEFAULT behaviour,
> and probably also ought to be switched to a specific intended mutex
> behaviour (either NESTED or UNNESTED), instead of letting the
> different platforms treat mutexes in whatever strange manner they
> happen to have set up as the default.
>
> Anybody have thoughts on this? Or better, confirmation that this
> actually is a real potential problem in the base code, and that I
> haven't made some terrible newbie blunder and totally misinterpreted
> all my test results? :)
>
> Trev
> _______________________________________________
> Click here to unsubscribe or manage your list subscription:
> /index.html
More information about the SLDev
mailing list