In the Mac version of Jäger, I’m randomly getting crashes from deep within the wxPython code. The application run for several days without a crash, but crash it will eventually.
This is what I think the problem is but I’d like your feedback:
src/mac/thread.cpp class wxMutexInternal { public: ... wxArrayLong m_waiters ; ... }; wxMutexError wxMutexInternal::Lock() { wxMacStCritical critical ; if ( UMASystemIsInitialized() ) { OSErr err ; ThreadID current = kNoThreadID; err = ::MacGetCurrentThread(¤t); // if we are not the owner, add this thread to the list of waiting threads, stop this thread // and invoke the scheduler to continue executing the owner's thread while ( m_owner != kNoThreadID && m_owner != current) { m_waiters.Add(current); err = ::SetThreadStateEndCritical(kCurrentThreadID, kStoppedThreadState, m_owner); err = ::ThreadBeginCritical(); } m_owner = current; } m_locked++; return wxMUTEX_NO_ERROR; }
You’ll notice that the first time through, m_waiters is modified outside the critical section. This same variable is modified in the Unlock code within a critical section, indicating to me that this is the problem. Thoughts?
This is really a dealbreaker for shipping a super reliable version (i.e. non-Beta) version of Jäger. I had another idea of restarting Jäger whenever this happens, but there seems to be no way of trapping the EXC_BAD_ACCESS thrown by the Mach kernel like a normal UNIX bus error. Or is there?