mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
7c89253a7a
This adds a new llvm::thread class with the same interface as std::thread except there is an extra constructor that allows us to set the new thread's stack size. On Darwin even the default size is boosted to 8MB to match the main thread. It also switches all users of the older C-style `llvm_execute_on_thread` API family over to `llvm::thread` followed by either a `detach` or `join` call and removes the old API. Moved definition of DefaultStackSize into the .cpp file to hopefully fix the build on some (GCC-6?) machines.
113 lines
3.4 KiB
C++
113 lines
3.4 KiB
C++
//===-- llvm/Support/Threading.cpp- Control multithreading mode --*- C++ -*-==//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines helper functions for running LLVM in a multi-threaded
|
|
// environment.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/Threading.h"
|
|
#include "llvm/ADT/Optional.h"
|
|
#include "llvm/Config/config.h"
|
|
#include "llvm/Support/Host.h"
|
|
#include "llvm/Support/thread.h"
|
|
|
|
#include <cassert>
|
|
#include <errno.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
using namespace llvm;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//=== WARNING: Implementation here must contain only TRULY operating system
|
|
//=== independent code.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool llvm::llvm_is_multithreaded() {
|
|
#if LLVM_ENABLE_THREADS != 0
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
#if LLVM_ENABLE_THREADS == 0 || \
|
|
(!defined(_WIN32) && !defined(HAVE_PTHREAD_H))
|
|
uint64_t llvm::get_threadid() { return 0; }
|
|
|
|
uint32_t llvm::get_max_thread_name_length() { return 0; }
|
|
|
|
void llvm::set_thread_name(const Twine &Name) {}
|
|
|
|
void llvm::get_thread_name(SmallVectorImpl<char> &Name) { Name.clear(); }
|
|
|
|
llvm::BitVector llvm::get_thread_affinity_mask() { return {}; }
|
|
|
|
unsigned llvm::ThreadPoolStrategy::compute_thread_count() const {
|
|
// When threads are disabled, ensure clients will loop at least once.
|
|
return 1;
|
|
}
|
|
|
|
#else
|
|
|
|
int computeHostNumHardwareThreads();
|
|
|
|
unsigned llvm::ThreadPoolStrategy::compute_thread_count() const {
|
|
int MaxThreadCount = UseHyperThreads ? computeHostNumHardwareThreads()
|
|
: sys::getHostNumPhysicalCores();
|
|
if (MaxThreadCount <= 0)
|
|
MaxThreadCount = 1;
|
|
if (ThreadsRequested == 0)
|
|
return MaxThreadCount;
|
|
if (!Limit)
|
|
return ThreadsRequested;
|
|
return std::min((unsigned)MaxThreadCount, ThreadsRequested);
|
|
}
|
|
|
|
// Include the platform-specific parts of this class.
|
|
#ifdef LLVM_ON_UNIX
|
|
#include "Unix/Threading.inc"
|
|
#endif
|
|
#ifdef _WIN32
|
|
#include "Windows/Threading.inc"
|
|
#endif
|
|
|
|
#if defined(__APPLE__)
|
|
// Darwin's default stack size for threads except the main one is only 512KB,
|
|
// which is not enough for some/many normal LLVM compilations. This implements
|
|
// the same interface as std::thread but requests the same stack size as the
|
|
// main thread (8MB) before creation.
|
|
const llvm::Optional<unsigned> llvm::thread::DefaultStackSize = 8 * 1024 * 1024;
|
|
#else
|
|
const llvm::Optional<unsigned> llvm::thread::DefaultStackSize = None;
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
Optional<ThreadPoolStrategy>
|
|
llvm::get_threadpool_strategy(StringRef Num, ThreadPoolStrategy Default) {
|
|
if (Num == "all")
|
|
return llvm::hardware_concurrency();
|
|
if (Num.empty())
|
|
return Default;
|
|
unsigned V;
|
|
if (Num.getAsInteger(10, V))
|
|
return None; // malformed 'Num' value
|
|
if (V == 0)
|
|
return Default;
|
|
|
|
// Do not take the Default into account. This effectively disables
|
|
// heavyweight_hardware_concurrency() if the user asks for any number of
|
|
// threads on the cmd-line.
|
|
ThreadPoolStrategy S = llvm::hardware_concurrency();
|
|
S.ThreadsRequested = V;
|
|
return S;
|
|
}
|