[PATCH] Change base mutex implementations to use STL-provided mutexes
Alp Toker
alp at nuanti.com
Fri Jun 6 12:32:03 PDT 2014
Hi Zachary,
In LLVM platform-specific code goes in the implementation files (.inc)
and never in the portable headers. Certainly for a high-level class like
Mutex I wouldn't expect to see platform-specific conditionals exposed.
A couple of exceptions have slipped in like Support/FileSystem.h and
Support/Process.h with ifdef WIN32 but those are meant to get fixed at
some point.
On a more practical level it's not a good idea to include windows.h
globally throughout the public headers. These headers need to get
included in portable software that embeds clang for tooling etc. and
windows.h is known to be problematic.
For thread primitives, the previous implementation looks broadly
correct. You've explained the mechanics of your changes in detail but
can you explain the motivation here? We need to find a better way to
achieve that without introducing all these OS-specific low-level headers
globally into embedding applications.
Alp.
On 05/06/2014 20:06, Zachary Turner wrote:
> Hi rnk, aaron.ballman, chandlerc,
>
> This is a re-submission of an earlier broken patch.
>
> Change llvm::sys::Mutex implementation to use std::mutex and std::recursive_mutex.
>
> This patch deletes the platform specific mutex implementations, and delegates to the underlying STL implementation. Because STL mutex and recursive_mutex are implemented as separate classes, it is no longer possible to specify as a runtime param whether a recursive mutex is desired, and instead the decision must be made at compile time.
>
> As part of this refactor, the ScopedLock class is deleted in favor of MutexGuard, which provides equivalent functionality.
>
> To make reviewing easier, you can refer to the following table of equivalences in the format (old_type -> new_type)
>
> SmartMutex<true>([true]) -> RecursiveDebugMutex
>
> SmartMutex<false>([true]) -> RecursiveMutex
> sys::Mutex -> SmartMutex<false>() -> RecursiveMutex
>
> SmartMutex<true>(false) -> NonRecursiveDebugMutex
> SmartMutex<false>(false) -> NonRecursiveMutex
>
> One caveat of note is that on Windows std::*mutex cannot be used during an atexit handler. To get around this, a new type AtexitSafeMutex is defined, and on Windows this is typedefed to a critical section.
>
> http://reviews.llvm.org/D4033
>
> Files:
> include/llvm/ExecutionEngine/ExecutionEngine.h
> include/llvm/IR/ValueMap.h
> include/llvm/Support/Mutex.h
> include/llvm/Support/MutexGuard.h
> lib/CodeGen/PseudoSourceValue.cpp
> lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> lib/ExecutionEngine/ExecutionEngine.cpp
> lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
> lib/ExecutionEngine/JIT/JIT.cpp
> lib/ExecutionEngine/JIT/JITEmitter.cpp
> lib/ExecutionEngine/OProfileJIT/OProfileWrapper.cpp
> lib/ExecutionEngine/RuntimeDyld/GDBRegistrar.cpp
> lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
> lib/IR/LeakDetector.cpp
> lib/IR/LegacyPassManager.cpp
> lib/Support/CMakeLists.txt
> lib/Support/CrashRecoveryContext.cpp
> lib/Support/DynamicLibrary.cpp
> lib/Support/Mutex.cpp
> lib/Support/PluginLoader.cpp
> lib/Support/Statistic.cpp
> lib/Support/Threading.cpp
> lib/Support/Timer.cpp
> lib/Support/Unix/Mutex.inc
> lib/Support/Unix/Process.inc
> lib/Support/Unix/Signals.inc
> lib/Support/Windows/DynamicLibrary.inc
> lib/Support/Windows/Mutex.inc
> lib/Target/NVPTX/NVPTXUtilities.cpp
> unittests/IR/ValueMapTest.cpp
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
http://www.nuanti.com
the browser experts
More information about the llvm-commits
mailing list