blob: 466c46802647ce1684fd3cc09d0cdaab8688985c [file] [log] [blame]
Shih-wei Liaoe264f622010-02-10 11:10:31 -08001//===-- llvm/System/Threading.cpp- Control multithreading mode --*- C++ -*-==//
2//
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
14#include "llvm/System/Threading.h"
15#include "llvm/System/Atomic.h"
16#include "llvm/System/Mutex.h"
17#include "llvm/Config/config.h"
18#include <cassert>
19
20using 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();
64}