From 4df2bbdfe6602ce5f141b7b44028b95faa0bd8ef Mon Sep 17 00:00:00 2001 From: buzbee Date: Thu, 11 Oct 2012 14:46:06 -0700 Subject: 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 --- src/compiler.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/compiler.cc') 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(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) { -- cgit v1.2.3-59-g8ed1b