diff options
| author | 2012-10-11 14:46:06 -0700 | |
|---|---|---|
| committer | 2012-10-11 15:33:23 -0700 | |
| commit | 4df2bbdfe6602ce5f141b7b44028b95faa0bd8ef (patch) | |
| tree | 9c23dad1023ccd1bf710825e6115892291232dae /src/compiler.cc | |
| parent | 1aae273f8827bcbfff6b00c5babd77a111852272 (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.cc | 12 |
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) { |