summaryrefslogtreecommitdiff
path: root/src/compiler.cc
diff options
context:
space:
mode:
author buzbee <buzbee@google.com> 2012-10-11 14:46:06 -0700
committer buzbee <buzbee@google.com> 2012-10-11 15:33:23 -0700
commit4df2bbdfe6602ce5f141b7b44028b95faa0bd8ef (patch)
tree9c23dad1023ccd1bf710825e6115892291232dae /src/compiler.cc
parent1aae273f8827bcbfff6b00c5babd77a111852272 (diff)
Enable multi-threaded Quick compilation
Reuse thread-local copies of llvm context data for Quick compiler (while continuing to regenerate fresh ones per method for Portable). This is a transitional CL - the upcoming compiler driver change is expected to pass pass a thread context structure to each compiler worker thread rather than use the pthread_key mechanism. Change-Id: I277920a5c2705748c3a9f37ceace53c903747ec2
Diffstat (limited to 'src/compiler.cc')
-rw-r--r--src/compiler.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/compiler.cc b/src/compiler.cc
index 7bec994604..b0d373bd32 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -322,6 +322,8 @@ Compiler::Compiler(InstructionSet instruction_set, bool image, size_t thread_cou
}
VLOG(compiler) << "dlopen(\"" << compiler_so_name << "\", RTLD_LAZY) returned " << compiler_library_;
+ CHECK_PTHREAD_CALL(pthread_key_create, (&tls_key_, NULL), "compiler tls key");
+
#if defined(ART_USE_LLVM_COMPILER) || defined(ART_USE_GREENLAND_COMPILER)
// Initialize compiler_context_
typedef void (*InitCompilerContextFn)(Compiler&);
@@ -431,6 +433,16 @@ Compiler::~Compiler() {
}
}
+CompilerTls* Compiler::GetTls() {
+ // Lazily create thread-local storage
+ CompilerTls* res = static_cast<CompilerTls*>(pthread_getspecific(tls_key_));
+ if (res == NULL) {
+ res = new CompilerTls();
+ CHECK_PTHREAD_CALL(pthread_setspecific, (tls_key_, res), "compiler tls");
+ }
+ return res;
+}
+
ByteArray* Compiler::CreateResolutionStub(InstructionSet instruction_set,
Runtime::TrampolineType type) {
switch (instruction_set) {