diff options
author | Andy McFadden <fadden@android.com> | 2009-08-26 07:24:01 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2009-08-26 07:24:01 -0700 |
commit | ce114ac196211d6b2673650d9d565d689f6c094f (patch) | |
tree | d3401f83149fec652da3fc9cd3e52ffc0b202388 /vm/Thread.c | |
parent | 1a593e324585e26e1ac229d6ecbb279a5f3bb23f (diff) | |
parent | f7fb00865dd05c32aab5b968fd79ae0ef63e9d6c (diff) | |
download | android_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.c | 35 |
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); |