All windows Mutex objects are recursive???

From lldb/source/Host/windows/Mutex.cpp:

Mutex::Mutex () :
    m_mutex()
{
    m_mutex = static_cast<PCRITICAL_SECTION>(malloc(sizeof(CRITICAL_SECTION)));
    InitializeCriticalSection(static_cast<PCRITICAL_SECTION>(m_mutex));
}

//----------------------------------------------------------------------
// Default constructor.
//
// Creates a pthread mutex with "type" as the mutex type.
//----------------------------------------------------------------------
Mutex::Mutex (Mutex::Type type) :
    m_mutex()
{
    m_mutex = static_cast<PCRITICAL_SECTION>(malloc(sizeof(CRITICAL_SECTION)));
    InitializeCriticalSection(static_cast<PCRITICAL_SECTION>(m_mutex));
}

It also means that Condition.cpp doesn't act like its unix counterpart as the pthread_contition_t requires that wait be called with a non recursive mutex. Not sure what or if any issues are resulting from this, but I just thought everyone should be aware.

Greg Clayton

Yes, eventually we should move to std::mutex and std::condition_variable, in which case it behaves as expected (std::mutex is non recursive, std::mutex is recursive).

I mean std::recursive_mutex is recursive

It would be nice to get a patch that gets rid of the Mutex.h/Mutex.cpp and switches over to using C++11 std::mutex/std::recursive_mutex and get rid of Condition.h/Condition.cpp for std::condition_variable. Then we can be more consistent. We need to make sure the C++ standard libraries are ready on all platforms first though.

Greg

We already use both std::mutex and std::condition_variable in include/lldb/Utility/TaskPool.h for a while (since October) and nobody complained about it so I think we can safely assume that all platform has the necessary STL support.