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