153ca1f3190680f3e86aebe0f72f7918d63f71e0dCharles Davis//===-- llvm/Support/Threading.h - Control multithreading mode --*- C++ -*-===// 24c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// 34c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// The LLVM Compiler Infrastructure 44c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// 54c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// This file is distributed under the University of Illinois Open Source 64c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// License. See LICENSE.TXT for details. 74c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// 84c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson//===----------------------------------------------------------------------===// 94c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// 104c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// TThis file defines llvm_start_multithreaded() and friends. 114c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson// 124c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson//===----------------------------------------------------------------------===// 134c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson 14674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_SUPPORT_THREADING_H 15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_SUPPORT_THREADING_H 164c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson 174c7ac18fc9e9af51ea6362871589c13263526d7aOwen Andersonnamespace llvm { 184c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// llvm_start_multithreaded - Allocate and initialize structures needed to 194c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// make LLVM safe for multithreading. The return value indicates whether 204c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// multithreaded initialization succeeded. LLVM will still be operational 211f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer /// on "failed" return, and will still be safe for hosting threading 224c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// applications in the JIT, but will not be safe for concurrent calls to the 234c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// LLVM APIs. 244c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS. 254c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson bool llvm_start_multithreaded(); 261f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer 274c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// llvm_stop_multithreaded - Deallocate structures necessary to make LLVM 284c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// safe for multithreading. 294c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS. 304c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson void llvm_stop_multithreaded(); 311f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer 324c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// llvm_is_multithreaded - Check whether LLVM is executing in thread-safe 334c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// mode or not. 344c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson bool llvm_is_multithreaded(); 351f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer 364c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// acquire_global_lock - Acquire the global lock. This is a no-op if called 374c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// before llvm_start_multithreaded(). 384c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson void llvm_acquire_global_lock(); 391f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer 404c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// release_global_lock - Release the global lock. This is a no-op if called 414c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson /// before llvm_start_multithreaded(). 424c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson void llvm_release_global_lock(); 43ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar 442d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// llvm_execute_on_thread - Execute the given \p UserFn on a separate 452d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// thread, passing it the provided \p UserData. 46ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// 47ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// This function does not guarantee that the code will actually be executed 48ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// on a separate thread or honoring the requested stack size, but tries to do 49ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// so where system support is available. 50ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// 51ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// \param UserFn - The callback to execute. 52ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// \param UserData - An argument to pass to the callback function. 53ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// \param RequestedStackSize - If non-zero, a requested size (in bytes) for 54ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar /// the thread stack. 55ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData, 56ea8e20696e0bc8313b9459484797614a769a5e0cDaniel Dunbar unsigned RequestedStackSize = 0); 574c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson} 584c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson 59ff30b7d173f87ec76970d6f03e863a7b9d450405Owen Anderson#endif 60