summaryrefslogtreecommitdiffstats
path: root/vm/Thread.c
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2009-08-26 07:24:01 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2009-08-26 07:24:01 -0700
commitce114ac196211d6b2673650d9d565d689f6c094f (patch)
treed3401f83149fec652da3fc9cd3e52ffc0b202388 /vm/Thread.c
parent1a593e324585e26e1ac229d6ecbb279a5f3bb23f (diff)
parentf7fb00865dd05c32aab5b968fd79ae0ef63e9d6c (diff)
downloadandroid_dalvik-ce114ac196211d6b2673650d9d565d689f6c094f.tar.gz
android_dalvik-ce114ac196211d6b2673650d9d565d689f6c094f.tar.bz2
android_dalvik-ce114ac196211d6b2673650d9d565d689f6c094f.zip
am f7fb0086: Merge change 22659 into eclair
Merge commit 'f7fb00865dd05c32aab5b968fd79ae0ef63e9d6c' * commit 'f7fb00865dd05c32aab5b968fd79ae0ef63e9d6c': Another round of scary indirect ref changes.
Diffstat (limited to 'vm/Thread.c')
-rw-r--r--vm/Thread.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/vm/Thread.c b/vm/Thread.c
index e4de66469..edfb49c14 100644
--- a/vm/Thread.c
+++ b/vm/Thread.c
@@ -996,15 +996,22 @@ static bool prepareThread(Thread* thread)
/*
* Initialize our reference tracking tables.
*
- * The JNI local ref table *must* be fixed-size because we keep pointers
- * into the table in our stack frames.
- *
* Most threads won't use jniMonitorRefTable, so we clear out the
* structure but don't call the init function (which allocs storage).
*/
+#ifdef USE_INDIRECT_REF
+ if (!dvmInitIndirectRefTable(&thread->jniLocalRefTable,
+ kJniLocalRefMin, kJniLocalRefMax, kIndirectKindLocal))
+ return false;
+#else
+ /*
+ * The JNI local ref table *must* be fixed-size because we keep pointers
+ * into the table in our stack frames.
+ */
if (!dvmInitReferenceTable(&thread->jniLocalRefTable,
kJniLocalRefMax, kJniLocalRefMax))
return false;
+#endif
if (!dvmInitReferenceTable(&thread->internalLocalRefTable,
kInternalRefDefault, kInternalRefMax))
return false;
@@ -1058,7 +1065,11 @@ static void freeThread(Thread* thread)
#endif
}
+#ifdef USE_INDIRECT_REF
+ dvmClearIndirectRefTable(&thread->jniLocalRefTable);
+#else
dvmClearReferenceTable(&thread->jniLocalRefTable);
+#endif
dvmClearReferenceTable(&thread->internalLocalRefTable);
if (&thread->jniMonitorRefTable.table != NULL)
dvmClearReferenceTable(&thread->jniMonitorRefTable);
@@ -3761,6 +3772,20 @@ static void gcScanReferenceTable(ReferenceTable *refTable)
}
}
+static void gcScanIndirectRefTable(IndirectRefTable* pRefTable)
+{
+ Object** op = pRefTable->table;
+ int numEntries = dvmIndirectRefTableEntries(pRefTable);
+ int i;
+
+ for (i = 0; i < numEntries; i++) {
+ Object* obj = *op;
+ if (obj != NULL)
+ dvmMarkObjectNonNull(obj);
+ op++;
+ }
+}
+
/*
* Scan a Thread and mark any objects it references.
*/
@@ -3791,7 +3816,11 @@ static void gcScanThread(Thread *thread)
HPROF_SET_GC_SCAN_STATE(HPROF_ROOT_JNI_LOCAL, thread->threadId);
+#ifdef USE_INDIRECT_REF
+ gcScanIndirectRefTable(&thread->jniLocalRefTable);
+#else
gcScanReferenceTable(&thread->jniLocalRefTable);
+#endif
if (thread->jniMonitorRefTable.table != NULL) {
HPROF_SET_GC_SCAN_STATE(HPROF_ROOT_JNI_MONITOR, thread->threadId);