deadlock problem on GC Thread and HeapWorker Thread

The deadlock could be raised by below condition.
1. GC thread requests all thread to suspend.
   (dvmCollectGarbageInternal -> dvmSuspendAllThreads)
2. HeapWorker could suspend with heapWorkerLock mutex.
   (doHeapWork -> callMethod -> lockMutex -> dvmChangeStatus ->
fullSuspendCheck -> dvmWaitCond)
3. GC thread request heapWorkerLock mutex. (dvmCollectGarbageInternal -
> dvmLockMutex)
4. GC thread could not acquire heapWorkerLock mutex, because
HeapWorker is already grab the heapWorkerLock.
5. But HeapWorkerThread could not resume until broadcasting
threadSuspendCountCond by GC Thread.
5. GC Could not complete Garbage collection permanently.

Is there any reason to suspend with grab the heapWorkerLock
mutex(HeapWorker Thread).
I think that this daedlock could be clear by change the order.
(dvmChangeStatus -> dvmLockMutex)

199 static void lockMutex(pthread_mutex_t *mu)
200 {
201     Thread *self;
202     ThreadStatus oldStatus;
203
204     assert(mu != NULL);
205     if (dvmTryLockMutex(mu) != 0) {
206         self = dvmThreadSelf();
207         assert(self != NULL);
208         oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
209         dvmLockMutex(mu);
210         dvmChangeStatus(self, oldStatus);
211     }
212 }


574 void dvmCollectGarbageInternal(bool clearSoftRefs, GcReason
reason)
575 {
...
599     dvmSuspendAllThreads(SUSPEND_FOR_GC);
...
641     dvmLockMutex(&gDvm.heapWorkerLock);
...
647     dvmAssertHeapWorkerThreadRunning();
...
655     dvmLockMutex(&gDvm.heapWorkerListLock);




I'v already report a problem to android-platform group.
http://groups.google.com/group/android-platform/browse_thread/thread/2a7e61215bd49e06


stack log
(gdb) info threads
  22 Thread 2159  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  21 Thread 3212  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  20 Thread 3211  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  19 Thread 28001  __ioctl () at bionic/libc/arch-arm/syscalls/
__ioctl.S:15
  18 Thread 16314  __ioctl () at bionic/libc/arch-arm/syscalls/
__ioctl.S:15
  17 Thread 20435  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  16 Thread 29887  __ioctl () at bionic/libc/arch-arm/syscalls/
__ioctl.S:15
  15 Thread 29886  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  14 Thread 14055  __ioctl () at bionic/libc/arch-arm/syscalls/
__ioctl.S:15
  13 Thread 14054  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  12 Thread 4508  __ioctl () at bionic/libc/arch-arm/syscalls/
__ioctl.S:15
  11 Thread 4507  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  10 Thread 3178  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  9 Thread 3177  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  8 Thread 3175  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  7 Thread 3174  __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:
15
  6 Thread 3173  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  5 Thread 3172  recvmsg () at bionic/libc/arch-arm/syscalls/recvmsg.S:
15
  4 Thread 3171  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  3 Thread 3170  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
  2 Thread 3169  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200
* 1 Thread 3168  __futex_syscall3 () at bionic/libc/arch-arm/bionic/
atomics_arm.S:200

(gdb) bt
#0  __futex_syscall3 () at bionic/libc/arch-arm/bionic/atomics_arm.S:
200
#1  0xafd110fc in _normal_lock (mutex=0x802ac094) at bionic/libc/
bionic/pthread.c:937
#2  pthread_mutex_lock (mutex=0x802ac094) at bionic/libc/bionic/
pthread.c:1027
#3  0x802204c0 in dvmLockMutex (clearSoftRefs=<value optimized out>,
reason=GC_EXPLICIT) at dalvik/vm/Thread.h:366
#4  dvmCollectGarbageInternal (clearSoftRefs=<value optimized out>,
reason=GC_EXPLICIT) at dalvik/vm/alloc/Heap.c:644
#5  0x802552ee in dvmCollectGarbage (collectSoftReferences=false) at
dalvik/vm/alloc/Alloc.c:301
#6  0x80267348 in Dalvik_java_lang_Runtime_gc (args=<value optimized
out>, pResult=0x80) at dalvik/vm/native/java_lang_Runtime.c:34
#7  0x8021d1cc in dalvik_mterp () at dalvik/vm/mterp/out/InterpAsm-
armv7-a.S:10017
#8  0x802222f8 in dvmMterpStd (self=<value optimized out>,
glue=0xbef86498) at dalvik/vm/mterp/Mterp.c:105
#9  0x802211dc in dvmInterpret (self=0xd088, method=0x618cfb14,
pResult=<value optimized out>) at dalvik/vm/interp/Interp.c:1345
#10 0x80260220 in dvmInvokeMethod (obj=<value optimized out>,
method=0x618cfb14, argList=<value optimized out>,
    params=<value optimized out>, returnType=0x40101320,
