diff options
| author | 2012-03-07 08:47:31 -0800 | |
|---|---|---|
| committer | 2012-03-07 08:47:31 -0800 | |
| commit | 720fc19a1602ca1ee06cd7936979c2c30422a739 (patch) | |
| tree | 2400cb17a1ad91d2f0986b67e360ee365fe3ed53 /src | |
| parent | 786d583ffb498ccf07a133e0ed22cbe6ea1d2c27 (diff) | |
| parent | 66adbb79b317e08b6b4838a51d38ae81a7bb87fa (diff) | |
Merge "Implement thread-related runtime support routines." into dalvik-dev
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler_llvm/runtime_support_llvm.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc index 5a4ebb97a1..45f818f7c0 100644 --- a/src/compiler_llvm/runtime_support_llvm.cc +++ b/src/compiler_llvm/runtime_support_llvm.cc @@ -6,6 +6,7 @@ #include "object_utils.h" #include "runtime_support_llvm.h" #include "thread.h" +#include "thread_list.h" #include <stdint.h> @@ -20,19 +21,29 @@ Thread* art_get_current_thread_from_code() { } void art_set_current_thread_from_code(void* thread_object_addr) { + // TODO: LLVM IR generating something like "r9 = thread_object_addr" UNIMPLEMENTED(WARNING); } -void art_lock_object_from_code(Object* object) { - UNIMPLEMENTED(WARNING); +void art_lock_object_from_code(Object* obj) { + Thread* thread = Thread::Current(); + DCHECK(obj != NULL); // Assumed to have been checked before entry + obj->MonitorEnter(thread); // May block + DCHECK(thread->HoldsLock(obj)); + // Only possible exception is NPE and is handled before entry + DCHECK(!thread->IsExceptionPending()); } -void art_unlock_object_from_code(Object* object) { - UNIMPLEMENTED(WARNING); +void art_unlock_object_from_code(Object* obj) { + Thread* thread = Thread::Current(); + DCHECK(obj != NULL); // Assumed to have been checked before entry + // MonitorExit may throw exception + obj->MonitorExit(thread); } void art_test_suspend_from_code() { - UNIMPLEMENTED(WARNING); + Thread* thread = Thread::Current(); + Runtime::Current()->GetThreadList()->FullSuspendCheck(thread); } void art_push_shadow_frame_from_code(void* new_shadow_frame) { |