blob: 466c46802647ce1684fd3cc09d0cdaab8688985c [file] [log] [blame]
Owen Andersone3cd5ca2009-06-18 16:54:52 +00001//===-- llvm/System/Threading.cpp- Control multithreading mode --*- C++ -*-==//
Owen Anderson4c7ac182009-06-16 17:33:51 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements llvm_start_multithreaded() and friends.
11//
12//===----------------------------------------------------------------------===//
13
Owen Andersone3cd5ca2009-06-18 16:54:52 +000014#include "llvm/System/Threading.h"
Owen Anderson4c7ac182009-06-16 17:33:51 +000015#include "llvm/System/Atomic.h"
16#include "llvm/System/Mutex.h"
Chris Lattnerc8808152009-07-06 17:24:48 +000017#include "llvm/Config/config.h"
Owen Anderson4c7ac182009-06-16 17:33:51 +000018#include <cassert>
Owen Anderson643dda12009-07-06 21:24:37 +000019
Owen Anderson4c7ac182009-06-16 17:33:51 +000020using namespace llvm;
21
22static bool multithreaded_mode = false;
23
24static sys::Mutex* global_lock = 0;
25
26bool llvm::llvm_start_multithreaded() {
27#ifdef LLVM_MULTITHREADED
28 assert(!multithreaded_mode && "Already multithreaded!");
29 multithreaded_mode = true;
30 global_lock = new sys::Mutex(true);
31
32 // We fence here to ensure that all initialization is complete BEFORE we
33 // return from llvm_start_multithreaded().
34 sys::MemoryFence();
35 return true;
36#else
37 return false;
38#endif
39}
40
41void llvm::llvm_stop_multithreaded() {
42#ifdef LLVM_MULTITHREADED
43 assert(multithreaded_mode && "Not currently multithreaded!");
44
45 // We fence here to insure that all threaded operations are complete BEFORE we
46 // return from llvm_stop_multithreaded().
47 sys::MemoryFence();
48
49 multithreaded_mode = false;
50 delete global_lock;
51#endif
52}
53
54bool llvm::llvm_is_multithreaded() {
55 return multithreaded_mode;
56}
57
58void llvm::llvm_acquire_global_lock() {
59 if (multithreaded_mode) global_lock->acquire();
60}
61
62void llvm::llvm_release_global_lock() {
63 if (multithreaded_mode) global_lock->release();
Owen Anderson1cca27e2009-06-16 20:53:09 +000064}