noAccessCheck=<value optimized out>) at dalvik/vm/interp/Stack.c:742
#11 0x80268036 in Dalvik_java_lang_reflect_Method_invokeNative
(args=<value optimized out>, pResult=0xbef867f0)
    at dalvik/vm/native/java_lang_reflect_Method.c:101
#12 0x8021d1cc in dalvik_mterp () at dalvik/vm/mterp/out/InterpAsm-
armv7-a.S:10017
#13 0x802222f8 in dvmMterpStd (self=<value optimized out>,
glue=0xbef867e8) at dalvik/vm/mterp/Mterp.c:105
#14 0x802211dc in dvmInterpret (self=0xd088, method=0x61885a58,
pResult=<value optimized out>) at dalvik/vm/interp/Interp.c:1345
#15 0x80260082 in dvmCallMethodV (self=0xd088, method=0x61885a58,
obj=0x0, fromJni=true, pResult=0xbef86aa0, args=...)
    at dalvik/vm/interp/Stack.c:529
#16 0x8024c4b6 in CallStaticVoidMethodV (env=<value optimized out>,
jclazz=<value optimized out>, methodID=0x61885a58, args=...)
    at dalvik/vm/Jni.c:2943
#17 0x8023f1e8 in Check_CallStaticVoidMethodV (env=0xadc8,
clazz=0x40122d28, methodID=0x61885a58, args=...) at dalvik/vm/
CheckJni.c:1937
#18 0xad3393a0 in _JNIEnv::CallStaticVoidMethod (this=0x80288b10,
clazz=<value optimized out>, methodID=0x0)
    at dalvik/libnativehelper/include/nativehelper/jni.h:793
#19 0xad33a24e in android::AndroidRuntime::start (this=<value
optimized out>, className=0x8dde "com.android.internal.os.ZygoteInit",
    startSystemServer=<value optimized out>) at frameworks/base/core/
jni/AndroidRuntime.cpp:1033
#20 0x00008ccc in main (argc=<value optimized out>, argv=<value
optimized out>) at frameworks/base/cmds/app_process/app_main.cpp:314
---------------------------------------------------

(gdb) thr 2 (HeapWorker)
[Switching to thread 2 (Thread 3169)]#0  __futex_syscall3 () at bionic/
libc/arch-arm/bionic/atomics_arm.S:200
200         ldmia   sp!, {r4, r7}
(gdb) bt
#0  __futex_syscall3 () at bionic/libc/arch-arm/bionic/atomics_arm.S:
200
#1  0xafd113e0 in __pthread_cond_timedwait_relative (cond=0x802abff8,
mutex=0x802abff4, reltime=0x0) at bionic/libc/bionic/pthread.c:1451
#2  0xafd114b4 in __pthread_cond_timedwait (cond=0x802abff8,
mutex=0x802abff4, abstime=0x0, clock=0) at bionic/libc/bionic/
pthread.c:1474
#3  0x8025276c in dvmWaitCond (self=0x101200) at dalvik/vm/Thread.h:
412
#4  fullSuspendCheck (self=0x101200) at dalvik/vm/Thread.c:3062
#5  0x802530fe in dvmChangeStatus (self=0xfffffe00,
newStatus=THREAD_RUNNING) at dalvik/vm/Thread.c:3163
#6  0x802563da in lockMutex (mu=<value optimized out>) at dalvik/vm/
alloc/HeapWorker.c:210
#7  0x80256442 in callMethod (self=0x101200, obj=0x407d0de8,
method=0x61854c10) at dalvik/vm/alloc/HeapWorker.c:249
#8  0x802564b8 in doHeapWork (self=0x101200) at dalvik/vm/alloc/
HeapWorker.c:307
#9  0x8025664a in heapWorkerThreadStart (arg=<value optimized out>) at
dalvik/vm/alloc/HeapWorker.c:437
#10 0x802544bc in internalThreadStart (arg=<value optimized out>) at
dalvik/vm/Thread.c:1915
#11 0xafd11b74 in __thread_entry (func=0x8025446d
<internalThreadStart>, arg=0x101728, tls=<value optimized out>)
    at bionic/libc/bionic/pthread.c:207
#12 0xafd11740 in pthread_create (thread_out=<value optimized out>,
attr=0xbef866d0, start_routine=0x8025446d <internalThreadStart>,
    arg=0x101728) at bionic/libc/bionic/pthread.c:343
#13 0x00000000 in ?? ()

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to