summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
author Shih-wei Liao <sliao@google.com> 2012-03-07 08:47:31 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2012-03-07 08:47:31 -0800
commit720fc19a1602ca1ee06cd7936979c2c30422a739 (patch)
tree2400cb17a1ad91d2f0986b67e360ee365fe3ed53 /src
parent786d583ffb498ccf07a133e0ed22cbe6ea1d2c27 (diff)
parent66adbb79b317e08b6b4838a51d38ae81a7bb87fa (diff)
Merge "Implement thread-related runtime support routines." into dalvik-dev
Diffstat (limited to 'src')
-rw-r--r--src/compiler_llvm/runtime_support_llvm.cc21
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) {