Home | History | Annotate | Download | only in vm
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define ATRACE_TAG ATRACE_TAG_DALVIK
     18 
     19 /*
     20  * Thread support.
     21  */
     22 #include "Dalvik.h"
     23 #include "os/os.h"
     24 
     25 #include <stdlib.h>
     26 #include <unistd.h>
     27 #include <sys/time.h>
     28 #include <sys/types.h>
     29 #include <sys/resource.h>
     30 #include <sys/mman.h>
     31 #include <signal.h>
     32 #include <dirent.h>
     33 #include <errno.h>
     34 #include <fcntl.h>
     35 
     36 #if defined(HAVE_PRCTL)
     37 #include <sys/prctl.h>
     38 #endif
     39 
     40 #if defined(WITH_SELF_VERIFICATION)
     41 #include "interp/Jit.h"         // need for self verification
     42 #endif
     43 
     44  #include <cutils/trace.h>
     45 
     46 /* desktop Linux needs a little help with gettid() */
     47 #if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS)
     48 #define __KERNEL__
     49 # include <linux/unistd.h>
     50 #ifdef _syscall0
     51 _syscall0(pid_t,gettid)
     52 #else
     53 pid_t gettid() { return syscall(__NR_gettid);}
     54 #endif
     55 #undef __KERNEL__
     56 #endif
     57 
     58 // Change this to enable logging on cgroup errors
     59 #define ENABLE_CGROUP_ERR_LOGGING 0
     60 
     61 // change this to ALOGV/ALOGD to debug thread activity
     62 #define LOG_THREAD  LOGVV
     63 
     64 /*
     65 Notes on Threading
     66 
     67 All threads are native pthreads.  All threads, except the JDWP debugger
     68 thread, are visible to code running in the VM and to the debugger.  (We
     69 don't want the debugger to try to manipulate the thread that listens for
     70 instructions from the debugger.)  Internal VM threads are in the "system"
     71 ThreadGroup, all others are in the "main" ThreadGroup, per convention.
     72 
     73 The GC only runs when all threads have been suspended.  Threads are
     74 expected to suspend themselves, using a "safe point" mechanism.  We check
     75 for a suspend request at certain points in the main interpreter loop,
     76 and on requests coming in from native code (e.g. all JNI functions).
     77 Certain debugger events may inspire threads to self-suspend.
     78 
     79 Native methods must use JNI calls to modify object references to avoid
     80 clashes with the GC.  JNI doesn't provide a way for native code to access
     81 arrays of objects as such -- code must always get/set individual entries --
     82 so it should be possible to fully control access through JNI.
     83 
     84 Internal native VM threads, such as the finalizer thread, must explicitly
     85 check for suspension periodically.  In most cases they will be sound
     86 asleep on a condition variable, and won't notice the suspension anyway.
     87 
     88 Threads may be suspended by the GC, debugger, or the SIGQUIT listener
     89 thread.  The debugger may suspend or resume individual threads, while the
     90 GC always suspends all threads.  Each thread has a "suspend count" that
     91 is incremented on suspend requests and decremented on resume requests.
     92 When the count is zero, the thread is runnable.  This allows us to fulfill
     93 a debugger requirement: if the debugger suspends a thread, the thread is
     94 not allowed to run again until the debugger resumes it (or disconnects,
     95 in which case we must resume all debugger-suspended threads).
     96 
     97 Paused threads sleep on a condition variable, and are awoken en masse.
     98 Certain "slow" VM operations, such as starting up a new thread, will be
     99 done in a separate "VMWAIT" state, so that the rest of the VM doesn't
    100 freeze up waiting for the operation to finish.  Threads must check for
    101 pending suspension when leaving VMWAIT.
    102 
    103 Because threads suspend themselves while interpreting code or when native
    104 code makes JNI calls, there is no risk of suspending while holding internal
    105 VM locks.  All threads can enter a suspended (or native-code-only) state.
    106 Also, we don't have to worry about object references existing solely
    107 in hardware registers.
    108 
    109 We do, however, have to worry about objects that were allocated internally
    110 and aren't yet visible to anything else in the VM.  If we allocate an
    111 object, and then go to sleep on a mutex after changing to a non-RUNNING
    112 state (e.g. while trying to allocate a second object), the first object
    113 could be garbage-collected out from under us while we sleep.  To manage
    114 this, we automatically add all allocated objects to an internal object
    115 tracking list, and only remove them when we know we won't be suspended
    116 before the object appears in the GC root set.
    117 
    118 The debugger may choose to suspend or resume a single thread, which can
    119 lead to application-level deadlocks; this is expected behavior.  The VM
    120 will only check for suspension of single threads when the debugger is
    121 active (the java.lang.Thread calls for this are deprecated and hence are
    122 not supported).  Resumption of a single thread is handled by decrementing
    123 the thread's suspend count and sending a broadcast signal to the condition
    124 variable.  (This will cause all threads to wake up and immediately go back
    125 to sleep, which isn't tremendously efficient, but neither is having the
    126 debugger attached.)
    127 
    128 The debugger is not allowed to resume threads suspended by the GC.  This
    129 is trivially enforced by ignoring debugger requests while the GC is running
    130 (the JDWP thread is suspended during GC).
    131 
    132 The VM maintains a Thread struct for every pthread known to the VM.  There
    133 is a java/lang/Thread object associated with every Thread.  At present,
    134 there is no safe way to go from a Thread object to a Thread struct except by
    135 locking and scanning the list; this is necessary because the lifetimes of
    136 the two are not closely coupled.  We may want to change this behavior,
    137 though at present the only performance impact is on the debugger (see
    138 threadObjToThread()).  See also notes about dvmDetachCurrentThread().
    139 */
    140 /*
    141 Alternate implementation (signal-based):
    142 
    143 Threads run without safe points -- zero overhead.  The VM uses a signal
    144 (e.g. pthread_kill(SIGUSR1)) to notify threads of suspension or resumption.
    145 
    146 The trouble with using signals to suspend threads is that it means a thread
    147 can be in the middle of an operation when garbage collection starts.
    148 To prevent some sticky situations, we have to introduce critical sections
    149 to the VM code.
    150 
    151 Critical sections temporarily block suspension for a given thread.
    152 The thread must move to a non-blocked state (and self-suspend) after
    153 finishing its current task.  If the thread blocks on a resource held
    154 by a suspended thread, we're hosed.
    155 
    156 One approach is to require that no blocking operations, notably
    157 acquisition of mutexes, can be performed within a critical section.
    158 This is too limiting.  For example, if thread A gets suspended while
    159 holding the thread list lock, it will prevent the GC or debugger from
    160 being able to safely access the thread list.  We need to wrap the critical
    161 section around the entire operation (enter critical, get lock, do stuff,
    162 release lock, exit critical).
    163 
    164 A better approach is to declare that certain resources can only be held
    165 within critical sections.  A thread that enters a critical section and
    166 then gets blocked on the thread list lock knows that the thread it is
    167 waiting for is also in a critical section, and will release the lock
    168 before suspending itself.  Eventually all threads will complete their
    169 operations and self-suspend.  For this to work, the VM must:
    170 
    171  (1) Determine the set of resources that may be accessed from the GC or
    172      debugger threads.  The mutexes guarding those go into the "critical
    173      resource set" (CRS).
    174  (2) Ensure that no resource in the CRS can be acquired outside of a
    175      critical section.  This can be verified with an assert().
    176  (3) Ensure that only resources in the CRS can be held while in a critical
    177      section.  This is harder to enforce.
    178 
    179 If any of these conditions are not met, deadlock can ensue when grabbing
    180 resources in the GC or debugger (#1) or waiting for threads to suspend
    181 (#2,#3).  (You won't actually deadlock in the GC, because if the semantics
    182 above are followed you don't need to lock anything in the GC.  The risk is
    183 rather that the GC will access data structures in an intermediate state.)
    184 
    185 This approach requires more care and awareness in the VM than
    186 safe-pointing.  Because the GC and debugger are fairly intrusive, there
    187 really aren't any internal VM resources that aren't shared.  Thus, the
    188 enter/exit critical calls can be added to internal mutex wrappers, which
    189 makes it easy to get #1 and #2 right.
    190 
    191 An ordering should be established for all locks to avoid deadlocks.
    192 
    193 Monitor locks, which are also implemented with pthread calls, should not
    194 cause any problems here.  Threads fighting over such locks will not be in
    195 critical sections and can be suspended freely.
    196 
    197 This can get tricky if we ever need exclusive access to VM and non-VM
    198 resources at the same time.  It's not clear if this is a real concern.
    199 
    200 There are (at least) two ways to handle the incoming signals:
    201 
    202  (a) Always accept signals.  If we're in a critical section, the signal
    203      handler just returns without doing anything (the "suspend level"
    204      should have been incremented before the signal was sent).  Otherwise,
    205      if the "suspend level" is nonzero, we go to sleep.
    206  (b) Block signals in critical sections.  This ensures that we can't be
    207      interrupted in a critical section, but requires pthread_sigmask()
    208      calls on entry and exit.
    209 
    210 This is a choice between blocking the message and blocking the messenger.
    211 Because UNIX signals are unreliable (you can only know that you have been
    212 signaled, not whether you were signaled once or 10 times), the choice is
    213 not significant for correctness.  The choice depends on the efficiency
    214 of pthread_sigmask() and the desire to actually block signals.  Either way,
    215 it is best to ensure that there is only one indication of "blocked";
    216 having two (i.e. block signals and set a flag, then only send a signal
    217 if the flag isn't set) can lead to race conditions.
    218 
    219 The signal handler must take care to copy registers onto the stack (via
    220 setjmp), so that stack scans find all references.  Because we have to scan
    221 native stacks, "exact" GC is not possible with this approach.
    222 
    223 Some other concerns with flinging signals around:
    224  - Odd interactions with some debuggers (e.g. gdb on the Mac)
    225  - Restrictions on some standard library calls during GC (e.g. don't
    226    use printf on stdout to print GC debug messages)
    227 */
    228 
    229 #define kMaxThreadId        ((1 << 16) - 1)
    230 #define kMainThreadId       1
    231 
    232 
    233 static Thread* allocThread(int interpStackSize);
    234 static bool prepareThread(Thread* thread);
    235 static void setThreadSelf(Thread* thread);
    236 static void unlinkThread(Thread* thread);
    237 static void freeThread(Thread* thread);
    238 static void assignThreadId(Thread* thread);
    239 static bool createFakeEntryFrame(Thread* thread);
    240 static bool createFakeRunFrame(Thread* thread);
    241 static void* interpThreadStart(void* arg);
    242 static void* internalThreadStart(void* arg);
    243 static void threadExitUncaughtException(Thread* thread, Object* group);
    244 static void threadExitCheck(void* arg);
    245 static void waitForThreadSuspend(Thread* self, Thread* thread);
    246 
    247 /*
    248  * Initialize thread list and main thread's environment.  We need to set
    249  * up some basic stuff so that dvmThreadSelf() will work when we start
    250  * loading classes (e.g. to check for exceptions).
    251  */
    252 bool dvmThreadStartup()
    253 {
    254     Thread* thread;
    255 
    256     /* allocate a TLS slot */
    257     if (pthread_key_create(&gDvm.pthreadKeySelf, threadExitCheck) != 0) {
    258         ALOGE("ERROR: pthread_key_create failed");
    259         return false;
    260     }
    261 
    262     /* test our pthread lib */
    263     if (pthread_getspecific(gDvm.pthreadKeySelf) != NULL)
    264         ALOGW("WARNING: newly-created pthread TLS slot is not NULL");
    265 
    266     /* prep thread-related locks and conditions */
    267     dvmInitMutex(&gDvm.threadListLock);
    268     pthread_cond_init(&gDvm.threadStartCond, NULL);
    269     pthread_cond_init(&gDvm.vmExitCond, NULL);
    270     dvmInitMutex(&gDvm._threadSuspendLock);
    271     dvmInitMutex(&gDvm.threadSuspendCountLock);
    272     pthread_cond_init(&gDvm.threadSuspendCountCond, NULL);
    273 
    274     /*
    275      * Dedicated monitor for Thread.sleep().
    276      * TODO: change this to an Object* so we don't have to expose this
    277      * call, and we interact better with JDWP monitor calls.  Requires
    278      * deferring the object creation to much later (e.g. final "main"
    279      * thread prep) or until first use.
    280      */
    281     gDvm.threadSleepMon = dvmCreateMonitor(NULL);
    282 
    283     gDvm.threadIdMap = dvmAllocBitVector(kMaxThreadId, false);
    284 
    285     thread = allocThread(gDvm.mainThreadStackSize);
    286     if (thread == NULL)
    287         return false;
    288 
    289     /* switch mode for when we run initializers */
    290     thread->status = THREAD_RUNNING;
    291 
    292     /*
    293      * We need to assign the threadId early so we can lock/notify
    294      * object monitors.  We'll set the "threadObj" field later.
    295      */
    296     prepareThread(thread);
    297     gDvm.threadList = thread;
    298 
    299 #ifdef COUNT_PRECISE_METHODS
    300     gDvm.preciseMethods = dvmPointerSetAlloc(200);
    301 #endif
    302 
    303     return true;
    304 }
    305 
    306 /*
    307  * All threads should be stopped by now.  Clean up some thread globals.
    308  */
    309 void dvmThreadShutdown()
    310 {
    311     if (gDvm.threadList != NULL) {
    312         /*
    313          * If we walk through the thread list and try to free the
    314          * lingering thread structures (which should only be for daemon
    315          * threads), the daemon threads may crash if they execute before
    316          * the process dies.  Let them leak.
    317          */
    318         freeThread(gDvm.threadList);
    319         gDvm.threadList = NULL;
    320     }
    321 
    322     dvmFreeBitVector(gDvm.threadIdMap);
    323 
    324     dvmFreeMonitorList();
    325 
    326     pthread_key_delete(gDvm.pthreadKeySelf);
    327 }
    328 
    329 
    330 /*
    331  * Grab the suspend count global lock.
    332  */
    333 static inline void lockThreadSuspendCount()
    334 {
    335     /*
    336      * Don't try to change to VMWAIT here.  When we change back to RUNNING
    337      * we have to check for a pending suspend, which results in grabbing
    338      * this lock recursively.  Doesn't work with "fast" pthread mutexes.
    339      *
    340      * This lock is always held for very brief periods, so as long as
    341      * mutex ordering is respected we shouldn't stall.
    342      */
    343     dvmLockMutex(&gDvm.threadSuspendCountLock);
    344 }
    345 
    346 /*
    347  * Release the suspend count global lock.
    348  */
    349 static inline void unlockThreadSuspendCount()
    350 {
    351     dvmUnlockMutex(&gDvm.threadSuspendCountLock);
    352 }
    353 
    354 /*
    355  * Grab the thread list global lock.
    356  *
    357  * This is held while "suspend all" is trying to make everybody stop.  If
    358  * the shutdown is in progress, and somebody tries to grab the lock, they'll
    359  * have to wait for the GC to finish.  Therefore it's important that the
    360  * thread not be in RUNNING mode.
    361  *
    362  * We don't have to check to see if we should be suspended once we have
    363  * the lock.  Nobody can suspend all threads without holding the thread list
    364  * lock while they do it, so by definition there isn't a GC in progress.
    365  *
    366  * This function deliberately avoids the use of dvmChangeStatus(),
    367  * which could grab threadSuspendCountLock.  To avoid deadlock, threads
    368  * are required to grab the thread list lock before the thread suspend
    369  * count lock.  (See comment in DvmGlobals.)
    370  *
    371  * TODO: consider checking for suspend after acquiring the lock, and
    372  * backing off if set.  As stated above, it can't happen during normal
    373  * execution, but it *can* happen during shutdown when daemon threads
    374  * are being suspended.
    375  */
    376 void dvmLockThreadList(Thread* self)
    377 {
    378     ThreadStatus oldStatus;
    379 
    380     if (self == NULL)       /* try to get it from TLS */
    381         self = dvmThreadSelf();
    382 
    383     if (self != NULL) {
    384         oldStatus = self->status;
    385         self->status = THREAD_VMWAIT;
    386     } else {
    387         /* happens during VM shutdown */
    388         oldStatus = THREAD_UNDEFINED;  // shut up gcc
    389     }
    390 
    391     dvmLockMutex(&gDvm.threadListLock);
    392 
    393     if (self != NULL)
    394         self->status = oldStatus;
    395 }
    396 
    397 /*
    398  * Try to lock the thread list.
    399  *
    400  * Returns "true" if we locked it.  This is a "fast" mutex, so if the
    401  * current thread holds the lock this will fail.
    402  */
    403 bool dvmTryLockThreadList()
    404 {
    405     return (dvmTryLockMutex(&gDvm.threadListLock) == 0);
    406 }
    407 
    408 /*
    409  * Release the thread list global lock.
    410  */
    411 void dvmUnlockThreadList()
    412 {
    413     dvmUnlockMutex(&gDvm.threadListLock);
    414 }
    415 
    416 /*
    417  * Convert SuspendCause to a string.
    418  */
    419 static const char* getSuspendCauseStr(SuspendCause why)
    420 {
    421     switch (why) {
    422     case SUSPEND_NOT:               return "NOT?";
    423     case SUSPEND_FOR_GC:            return "gc";
    424     case SUSPEND_FOR_DEBUG:         return "debug";
    425     case SUSPEND_FOR_DEBUG_EVENT:   return "debug-event";
    426     case SUSPEND_FOR_STACK_DUMP:    return "stack-dump";
    427     case SUSPEND_FOR_VERIFY:        return "verify";
    428     case SUSPEND_FOR_HPROF:         return "hprof";
    429 #if defined(WITH_JIT)
    430     case SUSPEND_FOR_TBL_RESIZE:    return "table-resize";
    431     case SUSPEND_FOR_IC_PATCH:      return "inline-cache-patch";
    432     case SUSPEND_FOR_CC_RESET:      return "reset-code-cache";
    433     case SUSPEND_FOR_REFRESH:       return "refresh jit status";
    434 #endif
    435     default:                        return "UNKNOWN";
    436     }
    437 }
    438 
    439 /*
    440  * Grab the "thread suspend" lock.  This is required to prevent the
    441  * GC and the debugger from simultaneously suspending all threads.
    442  *
    443  * If we fail to get the lock, somebody else is trying to suspend all
    444  * threads -- including us.  If we go to sleep on the lock we'll deadlock
    445  * the VM.  Loop until we get it or somebody puts us to sleep.
    446  */
    447 static void lockThreadSuspend(const char* who, SuspendCause why)
    448 {
    449     const int kSpinSleepTime = 3*1000*1000;        /* 3s */
    450     u8 startWhen = 0;       // init req'd to placate gcc
    451     int sleepIter = 0;
    452     int cc;
    453 
    454     do {
    455         cc = dvmTryLockMutex(&gDvm._threadSuspendLock);
    456         if (cc != 0) {
    457             Thread* self = dvmThreadSelf();
    458 
    459             if (!dvmCheckSuspendPending(self)) {
    460                 /*
    461                  * Could be that a resume-all is in progress, and something
    462                  * grabbed the CPU when the wakeup was broadcast.  The thread
    463                  * performing the resume hasn't had a chance to release the
    464                  * thread suspend lock.  (We release before the broadcast,
    465                  * so this should be a narrow window.)
    466                  *
    467                  * Could be we hit the window as a suspend was started,
    468                  * and the lock has been grabbed but the suspend counts
    469                  * haven't been incremented yet.
    470                  *
    471                  * Could be an unusual JNI thread-attach thing.
    472                  *
    473                  * Could be the debugger telling us to resume at roughly
    474                  * the same time we're posting an event.
    475                  *
    476                  * Could be two app threads both want to patch predicted
    477                  * chaining cells around the same time.
    478                  */
    479                 ALOGI("threadid=%d ODD: want thread-suspend lock (%s:%s),"
    480                      " it's held, no suspend pending",
    481                     self->threadId, who, getSuspendCauseStr(why));
    482             } else {
    483                 /* we suspended; reset timeout */
    484                 sleepIter = 0;
    485             }
    486 
    487             /* give the lock-holder a chance to do some work */
    488             if (sleepIter == 0)
    489                 startWhen = dvmGetRelativeTimeUsec();
    490             if (!dvmIterativeSleep(sleepIter++, kSpinSleepTime, startWhen)) {
    491                 ALOGE("threadid=%d: couldn't get thread-suspend lock (%s:%s),"
    492                      " bailing",
    493                     self->threadId, who, getSuspendCauseStr(why));
    494                 /* threads are not suspended, thread dump could crash */
    495                 dvmDumpAllThreads(false);
    496                 dvmAbort();
    497             }
    498         }
    499     } while (cc != 0);
    500     assert(cc == 0);
    501 }
    502 
    503 /*
    504  * Release the "thread suspend" lock.
    505  */
    506 static inline void unlockThreadSuspend()
    507 {
    508     dvmUnlockMutex(&gDvm._threadSuspendLock);
    509 }
    510 
    511 
    512 /*
    513  * Kill any daemon threads that still exist.  All of ours should be
    514  * stopped, so these should be Thread objects or JNI-attached threads
    515  * started by the application.  Actively-running threads are likely
    516  * to crash the process if they continue to execute while the VM
    517  * shuts down, so we really need to kill or suspend them.  (If we want
    518  * the VM to restart within this process, we need to kill them, but that
    519  * leaves open the possibility of orphaned resources.)
    520  *
    521  * Waiting for the thread to suspend may be unwise at this point, but
    522  * if one of these is wedged in a critical section then we probably
    523  * would've locked up on the last GC attempt.
    524  *
    525  * It's possible for this function to get called after a failed
    526  * initialization, so be careful with assumptions about the environment.
    527  *
    528  * This will be called from whatever thread calls DestroyJavaVM, usually
    529  * but not necessarily the main thread.  It's likely, but not guaranteed,
    530  * that the current thread has already been cleaned up.
    531  */
    532 void dvmSlayDaemons()
    533 {
    534     Thread* self = dvmThreadSelf();     // may be null
    535     Thread* target;
    536     int threadId = 0;
    537     bool doWait = false;
    538 
    539     dvmLockThreadList(self);
    540 
    541     if (self != NULL)
    542         threadId = self->threadId;
    543 
    544     target = gDvm.threadList;
    545     while (target != NULL) {
    546         if (target == self) {
    547             target = target->next;
    548             continue;
    549         }
    550 
    551         if (!dvmGetFieldBoolean(target->threadObj,
    552                 gDvm.offJavaLangThread_daemon))
    553         {
    554             /* should never happen; suspend it with the rest */
    555             ALOGW("threadid=%d: non-daemon id=%d still running at shutdown?!",
    556                 threadId, target->threadId);
    557         }
    558 
    559         std::string threadName(dvmGetThreadName(target));
    560         ALOGV("threadid=%d: suspending daemon id=%d name='%s'",
    561                 threadId, target->threadId, threadName.c_str());
    562 
    563         /* mark as suspended */
    564         lockThreadSuspendCount();
    565         dvmAddToSuspendCounts(target, 1, 0);
    566         unlockThreadSuspendCount();
    567         doWait = true;
    568 
    569         target = target->next;
    570     }
    571 
    572     //dvmDumpAllThreads(false);
    573 
    574     /*
    575      * Unlock the thread list, relocking it later if necessary.  It's
    576      * possible a thread is in VMWAIT after calling dvmLockThreadList,
    577      * and that function *doesn't* check for pending suspend after
    578      * acquiring the lock.  We want to let them finish their business
    579      * and see the pending suspend before we continue here.
    580      *
    581      * There's no guarantee of mutex fairness, so this might not work.
    582      * (The alternative is to have dvmLockThreadList check for suspend
    583      * after acquiring the lock and back off, something we should consider.)
    584      */
    585     dvmUnlockThreadList();
    586 
    587     if (doWait) {
    588         bool complained = false;
    589 
    590         usleep(200 * 1000);
    591 
    592         dvmLockThreadList(self);
    593 
    594         /*
    595          * Sleep for a bit until the threads have suspended.  We're trying
    596          * to exit, so don't wait for too long.
    597          */
    598         int i;
    599         for (i = 0; i < 10; i++) {
    600             bool allSuspended = true;
    601 
    602             target = gDvm.threadList;
    603             while (target != NULL) {
    604                 if (target == self) {
    605                     target = target->next;
    606                     continue;
    607                 }
    608 
    609                 if (target->status == THREAD_RUNNING) {
    610                     if (!complained)
    611                         ALOGD("threadid=%d not ready yet", target->threadId);
    612                     allSuspended = false;
    613                     /* keep going so we log each running daemon once */
    614                 }
    615 
    616                 target = target->next;
    617             }
    618 
    619             if (allSuspended) {
    620                 ALOGV("threadid=%d: all daemons have suspended", threadId);
    621                 break;
    622             } else {
    623                 if (!complained) {
    624                     complained = true;
    625                     ALOGD("threadid=%d: waiting briefly for daemon suspension",
    626                         threadId);
    627                 }
    628             }
    629 
    630             usleep(200 * 1000);
    631         }
    632         dvmUnlockThreadList();
    633     }
    634 
    635 #if 0   /* bad things happen if they come out of JNI or "spuriously" wake up */
    636     /*
    637      * Abandon the threads and recover their resources.
    638      */
    639     target = gDvm.threadList;
    640     while (target != NULL) {
    641         Thread* nextTarget = target->next;
    642         unlinkThread(target);
    643         freeThread(target);
    644         target = nextTarget;
    645     }
    646 #endif
    647 
    648     //dvmDumpAllThreads(true);
    649 }
    650 
    651 
    652 /*
    653  * Finish preparing the parts of the Thread struct required to support
    654  * JNI registration.
    655  */
    656 bool dvmPrepMainForJni(JNIEnv* pEnv)
    657 {
    658     Thread* self;
    659 
    660     /* main thread is always first in list at this point */
    661     self = gDvm.threadList;
    662     assert(self->threadId == kMainThreadId);
    663 
    664     /* create a "fake" JNI frame at the top of the main thread interp stack */
    665     if (!createFakeEntryFrame(self))
    666         return false;
    667 
    668     /* fill these in, since they weren't ready at dvmCreateJNIEnv time */
    669     dvmSetJniEnvThreadId(pEnv, self);
    670     dvmSetThreadJNIEnv(self, (JNIEnv*) pEnv);
    671 
    672     return true;
    673 }
    674 
    675 
    676 /*
    677  * Finish preparing the main thread, allocating some objects to represent
    678  * it.  As part of doing so, we finish initializing Thread and ThreadGroup.
    679  * This will execute some interpreted code (e.g. class initializers).
    680  */
    681 bool dvmPrepMainThread()
    682 {
    683     Thread* thread;
    684     Object* groupObj;
    685     Object* threadObj;
    686     Object* vmThreadObj;
    687     StringObject* threadNameStr;
    688     Method* init;
    689     JValue unused;
    690 
    691     ALOGV("+++ finishing prep on main VM thread");
    692 
    693     /* main thread is always first in list at this point */
    694     thread = gDvm.threadList;
    695     assert(thread->threadId == kMainThreadId);
    696 
    697     /*
    698      * Make sure the classes are initialized.  We have to do this before
    699      * we create an instance of them.
    700      */
    701     if (!dvmInitClass(gDvm.classJavaLangClass)) {
    702         ALOGE("'Class' class failed to initialize");
    703         return false;
    704     }
    705     if (!dvmInitClass(gDvm.classJavaLangThreadGroup) ||
    706         !dvmInitClass(gDvm.classJavaLangThread) ||
    707         !dvmInitClass(gDvm.classJavaLangVMThread))
    708     {
    709         ALOGE("thread classes failed to initialize");
    710         return false;
    711     }
    712 
    713     groupObj = dvmGetMainThreadGroup();
    714     if (groupObj == NULL)
    715         return false;
    716 
    717     /*
    718      * Allocate and construct a Thread with the internal-creation
    719      * constructor.
    720      */
    721     threadObj = dvmAllocObject(gDvm.classJavaLangThread, ALLOC_DEFAULT);
    722     if (threadObj == NULL) {
    723         ALOGE("unable to allocate main thread object");
    724         return false;
    725     }
    726     dvmReleaseTrackedAlloc(threadObj, NULL);
    727 
    728     threadNameStr = dvmCreateStringFromCstr("main");
    729     if (threadNameStr == NULL)
    730         return false;
    731     dvmReleaseTrackedAlloc((Object*)threadNameStr, NULL);
    732 
    733     init = dvmFindDirectMethodByDescriptor(gDvm.classJavaLangThread, "<init>",
    734             "(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V");
    735     assert(init != NULL);
    736     dvmCallMethod(thread, init, threadObj, &unused, groupObj, threadNameStr,
    737         THREAD_NORM_PRIORITY, false);
    738     if (dvmCheckException(thread)) {
    739         ALOGE("exception thrown while constructing main thread object");
    740         return false;
    741     }
    742 
    743     /*
    744      * Allocate and construct a VMThread.
    745      */
    746     vmThreadObj = dvmAllocObject(gDvm.classJavaLangVMThread, ALLOC_DEFAULT);
    747     if (vmThreadObj == NULL) {
    748         ALOGE("unable to allocate main vmthread object");
    749         return false;
    750     }
    751     dvmReleaseTrackedAlloc(vmThreadObj, NULL);
    752 
    753     init = dvmFindDirectMethodByDescriptor(gDvm.classJavaLangVMThread, "<init>",
    754             "(Ljava/lang/Thread;)V");
    755     dvmCallMethod(thread, init, vmThreadObj, &unused, threadObj);
    756     if (dvmCheckException(thread)) {
    757         ALOGE("exception thrown while constructing main vmthread object");
    758         return false;
    759     }
    760 
    761     /* set the VMThread.vmData field to our Thread struct */
    762     assert(gDvm.offJavaLangVMThread_vmData != 0);
    763     dvmSetFieldInt(vmThreadObj, gDvm.offJavaLangVMThread_vmData, (u4)thread);
    764 
    765     /*
    766      * Stuff the VMThread back into the Thread.  From this point on, other
    767      * Threads will see that this Thread is running (at least, they would,
    768      * if there were any).
    769      */
    770     dvmSetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread,
    771         vmThreadObj);
    772 
    773     thread->threadObj = threadObj;
    774 
    775     /*
    776      * Set the "context class loader" field in the system class loader.
    777      *
    778      * Retrieving the system class loader will cause invocation of
    779      * ClassLoader.getSystemClassLoader(), which could conceivably call
    780      * Thread.currentThread(), so we want the Thread to be fully configured
    781      * before we do this.
    782      */
    783     Object* systemLoader = dvmGetSystemClassLoader();
    784     if (systemLoader == NULL) {
    785         ALOGW("WARNING: system class loader is NULL (setting main ctxt)");
    786         /* keep going? */
    787     } else {
    788         dvmSetFieldObject(threadObj, gDvm.offJavaLangThread_contextClassLoader,
    789             systemLoader);
    790         dvmReleaseTrackedAlloc(systemLoader, NULL);
    791     }
    792 
    793     /* include self in non-daemon threads (mainly for AttachCurrentThread) */
    794     gDvm.nonDaemonThreadCount++;
    795 
    796     return true;
    797 }
    798 
    799 
    800 /*
    801  * Alloc and initialize a Thread struct.
    802  *
    803  * Does not create any objects, just stuff on the system (malloc) heap.
    804  */
    805 static Thread* allocThread(int interpStackSize)
    806 {
    807     Thread* thread;
    808     u1* stackBottom;
    809 
    810     thread = (Thread*) calloc(1, sizeof(Thread));
    811     if (thread == NULL)
    812         return NULL;
    813 
    814     /* Check sizes and alignment */
    815     assert((((uintptr_t)&thread->interpBreak.all) & 0x7) == 0);
    816     assert(sizeof(thread->interpBreak) == sizeof(thread->interpBreak.all));
    817 
    818 
    819 #if defined(WITH_SELF_VERIFICATION)
    820     if (dvmSelfVerificationShadowSpaceAlloc(thread) == NULL)
    821         return NULL;
    822 #endif
    823 
    824     assert(interpStackSize >= kMinStackSize && interpStackSize <=kMaxStackSize);
    825 
    826     thread->status = THREAD_INITIALIZING;
    827 
    828     /*
    829      * Allocate and initialize the interpreted code stack.  We essentially
    830      * "lose" the alloc pointer, which points at the bottom of the stack,
    831      * but we can get it back later because we know how big the stack is.
    832      *
    833      * The stack must be aligned on a 4-byte boundary.
    834      */
    835 #ifdef MALLOC_INTERP_STACK
    836     stackBottom = (u1*) malloc(interpStackSize);
    837     if (stackBottom == NULL) {
    838 #if defined(WITH_SELF_VERIFICATION)
    839         dvmSelfVerificationShadowSpaceFree(thread);
    840 #endif
    841         free(thread);
    842         return NULL;
    843     }
    844     memset(stackBottom, 0xc5, interpStackSize);     // stop valgrind complaints
    845 #else
    846     stackBottom = (u1*) mmap(NULL, interpStackSize, PROT_READ | PROT_WRITE,
    847         MAP_PRIVATE | MAP_ANON, -1, 0);
    848     if (stackBottom == MAP_FAILED) {
    849 #if defined(WITH_SELF_VERIFICATION)
    850         dvmSelfVerificationShadowSpaceFree(thread);
    851 #endif
    852         free(thread);
    853         return NULL;
    854     }
    855 #endif
    856 
    857     assert(((u4)stackBottom & 0x03) == 0); // looks like our malloc ensures this
    858     thread->interpStackSize = interpStackSize;
    859     thread->interpStackStart = stackBottom + interpStackSize;
    860     thread->interpStackEnd = stackBottom + STACK_OVERFLOW_RESERVE;
    861 
    862 #ifndef DVM_NO_ASM_INTERP
    863     thread->mainHandlerTable = dvmAsmInstructionStart;
    864     thread->altHandlerTable = dvmAsmAltInstructionStart;
    865     thread->interpBreak.ctl.curHandlerTable = thread->mainHandlerTable;
    866 #endif
    867 
    868     /* give the thread code a chance to set things up */
    869     dvmInitInterpStack(thread, interpStackSize);
    870 
    871     /* One-time setup for interpreter/JIT state */
    872     dvmInitInterpreterState(thread);
    873 
    874     return thread;
    875 }
    876 
    877 /*
    878  * Get a meaningful thread ID.  At present this only has meaning under Linux,
    879  * where getpid() and gettid() sometimes agree and sometimes don't depending
    880  * on your thread model (try "export LD_ASSUME_KERNEL=2.4.19").
    881  */
    882 pid_t dvmGetSysThreadId()
    883 {
    884 #ifdef HAVE_GETTID
    885     return gettid();
    886 #else
    887     return getpid();
    888 #endif
    889 }
    890 
    891 /*
    892  * Finish initialization of a Thread struct.
    893  *
    894  * This must be called while executing in the new thread, but before the
    895  * thread is added to the thread list.
    896  *
    897  * NOTE: The threadListLock must be held by the caller (needed for
    898  * assignThreadId()).
    899  */
    900 static bool prepareThread(Thread* thread)
    901 {
    902     assignThreadId(thread);
    903     thread->handle = pthread_self();
    904     thread->systemTid = dvmGetSysThreadId();
    905 
    906     //ALOGI("SYSTEM TID IS %d (pid is %d)", (int) thread->systemTid,
    907     //    (int) getpid());
    908     /*
    909      * If we were called by dvmAttachCurrentThread, the self value is
    910      * already correctly established as "thread".
    911      */
    912     setThreadSelf(thread);
    913 
    914     ALOGV("threadid=%d: interp stack at %p",
    915         thread->threadId, thread->interpStackStart - thread->interpStackSize);
    916 
    917     /*
    918      * Initialize invokeReq.
    919      */
    920     dvmInitMutex(&thread->invokeReq.lock);
    921     pthread_cond_init(&thread->invokeReq.cv, NULL);
    922 
    923     /*
    924      * Initialize our reference tracking tables.
    925      *
    926      * Most threads won't use jniMonitorRefTable, so we clear out the
    927      * structure but don't call the init function (which allocs storage).
    928      */
    929     if (!thread->jniLocalRefTable.init(kJniLocalRefMin,
    930             kJniLocalRefMax, kIndirectKindLocal)) {
    931         return false;
    932     }
    933     if (!dvmInitReferenceTable(&thread->internalLocalRefTable,
    934             kInternalRefDefault, kInternalRefMax))
    935         return false;
    936 
    937     memset(&thread->jniMonitorRefTable, 0, sizeof(thread->jniMonitorRefTable));
    938 
    939     pthread_cond_init(&thread->waitCond, NULL);
    940     dvmInitMutex(&thread->waitMutex);
    941 
    942     /* Initialize safepoint callback mechanism */
    943     dvmInitMutex(&thread->callbackMutex);
    944 
    945     return true;
    946 }
    947 
    948 /*
    949  * Remove a thread from the internal list.
    950  * Clear out the links to make it obvious that the thread is
    951  * no longer on the list.  Caller must hold gDvm.threadListLock.
    952  */
    953 static void unlinkThread(Thread* thread)
    954 {
    955     LOG_THREAD("threadid=%d: removing from list", thread->threadId);
    956     if (thread == gDvm.threadList) {
    957         assert(thread->prev == NULL);
    958         gDvm.threadList = thread->next;
    959     } else {
    960         assert(thread->prev != NULL);
    961         thread->prev->next = thread->next;
    962     }
    963     if (thread->next != NULL)
    964         thread->next->prev = thread->prev;
    965     thread->prev = thread->next = NULL;
    966 }
    967 
    968 /*
    969  * Free a Thread struct, and all the stuff allocated within.
    970  */
    971 static void freeThread(Thread* thread)
    972 {
    973     if (thread == NULL)
    974         return;
    975 
    976     /* thread->threadId is zero at this point */
    977     LOGVV("threadid=%d: freeing", thread->threadId);
    978 
    979     if (thread->interpStackStart != NULL) {
    980         u1* interpStackBottom;
    981 
    982         interpStackBottom = thread->interpStackStart;
    983         interpStackBottom -= thread->interpStackSize;
    984 #ifdef MALLOC_INTERP_STACK
    985         free(interpStackBottom);
    986 #else
    987         if (munmap(interpStackBottom, thread->interpStackSize) != 0)
    988             ALOGW("munmap(thread stack) failed");
    989 #endif
    990     }
    991 
    992     thread->jniLocalRefTable.destroy();
    993     dvmClearReferenceTable(&thread->internalLocalRefTable);
    994     if (&thread->jniMonitorRefTable.table != NULL)
    995         dvmClearReferenceTable(&thread->jniMonitorRefTable);
    996 
    997 #if defined(WITH_SELF_VERIFICATION)
    998     dvmSelfVerificationShadowSpaceFree(thread);
    999 #endif
   1000     free(thread);
   1001 }
   1002 
   1003 /*
   1004  * Like pthread_self(), but on a Thread*.
   1005  */
   1006 Thread* dvmThreadSelf()
   1007 {
   1008     return (Thread*) pthread_getspecific(gDvm.pthreadKeySelf);
   1009 }
   1010 
   1011 /*
   1012  * Explore our sense of self.  Stuffs the thread pointer into TLS.
   1013  */
   1014 static void setThreadSelf(Thread* thread)
   1015 {
   1016     int cc;
   1017 
   1018     cc = pthread_setspecific(gDvm.pthreadKeySelf, thread);
   1019     if (cc != 0) {
   1020         /*
   1021          * Sometimes this fails under Bionic with EINVAL during shutdown.
   1022          * This can happen if the timing is just right, e.g. a thread
   1023          * fails to attach during shutdown, but the "fail" path calls
   1024          * here to ensure we clean up after ourselves.
   1025          */
   1026         if (thread != NULL) {
   1027             ALOGE("pthread_setspecific(%p) failed, err=%d", thread, cc);
   1028             dvmAbort();     /* the world is fundamentally hosed */
   1029         }
   1030     }
   1031 }
   1032 
   1033 /*
   1034  * This is associated with the pthreadKeySelf key.  It's called by the
   1035  * pthread library when a thread is exiting and the "self" pointer in TLS
   1036  * is non-NULL, meaning the VM hasn't had a chance to clean up.  In normal
   1037  * operation this will not be called.
   1038  *
   1039  * This is mainly of use to ensure that we don't leak resources if, for
   1040  * example, a thread attaches itself to us with AttachCurrentThread and
   1041  * then exits without notifying the VM.
   1042  *
   1043  * We could do the detach here instead of aborting, but this will lead to
   1044  * portability problems.  Other implementations do not do this check and
   1045  * will simply be unaware that the thread has exited, leading to resource
   1046  * leaks (and, if this is a non-daemon thread, an infinite hang when the
   1047  * VM tries to shut down).
   1048  *
   1049  * Because some implementations may want to use the pthread destructor
   1050  * to initiate the detach, and the ordering of destructors is not defined,
   1051  * we want to iterate a couple of times to give those a chance to run.
   1052  */
   1053 static void threadExitCheck(void* arg)
   1054 {
   1055     const int kMaxCount = 2;
   1056 
   1057     Thread* self = (Thread*) arg;
   1058     assert(self != NULL);
   1059 
   1060     ALOGV("threadid=%d: threadExitCheck(%p) count=%d",
   1061         self->threadId, arg, self->threadExitCheckCount);
   1062 
   1063     if (self->status == THREAD_ZOMBIE) {
   1064         ALOGW("threadid=%d: Weird -- shouldn't be in threadExitCheck",
   1065             self->threadId);
   1066         return;
   1067     }
   1068 
   1069     if (self->threadExitCheckCount < kMaxCount) {
   1070         /*
   1071          * Spin a couple of times to let other destructors fire.
   1072          */
   1073         ALOGD("threadid=%d: thread exiting, not yet detached (count=%d)",
   1074             self->threadId, self->threadExitCheckCount);
   1075         self->threadExitCheckCount++;
   1076         int cc = pthread_setspecific(gDvm.pthreadKeySelf, self);
   1077         if (cc != 0) {
   1078             ALOGE("threadid=%d: unable to re-add thread to TLS",
   1079                 self->threadId);
   1080             dvmAbort();
   1081         }
   1082     } else {
   1083         ALOGE("threadid=%d: native thread exited without detaching",
   1084             self->threadId);
   1085         dvmAbort();
   1086     }
   1087 }
   1088 
   1089 
   1090 /*
   1091  * Assign the threadId.  This needs to be a small integer so that our
   1092  * "thin" locks fit in a small number of bits.
   1093  *
   1094  * We reserve zero for use as an invalid ID.
   1095  *
   1096  * This must be called with threadListLock held.
   1097  */
   1098 static void assignThreadId(Thread* thread)
   1099 {
   1100     /*
   1101      * Find a small unique integer.  threadIdMap is a vector of
   1102      * kMaxThreadId bits;  dvmAllocBit() returns the index of a
   1103      * bit, meaning that it will always be < kMaxThreadId.
   1104      */
   1105     int num = dvmAllocBit(gDvm.threadIdMap);
   1106     if (num < 0) {
   1107         ALOGE("Ran out of thread IDs");
   1108         dvmAbort();     // TODO: make this a non-fatal error result
   1109     }
   1110 
   1111     thread->threadId = num + 1;
   1112 
   1113     assert(thread->threadId != 0);
   1114 }
   1115 
   1116 /*
   1117  * Give back the thread ID.
   1118  */
   1119 static void releaseThreadId(Thread* thread)
   1120 {
   1121     assert(thread->threadId > 0);
   1122     dvmClearBit(gDvm.threadIdMap, thread->threadId - 1);
   1123     thread->threadId = 0;
   1124 }
   1125 
   1126 
   1127 /*
   1128  * Add a stack frame that makes it look like the native code in the main
   1129  * thread was originally invoked from interpreted code.  This gives us a
   1130  * place to hang JNI local references.  The VM spec says (v2 5.2) that the
   1131  * VM begins by executing "main" in a class, so in a way this brings us
   1132  * closer to the spec.
   1133  */
   1134 static bool createFakeEntryFrame(Thread* thread)
   1135 {
   1136     /*
   1137      * Because we are creating a frame that represents application code, we
   1138      * want to stuff the application class loader into the method's class
   1139      * loader field, even though we're using the system class loader to
   1140      * load it.  This makes life easier over in JNI FindClass (though it
   1141      * could bite us in other ways).
   1142      *
   1143      * Unfortunately this is occurring too early in the initialization,
   1144      * of necessity coming before JNI is initialized, and we're not quite
   1145      * ready to set up the application class loader.  Also, overwriting
   1146      * the class' defining classloader pointer seems unwise.
   1147      *
   1148      * Instead, we save a pointer to the method and explicitly check for
   1149      * it in FindClass.  The method is private so nobody else can call it.
   1150      */
   1151 
   1152     assert(thread->threadId == kMainThreadId);      /* main thread only */
   1153 
   1154     if (!dvmPushJNIFrame(thread, gDvm.methDalvikSystemNativeStart_main))
   1155         return false;
   1156 
   1157     /*
   1158      * Null out the "String[] args" argument.
   1159      */
   1160     assert(gDvm.methDalvikSystemNativeStart_main->registersSize == 1);
   1161     u4* framePtr = (u4*) thread->interpSave.curFrame;
   1162     framePtr[0] = 0;
   1163 
   1164     return true;
   1165 }
   1166 
   1167 
   1168 /*
   1169  * Add a stack frame that makes it look like the native thread has been
   1170  * executing interpreted code.  This gives us a place to hang JNI local
   1171  * references.
   1172  */
   1173 static bool createFakeRunFrame(Thread* thread)
   1174 {
   1175     return dvmPushJNIFrame(thread, gDvm.methDalvikSystemNativeStart_run);
   1176 }
   1177 
   1178 /*
   1179  * Helper function to set the name of the current thread
   1180  */
   1181 static void setThreadName(const char *threadName)
   1182 {
   1183     int hasAt = 0;
   1184     int hasDot = 0;
   1185     const char *s = threadName;
   1186     while (*s) {
   1187         if (*s == '.') hasDot = 1;
   1188         else if (*s == '@') hasAt = 1;
   1189         s++;
   1190     }
   1191     int len = s - threadName;
   1192     if (len < 15 || hasAt || !hasDot) {
   1193         s = threadName;
   1194     } else {
   1195         s = threadName + len - 15;
   1196     }
   1197 #if defined(HAVE_ANDROID_PTHREAD_SETNAME_NP)
   1198     /* pthread_setname_np fails rather than truncating long strings */
   1199     char buf[16];       // MAX_TASK_COMM_LEN=16 is hard-coded into bionic
   1200     strncpy(buf, s, sizeof(buf)-1);
   1201     buf[sizeof(buf)-1] = '\0';
   1202     int err = pthread_setname_np(pthread_self(), buf);
   1203     if (err != 0) {
   1204         ALOGW("Unable to set the name of current thread to '%s': %s",
   1205             buf, strerror(err));
   1206     }
   1207 #elif defined(HAVE_PRCTL)
   1208     prctl(PR_SET_NAME, (unsigned long) s, 0, 0, 0);
   1209 #else
   1210     ALOGD("No way to set current thread's name (%s)", s);
   1211 #endif
   1212 }
   1213 
   1214 /*
   1215  * Create a thread as a result of java.lang.Thread.start().
   1216  *
   1217  * We do have to worry about some concurrency problems, e.g. programs
   1218  * that try to call Thread.start() on the same object from multiple threads.
   1219  * (This will fail for all but one, but we have to make sure that it succeeds
   1220  * for exactly one.)
   1221  *
   1222  * Some of the complexity here arises from our desire to mimic the
   1223  * Thread vs. VMThread class decomposition we inherited.  We've been given
   1224  * a Thread, and now we need to create a VMThread and then populate both
   1225  * objects.  We also need to create one of our internal Thread objects.
   1226  *
   1227  * Pass in a stack size of 0 to get the default.
   1228  *
   1229  * The "threadObj" reference must be pinned by the caller to prevent the GC
   1230  * from moving it around (e.g. added to the tracked allocation list).
   1231  */
   1232 bool dvmCreateInterpThread(Object* threadObj, int reqStackSize)
   1233 {
   1234     assert(threadObj != NULL);
   1235 
   1236     Thread* self = dvmThreadSelf();
   1237     int stackSize;
   1238     if (reqStackSize == 0)
   1239         stackSize = gDvm.stackSize;
   1240     else if (reqStackSize < kMinStackSize)
   1241         stackSize = kMinStackSize;
   1242     else if (reqStackSize > kMaxStackSize)
   1243         stackSize = kMaxStackSize;
   1244     else
   1245         stackSize = reqStackSize;
   1246 
   1247     pthread_attr_t threadAttr;
   1248     pthread_attr_init(&threadAttr);
   1249     pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);
   1250 
   1251     /*
   1252      * To minimize the time spent in the critical section, we allocate the
   1253      * vmThread object here.
   1254      */
   1255     Object* vmThreadObj = dvmAllocObject(gDvm.classJavaLangVMThread, ALLOC_DEFAULT);
   1256     if (vmThreadObj == NULL)
   1257         return false;
   1258 
   1259     Thread* newThread = allocThread(stackSize);
   1260     if (newThread == NULL) {
   1261         dvmReleaseTrackedAlloc(vmThreadObj, NULL);
   1262         return false;
   1263     }
   1264 
   1265     newThread->threadObj = threadObj;
   1266 
   1267     assert(newThread->status == THREAD_INITIALIZING);
   1268 
   1269     /*
   1270      * We need to lock out other threads while we test and set the
   1271      * "vmThread" field in java.lang.Thread, because we use that to determine
   1272      * if this thread has been started before.  We use the thread list lock
   1273      * because it's handy and we're going to need to grab it again soon
   1274      * anyway.
   1275      */
   1276     dvmLockThreadList(self);
   1277 
   1278     if (dvmGetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread) != NULL) {
   1279         dvmUnlockThreadList();
   1280         dvmThrowIllegalThreadStateException(
   1281             "thread has already been started");
   1282         freeThread(newThread);
   1283         dvmReleaseTrackedAlloc(vmThreadObj, NULL);
   1284     }
   1285 
   1286     /*
   1287      * There are actually three data structures: Thread (object), VMThread
   1288      * (object), and Thread (C struct).  All of them point to at least one
   1289      * other.
   1290      *
   1291      * As soon as "VMThread.vmData" is assigned, other threads can start
   1292      * making calls into us (e.g. setPriority).
   1293      */
   1294     dvmSetFieldInt(vmThreadObj, gDvm.offJavaLangVMThread_vmData, (u4)newThread);
   1295     dvmSetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread, vmThreadObj);
   1296 
   1297     /*
   1298      * Thread creation might take a while, so release the lock.
   1299      */
   1300     dvmUnlockThreadList();
   1301 
   1302     ThreadStatus oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
   1303     pthread_t threadHandle;
   1304     int cc = pthread_create(&threadHandle, &threadAttr, interpThreadStart, newThread);
   1305     pthread_attr_destroy(&threadAttr);
   1306     dvmChangeStatus(self, oldStatus);
   1307 
   1308     if (cc != 0) {
   1309         /*
   1310          * Failure generally indicates that we have exceeded system
   1311          * resource limits.  VirtualMachineError is probably too severe,
   1312          * so use OutOfMemoryError.
   1313          */
   1314 
   1315         dvmSetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread, NULL);
   1316 
   1317         ALOGE("pthread_create (stack size %d bytes) failed: %s", stackSize, strerror(cc));
   1318         dvmThrowExceptionFmt(gDvm.exOutOfMemoryError,
   1319                              "pthread_create (stack size %d bytes) failed: %s",
   1320                              stackSize, strerror(cc));
   1321         goto fail;
   1322     }
   1323 
   1324     /*
   1325      * We need to wait for the thread to start.  Otherwise, depending on
   1326      * the whims of the OS scheduler, we could return and the code in our
   1327      * thread could try to do operations on the new thread before it had
   1328      * finished starting.
   1329      *
   1330      * The new thread will lock the thread list, change its state to
   1331      * THREAD_STARTING, broadcast to gDvm.threadStartCond, and then sleep
   1332      * on gDvm.threadStartCond (which uses the thread list lock).  This
   1333      * thread (the parent) will either see that the thread is already ready
   1334      * after we grab the thread list lock, or will be awakened from the
   1335      * condition variable on the broadcast.
   1336      *
   1337      * We don't want to stall the rest of the VM while the new thread
   1338      * starts, which can happen if the GC wakes up at the wrong moment.
   1339      * So, we change our own status to VMWAIT, and self-suspend if
   1340      * necessary after we finish adding the new thread.
   1341      *
   1342      *
   1343      * We have to deal with an odd race with the GC/debugger suspension
   1344      * mechanism when creating a new thread.  The information about whether
   1345      * or not a thread should be suspended is contained entirely within
   1346      * the Thread struct; this is usually cleaner to deal with than having
   1347      * one or more globally-visible suspension flags.  The trouble is that
   1348      * we could create the thread while the VM is trying to suspend all
   1349      * threads.  The suspend-count won't be nonzero for the new thread,
   1350      * so dvmChangeStatus(THREAD_RUNNING) won't cause a suspension.
   1351      *
   1352      * The easiest way to deal with this is to prevent the new thread from
   1353      * running until the parent says it's okay.  This results in the
   1354      * following (correct) sequence of events for a "badly timed" GC
   1355      * (where '-' is us, 'o' is the child, and '+' is some other thread):
   1356      *
   1357      *  - call pthread_create()
   1358      *  - lock thread list
   1359      *  - put self into THREAD_VMWAIT so GC doesn't wait for us
   1360      *  - sleep on condition var (mutex = thread list lock) until child starts
   1361      *  + GC triggered by another thread
   1362      *  + thread list locked; suspend counts updated; thread list unlocked
   1363      *  + loop waiting for all runnable threads to suspend
   1364      *  + success, start GC
   1365      *  o child thread wakes, signals condition var to wake parent
   1366      *  o child waits for parent ack on condition variable
   1367      *  - we wake up, locking thread list
   1368      *  - add child to thread list
   1369      *  - unlock thread list
   1370      *  - change our state back to THREAD_RUNNING; GC causes us to suspend
   1371      *  + GC finishes; all threads in thread list are resumed
   1372      *  - lock thread list
   1373      *  - set child to THREAD_VMWAIT, and signal it to start
   1374      *  - unlock thread list
   1375      *  o child resumes
   1376      *  o child changes state to THREAD_RUNNING
   1377      *
   1378      * The above shows the GC starting up during thread creation, but if
   1379      * it starts anywhere after VMThread.create() is called it will
   1380      * produce the same series of events.
   1381      *
   1382      * Once the child is in the thread list, it will be suspended and
   1383      * resumed like any other thread.  In the above scenario the resume-all
   1384      * code will try to resume the new thread, which was never actually
   1385      * suspended, and try to decrement the child's thread suspend count to -1.
   1386      * We can catch this in the resume-all code.
   1387      *
   1388      * Bouncing back and forth between threads like this adds a small amount
   1389      * of scheduler overhead to thread startup.
   1390      *
   1391      * One alternative to having the child wait for the parent would be
   1392      * to have the child inherit the parents' suspension count.  This
   1393      * would work for a GC, since we can safely assume that the parent
   1394      * thread didn't cause it, but we must only do so if the parent suspension
   1395      * was caused by a suspend-all.  If the parent was being asked to
   1396      * suspend singly by the debugger, the child should not inherit the value.
   1397      *
   1398      * We could also have a global "new thread suspend count" that gets
   1399      * picked up by new threads before changing state to THREAD_RUNNING.
   1400      * This would be protected by the thread list lock and set by a
   1401      * suspend-all.
   1402      */
   1403     dvmLockThreadList(self);
   1404     assert(self->status == THREAD_RUNNING);
   1405     self->status = THREAD_VMWAIT;
   1406     while (newThread->status != THREAD_STARTING)
   1407         pthread_cond_wait(&gDvm.threadStartCond, &gDvm.threadListLock);
   1408 
   1409     LOG_THREAD("threadid=%d: adding to list", newThread->threadId);
   1410     newThread->next = gDvm.threadList->next;
   1411     if (newThread->next != NULL)
   1412         newThread->next->prev = newThread;
   1413     newThread->prev = gDvm.threadList;
   1414     gDvm.threadList->next = newThread;
   1415 
   1416     /* Add any existing global modes to the interpBreak control */
   1417     dvmInitializeInterpBreak(newThread);
   1418 
   1419     if (!dvmGetFieldBoolean(threadObj, gDvm.offJavaLangThread_daemon))
   1420         gDvm.nonDaemonThreadCount++;        // guarded by thread list lock
   1421 
   1422     dvmUnlockThreadList();
   1423 
   1424     /* change status back to RUNNING, self-suspending if necessary */
   1425     dvmChangeStatus(self, THREAD_RUNNING);
   1426 
   1427     /*
   1428      * Tell the new thread to start.
   1429      *
   1430      * We must hold the thread list lock before messing with another thread.
   1431      * In the general case we would also need to verify that newThread was
   1432      * still in the thread list, but in our case the thread has not started
   1433      * executing user code and therefore has not had a chance to exit.
   1434      *
   1435      * We move it to VMWAIT, and it then shifts itself to RUNNING, which
   1436      * comes with a suspend-pending check.
   1437      */
   1438     dvmLockThreadList(self);
   1439 
   1440     assert(newThread->status == THREAD_STARTING);
   1441     newThread->status = THREAD_VMWAIT;
   1442     pthread_cond_broadcast(&gDvm.threadStartCond);
   1443 
   1444     dvmUnlockThreadList();
   1445 
   1446     dvmReleaseTrackedAlloc(vmThreadObj, NULL);
   1447     return true;
   1448 
   1449 fail:
   1450     freeThread(newThread);
   1451     dvmReleaseTrackedAlloc(vmThreadObj, NULL);
   1452     return false;
   1453 }
   1454 
   1455 /*
   1456  * pthread entry function for threads started from interpreted code.
   1457  */
   1458 static void* interpThreadStart(void* arg)
   1459 {
   1460     Thread* self = (Thread*) arg;
   1461 
   1462     std::string threadName(dvmGetThreadName(self));
   1463     setThreadName(threadName.c_str());
   1464 
   1465     /*
   1466      * Finish initializing the Thread struct.
   1467      */
   1468     dvmLockThreadList(self);
   1469     prepareThread(self);
   1470 
   1471     LOG_THREAD("threadid=%d: created from interp", self->threadId);
   1472 
   1473     /*
   1474      * Change our status and wake our parent, who will add us to the
   1475      * thread list and advance our state to VMWAIT.
   1476      */
   1477     self->status = THREAD_STARTING;
   1478     pthread_cond_broadcast(&gDvm.threadStartCond);
   1479 
   1480     /*
   1481      * Wait until the parent says we can go.  Assuming there wasn't a
   1482      * suspend pending, this will happen immediately.  When it completes,
   1483      * we're full-fledged citizens of the VM.
   1484      *
   1485      * We have to use THREAD_VMWAIT here rather than THREAD_RUNNING
   1486      * because the pthread_cond_wait below needs to reacquire a lock that
   1487      * suspend-all is also interested in.  If we get unlucky, the parent could
   1488      * change us to THREAD_RUNNING, then a GC could start before we get
   1489      * signaled, and suspend-all will grab the thread list lock and then
   1490      * wait for us to suspend.  We'll be in the tail end of pthread_cond_wait
   1491      * trying to get the lock.
   1492      */
   1493     while (self->status != THREAD_VMWAIT)
   1494         pthread_cond_wait(&gDvm.threadStartCond, &gDvm.threadListLock);
   1495 
   1496     dvmUnlockThreadList();
   1497 
   1498     /*
   1499      * Add a JNI context.
   1500      */
   1501     self->jniEnv = dvmCreateJNIEnv(self);
   1502 
   1503     /*
   1504      * Change our state so the GC will wait for us from now on.  If a GC is
   1505      * in progress this call will suspend us.
   1506      */
   1507     dvmChangeStatus(self, THREAD_RUNNING);
   1508 
   1509     /*
   1510      * Notify the debugger & DDM.  The debugger notification may cause
   1511      * us to suspend ourselves (and others).  The thread state may change
   1512      * to VMWAIT briefly if network packets are sent.
   1513      */
   1514     if (gDvm.debuggerConnected)
   1515         dvmDbgPostThreadStart(self);
   1516 
   1517     /*
   1518      * Set the system thread priority according to the Thread object's
   1519      * priority level.  We don't usually need to do this, because both the
   1520      * Thread object and system thread priorities inherit from parents.  The
   1521      * tricky case is when somebody creates a Thread object, calls
   1522      * setPriority(), and then starts the thread.  We could manage this with
   1523      * a "needs priority update" flag to avoid the redundant call.
   1524      */
   1525     int priority = dvmGetFieldInt(self->threadObj,
   1526                         gDvm.offJavaLangThread_priority);
   1527     dvmChangeThreadPriority(self, priority);
   1528 
   1529     /*
   1530      * Execute the "run" method.
   1531      *
   1532      * At this point our stack is empty, so somebody who comes looking for
   1533      * stack traces right now won't have much to look at.  This is normal.
   1534      */
   1535     Method* run = self->threadObj->clazz->vtable[gDvm.voffJavaLangThread_run];
   1536     JValue unused;
   1537 
   1538     ALOGV("threadid=%d: calling run()", self->threadId);
   1539     assert(strcmp(run->name, "run") == 0);
   1540     dvmCallMethod(self, run, self->threadObj, &unused);
   1541     ALOGV("threadid=%d: exiting", self->threadId);
   1542 
   1543     /*
   1544      * Remove the thread from various lists, report its death, and free
   1545      * its resources.
   1546      */
   1547     dvmDetachCurrentThread();
   1548 
   1549     return NULL;
   1550 }
   1551 
   1552 /*
   1553  * The current thread is exiting with an uncaught exception.  The
   1554  * Java programming language allows the application to provide a
   1555  * thread-exit-uncaught-exception handler for the VM, for a specific
   1556  * Thread, and for all threads in a ThreadGroup.
   1557  *
   1558  * Version 1.5 added the per-thread handler.  We need to call
   1559  * "uncaughtException" in the handler object, which is either the
   1560  * ThreadGroup object or the Thread-specific handler.
   1561  *
   1562  * This should only be called when an exception is pending.  Before
   1563  * returning, the exception will be cleared.
   1564  */
   1565 static void threadExitUncaughtException(Thread* self, Object* group)
   1566 {
   1567     Object* exception;
   1568     Object* handlerObj;
   1569     Method* uncaughtHandler;
   1570 
   1571     ALOGW("threadid=%d: thread exiting with uncaught exception (group=%p)",
   1572         self->threadId, group);
   1573     assert(group != NULL);
   1574 
   1575     /*
   1576      * Get a pointer to the exception, then clear out the one in the
   1577      * thread.  We don't want to have it set when executing interpreted code.
   1578      */
   1579     exception = dvmGetException(self);
   1580     assert(exception != NULL);
   1581     dvmAddTrackedAlloc(exception, self);
   1582     dvmClearException(self);
   1583 
   1584     /*
   1585      * Get the Thread's "uncaughtHandler" object.  Use it if non-NULL;
   1586      * else use "group" (which is an instance of UncaughtExceptionHandler).
   1587      * The ThreadGroup will handle it directly or call the default
   1588      * uncaught exception handler.
   1589      */
   1590     handlerObj = dvmGetFieldObject(self->threadObj,
   1591             gDvm.offJavaLangThread_uncaughtHandler);
   1592     if (handlerObj == NULL)
   1593         handlerObj = group;
   1594 
   1595     /*
   1596      * Find the "uncaughtException" method in this object.  The method
   1597      * was declared in the Thread.UncaughtExceptionHandler interface.
   1598      */
   1599     uncaughtHandler = dvmFindVirtualMethodHierByDescriptor(handlerObj->clazz,
   1600             "uncaughtException", "(Ljava/lang/Thread;Ljava/lang/Throwable;)V");
   1601 
   1602     if (uncaughtHandler != NULL) {
   1603         //ALOGI("+++ calling %s.uncaughtException",
   1604         //     handlerObj->clazz->descriptor);
   1605         JValue unused;
   1606         dvmCallMethod(self, uncaughtHandler, handlerObj, &unused,
   1607             self->threadObj, exception);
   1608     } else {
   1609         /* should be impossible, but handle it anyway */
   1610         ALOGW("WARNING: no 'uncaughtException' method in class %s",
   1611             handlerObj->clazz->descriptor);
   1612         dvmSetException(self, exception);
   1613         dvmLogExceptionStackTrace();
   1614     }
   1615 
   1616     /* if the uncaught handler threw, clear it */
   1617     dvmClearException(self);
   1618 
   1619     dvmReleaseTrackedAlloc(exception, self);
   1620 
   1621     /* Remove this thread's suspendCount from global suspendCount sum */
   1622     lockThreadSuspendCount();
   1623     dvmAddToSuspendCounts(self, -self->suspendCount, 0);
   1624     unlockThreadSuspendCount();
   1625 }
   1626 
   1627 
   1628 /*
   1629  * Create an internal VM thread, for things like JDWP and finalizers.
   1630  *
   1631  * The easiest way to do this is create a new thread and then use the
   1632  * JNI AttachCurrentThread implementation.
   1633  *
   1634  * This does not return until after the new thread has begun executing.
   1635  */
   1636 bool dvmCreateInternalThread(pthread_t* pHandle, const char* name,
   1637     InternalThreadStart func, void* funcArg)
   1638 {
   1639     InternalStartArgs* pArgs;
   1640     Object* systemGroup;
   1641     volatile Thread* newThread = NULL;
   1642     volatile int createStatus = 0;
   1643 
   1644     systemGroup = dvmGetSystemThreadGroup();
   1645     if (systemGroup == NULL)
   1646         return false;
   1647 
   1648     pArgs = (InternalStartArgs*) malloc(sizeof(*pArgs));
   1649     pArgs->func = func;
   1650     pArgs->funcArg = funcArg;
   1651     pArgs->name = strdup(name);     // storage will be owned by new thread
   1652     pArgs->group = systemGroup;
   1653     pArgs->isDaemon = true;
   1654     pArgs->pThread = &newThread;
   1655     pArgs->pCreateStatus = &createStatus;
   1656 
   1657     pthread_attr_t threadAttr;
   1658     pthread_attr_init(&threadAttr);
   1659 
   1660     int cc = pthread_create(pHandle, &threadAttr, internalThreadStart, pArgs);
   1661     pthread_attr_destroy(&threadAttr);
   1662     if (cc != 0) {
   1663         ALOGE("internal thread creation failed: %s", strerror(cc));
   1664         free(pArgs->name);
   1665         free(pArgs);
   1666         return false;
   1667     }
   1668 
   1669     /*
   1670      * Wait for the child to start.  This gives us an opportunity to make
   1671      * sure that the thread started correctly, and allows our caller to
   1672      * assume that the thread has started running.
   1673      *
   1674      * Because we aren't holding a lock across the thread creation, it's
   1675      * possible that the child will already have completed its
   1676      * initialization.  Because the child only adjusts "createStatus" while
   1677      * holding the thread list lock, the initial condition on the "while"
   1678      * loop will correctly avoid the wait if this occurs.
   1679      *
   1680      * It's also possible that we'll have to wait for the thread to finish
   1681      * being created, and as part of allocating a Thread object it might
   1682      * need to initiate a GC.  We switch to VMWAIT while we pause.
   1683      */
   1684     Thread* self = dvmThreadSelf();
   1685     ThreadStatus oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
   1686     dvmLockThreadList(self);
   1687     while (createStatus == 0)
   1688         pthread_cond_wait(&gDvm.threadStartCond, &gDvm.threadListLock);
   1689 
   1690     if (newThread == NULL) {
   1691         ALOGW("internal thread create failed (createStatus=%d)", createStatus);
   1692         assert(createStatus < 0);
   1693         /* don't free pArgs -- if pthread_create succeeded, child owns it */
   1694         dvmUnlockThreadList();
   1695         dvmChangeStatus(self, oldStatus);
   1696         return false;
   1697     }
   1698 
   1699     /* thread could be in any state now (except early init states) */
   1700     //assert(newThread->status == THREAD_RUNNING);
   1701 
   1702     dvmUnlockThreadList();
   1703     dvmChangeStatus(self, oldStatus);
   1704 
   1705     return true;
   1706 }
   1707 
   1708 /*
   1709  * pthread entry function for internally-created threads.
   1710  *
   1711  * We are expected to free "arg" and its contents.  If we're a daemon
   1712  * thread, and we get cancelled abruptly when the VM shuts down, the
   1713  * storage won't be freed.  If this becomes a concern we can make a copy
   1714  * on the stack.
   1715  */
   1716 static void* internalThreadStart(void* arg)
   1717 {
   1718     InternalStartArgs* pArgs = (InternalStartArgs*) arg;
   1719     JavaVMAttachArgs jniArgs;
   1720 
   1721     jniArgs.version = JNI_VERSION_1_2;
   1722     jniArgs.name = pArgs->name;
   1723     jniArgs.group = reinterpret_cast<jobject>(pArgs->group);
   1724 
   1725     setThreadName(pArgs->name);
   1726 
   1727     /* use local jniArgs as stack top */
   1728     if (dvmAttachCurrentThread(&jniArgs, pArgs->isDaemon)) {
   1729         /*
   1730          * Tell the parent of our success.
   1731          *
   1732          * threadListLock is the mutex for threadStartCond.
   1733          */
   1734         dvmLockThreadList(dvmThreadSelf());
   1735         *pArgs->pCreateStatus = 1;
   1736         *pArgs->pThread = dvmThreadSelf();
   1737         pthread_cond_broadcast(&gDvm.threadStartCond);
   1738         dvmUnlockThreadList();
   1739 
   1740         LOG_THREAD("threadid=%d: internal '%s'",
   1741             dvmThreadSelf()->threadId, pArgs->name);
   1742 
   1743         /* execute */
   1744         (*pArgs->func)(pArgs->funcArg);
   1745 
   1746         /* detach ourselves */
   1747         dvmDetachCurrentThread();
   1748     } else {
   1749         /*
   1750          * Tell the parent of our failure.  We don't have a Thread struct,
   1751          * so we can't be suspended, so we don't need to enter a critical
   1752          * section.
   1753          */
   1754         dvmLockThreadList(dvmThreadSelf());
   1755         *pArgs->pCreateStatus = -1;
   1756         assert(*pArgs->pThread == NULL);
   1757         pthread_cond_broadcast(&gDvm.threadStartCond);
   1758         dvmUnlockThreadList();
   1759 
   1760         assert(*pArgs->pThread == NULL);
   1761     }
   1762 
   1763     free(pArgs->name);
   1764     free(pArgs);
   1765     return NULL;
   1766 }
   1767 
   1768 /*
   1769  * Attach the current thread to the VM.
   1770  *
   1771  * Used for internally-created threads and JNI's AttachCurrentThread.
   1772  */
   1773 bool dvmAttachCurrentThread(const JavaVMAttachArgs* pArgs, bool isDaemon)
   1774 {
   1775     Thread* self = NULL;
   1776     Object* threadObj = NULL;
   1777     Object* vmThreadObj = NULL;
   1778     StringObject* threadNameStr = NULL;
   1779     Method* init;
   1780     bool ok, ret;
   1781 
   1782     /* allocate thread struct, and establish a basic sense of self */
   1783     self = allocThread(gDvm.stackSize);
   1784     if (self == NULL)
   1785         goto fail;
   1786     setThreadSelf(self);
   1787 
   1788     /*
   1789      * Finish our thread prep.  We need to do this before adding ourselves
   1790      * to the thread list or invoking any interpreted code.  prepareThread()
   1791      * requires that we hold the thread list lock.
   1792      */
   1793     dvmLockThreadList(self);
   1794     ok = prepareThread(self);
   1795     dvmUnlockThreadList();
   1796     if (!ok)
   1797         goto fail;
   1798 
   1799     self->jniEnv = dvmCreateJNIEnv(self);
   1800     if (self->jniEnv == NULL)
   1801         goto fail;
   1802 
   1803     /*
   1804      * Create a "fake" JNI frame at the top of the main thread interp stack.
   1805      * It isn't really necessary for the internal threads, but it gives
   1806      * the debugger something to show.  It is essential for the JNI-attached
   1807      * threads.
   1808      */
   1809     if (!createFakeRunFrame(self))
   1810         goto fail;
   1811 
   1812     /*
   1813      * The native side of the thread is ready; add it to the list.  Once
   1814      * it's on the list the thread is visible to the JDWP code and the GC.
   1815      */
   1816     LOG_THREAD("threadid=%d: adding to list (attached)", self->threadId);
   1817 
   1818     dvmLockThreadList(self);
   1819 
   1820     self->next = gDvm.threadList->next;
   1821     if (self->next != NULL)
   1822         self->next->prev = self;
   1823     self->prev = gDvm.threadList;
   1824     gDvm.threadList->next = self;
   1825     if (!isDaemon)
   1826         gDvm.nonDaemonThreadCount++;
   1827 
   1828     dvmUnlockThreadList();
   1829 
   1830     /*
   1831      * Switch state from initializing to running.
   1832      *
   1833      * It's possible that a GC began right before we added ourselves
   1834      * to the thread list, and is still going.  That means our thread
   1835      * suspend count won't reflect the fact that we should be suspended.
   1836      * To deal with this, we transition to VMWAIT, pulse the heap lock,
   1837      * and then advance to RUNNING.  That will ensure that we stall until
   1838      * the GC completes.
   1839      *
   1840      * Once we're in RUNNING, we're like any other thread in the VM (except
   1841      * for the lack of an initialized threadObj).  We're then free to
   1842      * allocate and initialize objects.
   1843      */
   1844     assert(self->status == THREAD_INITIALIZING);
   1845     dvmChangeStatus(self, THREAD_VMWAIT);
   1846     dvmLockMutex(&gDvm.gcHeapLock);
   1847     dvmUnlockMutex(&gDvm.gcHeapLock);
   1848     dvmChangeStatus(self, THREAD_RUNNING);
   1849 
   1850     /*
   1851      * Create Thread and VMThread objects.
   1852      */
   1853     threadObj = dvmAllocObject(gDvm.classJavaLangThread, ALLOC_DEFAULT);
   1854     vmThreadObj = dvmAllocObject(gDvm.classJavaLangVMThread, ALLOC_DEFAULT);
   1855     if (threadObj == NULL || vmThreadObj == NULL)
   1856         goto fail_unlink;
   1857 
   1858     /*
   1859      * This makes threadObj visible to the GC.  We still have it in the
   1860      * tracked allocation table, so it can't move around on us.
   1861      */
   1862     self->threadObj = threadObj;
   1863     dvmSetFieldInt(vmThreadObj, gDvm.offJavaLangVMThread_vmData, (u4)self);
   1864 
   1865     /*
   1866      * Create a string for the thread name.
   1867      */
   1868     if (pArgs->name != NULL) {
   1869         threadNameStr = dvmCreateStringFromCstr(pArgs->name);
   1870         if (threadNameStr == NULL) {
   1871             assert(dvmCheckException(dvmThreadSelf()));
   1872             goto fail_unlink;
   1873         }
   1874     }
   1875 
   1876     init = dvmFindDirectMethodByDescriptor(gDvm.classJavaLangThread, "<init>",
   1877             "(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V");
   1878     if (init == NULL) {
   1879         assert(dvmCheckException(self));
   1880         goto fail_unlink;
   1881     }
   1882 
   1883     /*
   1884      * Now we're ready to run some interpreted code.
   1885      *
   1886      * We need to construct the Thread object and set the VMThread field.
   1887      * Setting VMThread tells interpreted code that we're alive.
   1888      *
   1889      * Call the (group, name, priority, daemon) constructor on the Thread.
   1890      * This sets the thread's name and adds it to the specified group, and
   1891      * provides values for priority and daemon (which are normally inherited
   1892      * from the current thread).
   1893      */
   1894     JValue unused;
   1895     dvmCallMethod(self, init, threadObj, &unused, (Object*)pArgs->group,
   1896             threadNameStr, os_getThreadPriorityFromSystem(), isDaemon);
   1897     if (dvmCheckException(self)) {
   1898         ALOGE("exception thrown while constructing attached thread object");
   1899         goto fail_unlink;
   1900     }
   1901 
   1902     /*
   1903      * Set the VMThread field, which tells interpreted code that we're alive.
   1904      *
   1905      * The risk of a thread start collision here is very low; somebody
   1906      * would have to be deliberately polling the ThreadGroup list and
   1907      * trying to start threads against anything it sees, which would
   1908      * generally cause problems for all thread creation.  However, for
   1909      * correctness we test "vmThread" before setting it.
   1910      *
   1911      * TODO: this still has a race, it's just smaller.  Not sure this is
   1912      * worth putting effort into fixing.  Need to hold a lock while
   1913      * fiddling with the field, or maybe initialize the Thread object in a
   1914      * way that ensures another thread can't call start() on it.
   1915      */
   1916     if (dvmGetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread) != NULL) {
   1917         ALOGW("WOW: thread start hijack");
   1918         dvmThrowIllegalThreadStateException(
   1919             "thread has already been started");
   1920         /* We don't want to free anything associated with the thread
   1921          * because someone is obviously interested in it.  Just let
   1922          * it go and hope it will clean itself up when its finished.
   1923          * This case should never happen anyway.
   1924          *
   1925          * Since we're letting it live, we need to finish setting it up.
   1926          * We just have to let the caller know that the intended operation
   1927          * has failed.
   1928          *
   1929          * [ This seems strange -- stepping on the vmThread object that's
   1930          * already present seems like a bad idea.  TODO: figure this out. ]
   1931          */
   1932         ret = false;
   1933     } else {
   1934         ret = true;
   1935     }
   1936     dvmSetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread, vmThreadObj);
   1937 
   1938     /* we can now safely un-pin these */
   1939     dvmReleaseTrackedAlloc(threadObj, self);
   1940     dvmReleaseTrackedAlloc(vmThreadObj, self);
   1941     dvmReleaseTrackedAlloc((Object*)threadNameStr, self);
   1942 
   1943     LOG_THREAD("threadid=%d: attached from native, name=%s",
   1944         self->threadId, pArgs->name);
   1945 
   1946     /* tell the debugger & DDM */
   1947     if (gDvm.debuggerConnected)
   1948         dvmDbgPostThreadStart(self);
   1949 
   1950     return ret;
   1951 
   1952 fail_unlink:
   1953     dvmLockThreadList(self);
   1954     unlinkThread(self);
   1955     if (!isDaemon)
   1956         gDvm.nonDaemonThreadCount--;
   1957     dvmUnlockThreadList();
   1958     /* fall through to "fail" */
   1959 fail:
   1960     dvmReleaseTrackedAlloc(threadObj, self);
   1961     dvmReleaseTrackedAlloc(vmThreadObj, self);
   1962     dvmReleaseTrackedAlloc((Object*)threadNameStr, self);
   1963     if (self != NULL) {
   1964         if (self->jniEnv != NULL) {
   1965             dvmDestroyJNIEnv(self->jniEnv);
   1966             self->jniEnv = NULL;
   1967         }
   1968         freeThread(self);
   1969     }
   1970     setThreadSelf(NULL);
   1971     return false;
   1972 }
   1973 
   1974 /*
   1975  * Detach the thread from the various data structures, notify other threads
   1976  * that are waiting to "join" it, and free up all heap-allocated storage.
   1977  *
   1978  * Used for all threads.
   1979  *
   1980  * When we get here the interpreted stack should be empty.  The JNI 1.6 spec
   1981  * requires us to enforce this for the DetachCurrentThread call, probably
   1982  * because it also says that DetachCurrentThread causes all monitors
   1983  * associated with the thread to be released.  (Because the stack is empty,
   1984  * we only have to worry about explicit JNI calls to MonitorEnter.)
   1985  *
   1986  * THOUGHT:
   1987  * We might want to avoid freeing our internal Thread structure until the
   1988  * associated Thread/VMThread objects get GCed.  Our Thread is impossible to
   1989  * get to once the thread shuts down, but there is a small possibility of
   1990  * an operation starting in another thread before this thread halts, and
   1991  * finishing much later (perhaps the thread got stalled by a weird OS bug).
   1992  * We don't want something like Thread.isInterrupted() crawling through
   1993  * freed storage.  Can do with a Thread finalizer, or by creating a
   1994  * dedicated ThreadObject class for java/lang/Thread and moving all of our
   1995  * state into that.
   1996  */
   1997 void dvmDetachCurrentThread()
   1998 {
   1999     Thread* self = dvmThreadSelf();
   2000     Object* vmThread;
   2001     Object* group;
   2002 
   2003     /*
   2004      * Make sure we're not detaching a thread that's still running.  (This
   2005      * could happen with an explicit JNI detach call.)
   2006      *
   2007      * A thread created by interpreted code will finish with a depth of
   2008      * zero, while a JNI-attached thread will have the synthetic "stack
   2009      * starter" native method at the top.
   2010      */
   2011     int curDepth = dvmComputeExactFrameDepth(self->interpSave.curFrame);
   2012     if (curDepth != 0) {
   2013         bool topIsNative = false;
   2014 
   2015         if (curDepth == 1) {
   2016             /* not expecting a lingering break frame; just look at curFrame */
   2017             assert(!dvmIsBreakFrame((u4*)self->interpSave.curFrame));
   2018             StackSaveArea* ssa = SAVEAREA_FROM_FP(self->interpSave.curFrame);
   2019             if (dvmIsNativeMethod(ssa->method))
   2020                 topIsNative = true;
   2021         }
   2022 
   2023         if (!topIsNative) {
   2024             ALOGE("ERROR: detaching thread with interp frames (count=%d)",
   2025                 curDepth);
   2026             dvmDumpThread(self, false);
   2027             dvmAbort();
   2028         }
   2029     }
   2030 
   2031     group = dvmGetFieldObject(self->threadObj, gDvm.offJavaLangThread_group);
   2032     LOG_THREAD("threadid=%d: detach (group=%p)", self->threadId, group);
   2033 
   2034     /*
   2035      * Release any held monitors.  Since there are no interpreted stack
   2036      * frames, the only thing left are the monitors held by JNI MonitorEnter
   2037      * calls.
   2038      */
   2039     dvmReleaseJniMonitors(self);
   2040 
   2041     /*
   2042      * Do some thread-exit uncaught exception processing if necessary.
   2043      */
   2044     if (dvmCheckException(self))
   2045         threadExitUncaughtException(self, group);
   2046 
   2047     /*
   2048      * Remove the thread from the thread group.
   2049      */
   2050     if (group != NULL) {
   2051         Method* removeThread =
   2052             group->clazz->vtable[gDvm.voffJavaLangThreadGroup_removeThread];
   2053         JValue unused;
   2054         dvmCallMethod(self, removeThread, group, &unused, self->threadObj);
   2055     }
   2056 
   2057     /*
   2058      * Clear the vmThread reference in the Thread object.  Interpreted code
   2059      * will now see that this Thread is not running.  As this may be the
   2060      * only reference to the VMThread object that the VM knows about, we
   2061      * have to create an internal reference to it first.
   2062      */
   2063     vmThread = dvmGetFieldObject(self->threadObj,
   2064                     gDvm.offJavaLangThread_vmThread);
   2065     dvmAddTrackedAlloc(vmThread, self);
   2066     dvmSetFieldObject(self->threadObj, gDvm.offJavaLangThread_vmThread, NULL);
   2067 
   2068     /* clear out our struct Thread pointer, since it's going away */
   2069     dvmSetFieldObject(vmThread, gDvm.offJavaLangVMThread_vmData, NULL);
   2070 
   2071     /*
   2072      * Tell the debugger & DDM.  This may cause the current thread or all
   2073      * threads to suspend.
   2074      *
   2075      * The JDWP spec is somewhat vague about when this happens, other than
   2076      * that it's issued by the dying thread, which may still appear in
   2077      * an "all threads" listing.
   2078      */
   2079     if (gDvm.debuggerConnected)
   2080         dvmDbgPostThreadDeath(self);
   2081 
   2082     /*
   2083      * Thread.join() is implemented as an Object.wait() on the VMThread
   2084      * object.  Signal anyone who is waiting.
   2085      */
   2086     dvmLockObject(self, vmThread);
   2087     dvmObjectNotifyAll(self, vmThread);
   2088     dvmUnlockObject(self, vmThread);
   2089 
   2090     dvmReleaseTrackedAlloc(vmThread, self);
   2091     vmThread = NULL;
   2092 
   2093     /*
   2094      * We're done manipulating objects, so it's okay if the GC runs in
   2095      * parallel with us from here out.  It's important to do this if
   2096      * profiling is enabled, since we can wait indefinitely.
   2097      */
   2098     volatile void* raw = reinterpret_cast<volatile void*>(&self->status);
   2099     volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw);
   2100     android_atomic_release_store(THREAD_VMWAIT, addr);
   2101 
   2102     /*
   2103      * If we're doing method trace profiling, we don't want threads to exit,
   2104      * because if they do we'll end up reusing thread IDs.  This complicates
   2105      * analysis and makes it impossible to have reasonable output in the
   2106      * "threads" section of the "key" file.
   2107      *
   2108      * We need to do this after Thread.join() completes, or other threads
   2109      * could get wedged.  Since self->threadObj is still valid, the Thread
   2110      * object will not get GCed even though we're no longer in the ThreadGroup
   2111      * list (which is important since the profiling thread needs to get
   2112      * the thread's name).
   2113      */
   2114     MethodTraceState* traceState = &gDvm.methodTrace;
   2115 
   2116     dvmLockMutex(&traceState->startStopLock);
   2117     if (traceState->traceEnabled) {
   2118         ALOGI("threadid=%d: waiting for method trace to finish",
   2119             self->threadId);
   2120         while (traceState->traceEnabled) {
   2121             dvmWaitCond(&traceState->threadExitCond,
   2122                         &traceState->startStopLock);
   2123         }
   2124     }
   2125     dvmUnlockMutex(&traceState->startStopLock);
   2126 
   2127     dvmLockThreadList(self);
   2128 
   2129     /*
   2130      * Lose the JNI context.
   2131      */
   2132     dvmDestroyJNIEnv(self->jniEnv);
   2133     self->jniEnv = NULL;
   2134 
   2135     self->status = THREAD_ZOMBIE;
   2136 
   2137     /*
   2138      * Remove ourselves from the internal thread list.
   2139      */
   2140     unlinkThread(self);
   2141 
   2142     /*
   2143      * If we're the last one standing, signal anybody waiting in
   2144      * DestroyJavaVM that it's okay to exit.
   2145      */
   2146     if (!dvmGetFieldBoolean(self->threadObj, gDvm.offJavaLangThread_daemon)) {
   2147         gDvm.nonDaemonThreadCount--;        // guarded by thread list lock
   2148 
   2149         if (gDvm.nonDaemonThreadCount == 0) {
   2150             ALOGV("threadid=%d: last non-daemon thread", self->threadId);
   2151             //dvmDumpAllThreads(false);
   2152             // cond var guarded by threadListLock, which we already hold
   2153             int cc = pthread_cond_signal(&gDvm.vmExitCond);
   2154             if (cc != 0) {
   2155                 ALOGE("pthread_cond_signal(&gDvm.vmExitCond) failed: %s", strerror(cc));
   2156                 dvmAbort();
   2157             }
   2158         }
   2159     }
   2160 
   2161     ALOGV("threadid=%d: bye!", self->threadId);
   2162     releaseThreadId(self);
   2163     dvmUnlockThreadList();
   2164 
   2165     setThreadSelf(NULL);
   2166 
   2167     freeThread(self);
   2168 }
   2169 
   2170 
   2171 /*
   2172  * Suspend a single thread.  Do not use to suspend yourself.
   2173  *
   2174  * This is used primarily for debugger/DDMS activity.  Does not return
   2175  * until the thread has suspended or is in a "safe" state (e.g. executing
   2176  * native code outside the VM).
   2177  *
   2178  * The thread list lock should be held before calling here -- it's not
   2179  * entirely safe to hang on to a Thread* from another thread otherwise.
   2180  * (We'd need to grab it here anyway to avoid clashing with a suspend-all.)
   2181  */
   2182 void dvmSuspendThread(Thread* thread)
   2183 {
   2184     assert(thread != NULL);
   2185     assert(thread != dvmThreadSelf());
   2186     //assert(thread->handle != dvmJdwpGetDebugThread(gDvm.jdwpState));
   2187 
   2188     lockThreadSuspendCount();
   2189     dvmAddToSuspendCounts(thread, 1, 1);
   2190 
   2191     LOG_THREAD("threadid=%d: suspend++, now=%d",
   2192         thread->threadId, thread->suspendCount);
   2193     unlockThreadSuspendCount();
   2194 
   2195     waitForThreadSuspend(dvmThreadSelf(), thread);
   2196 }
   2197 
   2198 /*
   2199  * Reduce the suspend count of a thread.  If it hits zero, tell it to
   2200  * resume.
   2201  *
   2202  * Used primarily for debugger/DDMS activity.  The thread in question
   2203  * might have been suspended singly or as part of a suspend-all operation.
   2204  *
   2205  * The thread list lock should be held before calling here -- it's not
   2206  * entirely safe to hang on to a Thread* from another thread otherwise.
   2207  * (We'd need to grab it here anyway to avoid clashing with a suspend-all.)
   2208  */
   2209 void dvmResumeThread(Thread* thread)
   2210 {
   2211     assert(thread != NULL);
   2212     assert(thread != dvmThreadSelf());
   2213     //assert(thread->handle != dvmJdwpGetDebugThread(gDvm.jdwpState));
   2214 
   2215     lockThreadSuspendCount();
   2216     if (thread->suspendCount > 0) {
   2217         dvmAddToSuspendCounts(thread, -1, -1);
   2218     } else {
   2219         LOG_THREAD("threadid=%d:  suspendCount already zero",
   2220             thread->threadId);
   2221     }
   2222 
   2223     LOG_THREAD("threadid=%d: suspend--, now=%d",
   2224         thread->threadId, thread->suspendCount);
   2225 
   2226     if (thread->suspendCount == 0) {
   2227         dvmBroadcastCond(&gDvm.threadSuspendCountCond);
   2228     }
   2229 
   2230     unlockThreadSuspendCount();
   2231 }
   2232 
   2233 /*
   2234  * Suspend yourself, as a result of debugger activity.
   2235  */
   2236 void dvmSuspendSelf(bool jdwpActivity)
   2237 {
   2238     Thread* self = dvmThreadSelf();
   2239 
   2240     /* debugger thread must not suspend itself due to debugger activity! */
   2241     assert(gDvm.jdwpState != NULL);
   2242     if (self->handle == dvmJdwpGetDebugThread(gDvm.jdwpState)) {
   2243         assert(false);
   2244         return;
   2245     }
   2246 
   2247     /*
   2248      * Collisions with other suspends aren't really interesting.  We want
   2249      * to ensure that we're the only one fiddling with the suspend count
   2250      * though.
   2251      */
   2252     lockThreadSuspendCount();
   2253     dvmAddToSuspendCounts(self, 1, 1);
   2254 
   2255     /*
   2256      * Suspend ourselves.
   2257      */
   2258     assert(self->suspendCount > 0);
   2259     self->status = THREAD_SUSPENDED;
   2260     LOG_THREAD("threadid=%d: self-suspending (dbg)", self->threadId);
   2261 
   2262     /*
   2263      * Tell JDWP that we've completed suspension.  The JDWP thread can't
   2264      * tell us to resume before we're fully asleep because we hold the
   2265      * suspend count lock.
   2266      *
   2267      * If we got here via waitForDebugger(), don't do this part.
   2268      */
   2269     if (jdwpActivity) {
   2270         //ALOGI("threadid=%d: clearing wait-for-event (my handle=%08x)",
   2271         //    self->threadId, (int) self->handle);
   2272         dvmJdwpClearWaitForEventThread(gDvm.jdwpState);
   2273     }
   2274 
   2275     while (self->suspendCount != 0) {
   2276         dvmWaitCond(&gDvm.threadSuspendCountCond,
   2277                     &gDvm.threadSuspendCountLock);
   2278         if (self->suspendCount != 0) {
   2279             /*
   2280              * The condition was signaled but we're still suspended.  This
   2281              * can happen if the debugger lets go while a SIGQUIT thread
   2282              * dump event is pending (assuming SignalCatcher was resumed for
   2283              * just long enough to try to grab the thread-suspend lock).
   2284              */
   2285             ALOGD("threadid=%d: still suspended after undo (sc=%d dc=%d)",
   2286                 self->threadId, self->suspendCount, self->dbgSuspendCount);
   2287         }
   2288     }
   2289     assert(self->suspendCount == 0 && self->dbgSuspendCount == 0);
   2290     self->status = THREAD_RUNNING;
   2291     LOG_THREAD("threadid=%d: self-reviving (dbg), status=%d",
   2292         self->threadId, self->status);
   2293 
   2294     unlockThreadSuspendCount();
   2295 }
   2296 
   2297 /*
   2298  * Dump the state of the current thread and that of another thread that
   2299  * we think is wedged.
   2300  */
   2301 static void dumpWedgedThread(Thread* thread)
   2302 {
   2303     dvmDumpThread(dvmThreadSelf(), false);
   2304     dvmPrintNativeBackTrace();
   2305 
   2306     // dumping a running thread is risky, but could be useful
   2307     dvmDumpThread(thread, true);
   2308 
   2309     // stop now and get a core dump
   2310     //abort();
   2311 }
   2312 
   2313 /*
   2314  * If the thread is running at below-normal priority, temporarily elevate
   2315  * it to "normal".
   2316  *
   2317  * Returns zero if no changes were made.  Otherwise, returns bit flags
   2318  * indicating what was changed, storing the previous values in the
   2319  * provided locations.
   2320  */
   2321 int dvmRaiseThreadPriorityIfNeeded(Thread* thread, int* pSavedThreadPrio,
   2322     SchedPolicy* pSavedThreadPolicy)
   2323 {
   2324     errno = 0;
   2325     *pSavedThreadPrio = getpriority(PRIO_PROCESS, thread->systemTid);
   2326     if (errno != 0) {
   2327         ALOGW("Unable to get priority for threadid=%d sysTid=%d",
   2328             thread->threadId, thread->systemTid);
   2329         return 0;
   2330     }
   2331     if (get_sched_policy(thread->systemTid, pSavedThreadPolicy) != 0) {
   2332         ALOGW("Unable to get policy for threadid=%d sysTid=%d",
   2333             thread->threadId, thread->systemTid);
   2334         return 0;
   2335     }
   2336 
   2337     int changeFlags = 0;
   2338 
   2339     /*
   2340      * Change the priority if we're in the background group.
   2341      */
   2342     if (*pSavedThreadPolicy == SP_BACKGROUND) {
   2343         if (set_sched_policy(thread->systemTid, SP_FOREGROUND) != 0) {
   2344             ALOGW("Couldn't set fg policy on tid %d", thread->systemTid);
   2345         } else {
   2346             changeFlags |= kChangedPolicy;
   2347             ALOGD("Temporarily moving tid %d to fg (was %d)",
   2348                 thread->systemTid, *pSavedThreadPolicy);
   2349         }
   2350     }
   2351 
   2352     /*
   2353      * getpriority() returns the "nice" value, so larger numbers indicate
   2354      * lower priority, with 0 being normal.
   2355      */
   2356     if (*pSavedThreadPrio > 0) {
   2357         const int kHigher = 0;
   2358         if (setpriority(PRIO_PROCESS, thread->systemTid, kHigher) != 0) {
   2359             ALOGW("Couldn't raise priority on tid %d to %d",
   2360                 thread->systemTid, kHigher);
   2361         } else {
   2362             changeFlags |= kChangedPriority;
   2363             ALOGD("Temporarily raised priority on tid %d (%d -> %d)",
   2364                 thread->systemTid, *pSavedThreadPrio, kHigher);
   2365         }
   2366     }
   2367 
   2368     return changeFlags;
   2369 }
   2370 
   2371 /*
   2372  * Reset the priority values for the thread in question.
   2373  */
   2374 void dvmResetThreadPriority(Thread* thread, int changeFlags,
   2375     int savedThreadPrio, SchedPolicy savedThreadPolicy)
   2376 {
   2377     if ((changeFlags & kChangedPolicy) != 0) {
   2378         if (set_sched_policy(thread->systemTid, savedThreadPolicy) != 0) {
   2379             ALOGW("NOTE: couldn't reset tid %d to (%d)",
   2380                 thread->systemTid, savedThreadPolicy);
   2381         } else {
   2382             ALOGD("Restored policy of %d to %d",
   2383                 thread->systemTid, savedThreadPolicy);
   2384         }
   2385     }
   2386 
   2387     if ((changeFlags & kChangedPriority) != 0) {
   2388         if (setpriority(PRIO_PROCESS, thread->systemTid, savedThreadPrio) != 0)
   2389         {
   2390             ALOGW("NOTE: couldn't reset priority on thread %d to %d",
   2391                 thread->systemTid, savedThreadPrio);
   2392         } else {
   2393             ALOGD("Restored priority on %d to %d",
   2394                 thread->systemTid, savedThreadPrio);
   2395         }
   2396     }
   2397 }
   2398 
   2399 /*
   2400  * Wait for another thread to see the pending suspension and stop running.
   2401  * It can either suspend itself or go into a non-running state such as
   2402  * VMWAIT or NATIVE in which it cannot interact with the GC.
   2403  *
   2404  * If we're running at a higher priority, sched_yield() may not do anything,
   2405  * so we need to sleep for "long enough" to guarantee that the other
   2406  * thread has a chance to finish what it's doing.  Sleeping for too short
   2407  * a period (e.g. less than the resolution of the sleep clock) might cause
   2408  * the scheduler to return immediately, so we want to start with a
   2409  * "reasonable" value and expand.
   2410  *
   2411  * This does not return until the other thread has stopped running.
   2412  * Eventually we time out and the VM aborts.
   2413  *
   2414  * This does not try to detect the situation where two threads are
   2415  * waiting for each other to suspend.  In normal use this is part of a
   2416  * suspend-all, which implies that the suspend-all lock is held, or as
   2417  * part of a debugger action in which the JDWP thread is always the one
   2418  * doing the suspending.  (We may need to re-evaluate this now that
   2419  * getThreadStackTrace is implemented as suspend-snapshot-resume.)
   2420  *
   2421  * TODO: track basic stats about time required to suspend VM.
   2422  */
   2423 #define FIRST_SLEEP (250*1000)    /* 0.25s */
   2424 #define MORE_SLEEP  (750*1000)    /* 0.75s */
   2425 static void waitForThreadSuspend(Thread* self, Thread* thread)
   2426 {
   2427     const int kMaxRetries = 10;
   2428     int spinSleepTime = FIRST_SLEEP;
   2429     bool complained = false;
   2430     int priChangeFlags = 0;
   2431     int savedThreadPrio = -500;
   2432     SchedPolicy savedThreadPolicy = SP_FOREGROUND;
   2433 
   2434     int sleepIter = 0;
   2435     int retryCount = 0;
   2436     u8 startWhen = 0;       // init req'd to placate gcc
   2437     u8 firstStartWhen = 0;
   2438 
   2439     while (thread->status == THREAD_RUNNING) {
   2440         if (sleepIter == 0) {           // get current time on first iteration
   2441             startWhen = dvmGetRelativeTimeUsec();
   2442             if (firstStartWhen == 0)    // first iteration of first attempt
   2443                 firstStartWhen = startWhen;
   2444 
   2445             /*
   2446              * After waiting for a bit, check to see if the target thread is
   2447              * running at a reduced priority.  If so, bump it up temporarily
   2448              * to give it more CPU time.
   2449              */
   2450             if (retryCount == 2) {
   2451                 assert(thread->systemTid != 0);
   2452                 priChangeFlags = dvmRaiseThreadPriorityIfNeeded(thread,
   2453                     &savedThreadPrio, &savedThreadPolicy);
   2454             }
   2455         }
   2456 
   2457 #if defined (WITH_JIT)
   2458         /*
   2459          * If we're still waiting after the first timeout, unchain all
   2460          * translations iff:
   2461          *   1) There are new chains formed since the last unchain
   2462          *   2) The top VM frame of the running thread is running JIT'ed code
   2463          */
   2464         if (gDvmJit.pJitEntryTable && retryCount > 0 &&
   2465             gDvmJit.hasNewChain && thread->inJitCodeCache) {
   2466             ALOGD("JIT unchain all for threadid=%d", thread->threadId);
   2467             dvmJitUnchainAll();
   2468         }
   2469 #endif
   2470 
   2471         /*
   2472          * Sleep briefly.  The iterative sleep call returns false if we've
   2473          * exceeded the total time limit for this round of sleeping.
   2474          */
   2475         if (!dvmIterativeSleep(sleepIter++, spinSleepTime, startWhen)) {
   2476             if (spinSleepTime != FIRST_SLEEP) {
   2477                 ALOGW("threadid=%d: spin on suspend #%d threadid=%d (pcf=%d)",
   2478                     self->threadId, retryCount,
   2479                     thread->threadId, priChangeFlags);
   2480                 if (retryCount > 1) {
   2481                     /* stack trace logging is slow; skip on first iter */
   2482                     dumpWedgedThread(thread);
   2483                 }
   2484                 complained = true;
   2485             }
   2486 
   2487             // keep going; could be slow due to valgrind
   2488             sleepIter = 0;
   2489             spinSleepTime = MORE_SLEEP;
   2490 
   2491             if (retryCount++ == kMaxRetries) {
   2492                 ALOGE("Fatal spin-on-suspend, dumping threads");
   2493                 dvmDumpAllThreads(false);
   2494 
   2495                 /* log this after -- long traces will scroll off log */
   2496                 ALOGE("threadid=%d: stuck on threadid=%d, giving up",
   2497                     self->threadId, thread->threadId);
   2498 
   2499                 /* try to get a debuggerd dump from the spinning thread */
   2500                 dvmNukeThread(thread);
   2501                 /* abort the VM */
   2502                 dvmAbort();
   2503             }
   2504         }
   2505     }
   2506 
   2507     if (complained) {
   2508         ALOGW("threadid=%d: spin on suspend resolved in %lld msec",
   2509             self->threadId,
   2510             (dvmGetRelativeTimeUsec() - firstStartWhen) / 1000);
   2511         //dvmDumpThread(thread, false);   /* suspended, so dump is safe */
   2512     }
   2513     if (priChangeFlags != 0) {
   2514         dvmResetThreadPriority(thread, priChangeFlags, savedThreadPrio,
   2515             savedThreadPolicy);
   2516     }
   2517 }
   2518 
   2519 /*
   2520  * Suspend all threads except the current one.  This is used by the GC,
   2521  * the debugger, and by any thread that hits a "suspend all threads"
   2522  * debugger event (e.g. breakpoint or exception).
   2523  *
   2524  * If thread N hits a "suspend all threads" breakpoint, we don't want it
   2525  * to suspend the JDWP thread.  For the GC, we do, because the debugger can
   2526  * create objects and even execute arbitrary code.  The "why" argument
   2527  * allows the caller to say why the suspension is taking place.
   2528  *
   2529  * This can be called when a global suspend has already happened, due to
   2530  * various debugger gymnastics, so keeping an "everybody is suspended" flag
   2531  * doesn't work.
   2532  *
   2533  * DO NOT grab any locks before calling here.  We grab & release the thread
   2534  * lock and suspend lock here (and we're not using recursive threads), and
   2535  * we might have to self-suspend if somebody else beats us here.
   2536  *
   2537  * We know the current thread is in the thread list, because we attach the
   2538  * thread before doing anything that could cause VM suspension (like object
   2539  * allocation).
   2540  */
   2541 void dvmSuspendAllThreads(SuspendCause why)
   2542 {
   2543     Thread* self = dvmThreadSelf();
   2544     Thread* thread;
   2545 
   2546     assert(why != 0);
   2547 
   2548     /*
   2549      * Start by grabbing the thread suspend lock.  If we can't get it, most
   2550      * likely somebody else is in the process of performing a suspend or
   2551      * resume, so lockThreadSuspend() will cause us to self-suspend.
   2552      *
   2553      * We keep the lock until all other threads are suspended.
   2554      */
   2555     lockThreadSuspend("susp-all", why);
   2556 
   2557     LOG_THREAD("threadid=%d: SuspendAll starting", self->threadId);
   2558 
   2559     /*
   2560      * This is possible if the current thread was in VMWAIT mode when a
   2561      * suspend-all happened, and then decided to do its own suspend-all.
   2562      * This can happen when a couple of threads have simultaneous events
   2563      * of interest to the debugger.
   2564      */
   2565     //assert(self->suspendCount == 0);
   2566 
   2567     /*
   2568      * Increment everybody's suspend count (except our own).
   2569      */
   2570     dvmLockThreadList(self);
   2571 
   2572     lockThreadSuspendCount();
   2573     for (thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   2574         if (thread == self)
   2575             continue;
   2576 
   2577         /* debugger events don't suspend JDWP thread */
   2578         if ((why == SUSPEND_FOR_DEBUG || why == SUSPEND_FOR_DEBUG_EVENT) &&
   2579             thread->handle == dvmJdwpGetDebugThread(gDvm.jdwpState))
   2580             continue;
   2581 
   2582         dvmAddToSuspendCounts(thread, 1,
   2583                               (why == SUSPEND_FOR_DEBUG ||
   2584                               why == SUSPEND_FOR_DEBUG_EVENT)
   2585                               ? 1 : 0);
   2586     }
   2587     unlockThreadSuspendCount();
   2588 
   2589     /*
   2590      * Wait for everybody in THREAD_RUNNING state to stop.  Other states
   2591      * indicate the code is either running natively or sleeping quietly.
   2592      * Any attempt to transition back to THREAD_RUNNING will cause a check
   2593      * for suspension, so it should be impossible for anything to execute
   2594      * interpreted code or modify objects (assuming native code plays nicely).
   2595      *
   2596      * It's also okay if the thread transitions to a non-RUNNING state.
   2597      *
   2598      * Note we released the threadSuspendCountLock before getting here,
   2599      * so if another thread is fiddling with its suspend count (perhaps
   2600      * self-suspending for the debugger) it won't block while we're waiting
   2601      * in here.
   2602      */
   2603     for (thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   2604         if (thread == self)
   2605             continue;
   2606 
   2607         /* debugger events don't suspend JDWP thread */
   2608         if ((why == SUSPEND_FOR_DEBUG || why == SUSPEND_FOR_DEBUG_EVENT) &&
   2609             thread->handle == dvmJdwpGetDebugThread(gDvm.jdwpState))
   2610             continue;
   2611 
   2612         /* wait for the other thread to see the pending suspend */
   2613         waitForThreadSuspend(self, thread);
   2614 
   2615         LOG_THREAD("threadid=%d:   threadid=%d status=%d sc=%d dc=%d",
   2616             self->threadId, thread->threadId, thread->status,
   2617             thread->suspendCount, thread->dbgSuspendCount);
   2618     }
   2619 
   2620     dvmUnlockThreadList();
   2621     unlockThreadSuspend();
   2622 
   2623     LOG_THREAD("threadid=%d: SuspendAll complete", self->threadId);
   2624 }
   2625 
   2626 /*
   2627  * Resume all threads that are currently suspended.
   2628  *
   2629  * The "why" must match with the previous suspend.
   2630  */
   2631 void dvmResumeAllThreads(SuspendCause why)
   2632 {
   2633     Thread* self = dvmThreadSelf();
   2634     Thread* thread;
   2635 
   2636     lockThreadSuspend("res-all", why);  /* one suspend/resume at a time */
   2637     LOG_THREAD("threadid=%d: ResumeAll starting", self->threadId);
   2638 
   2639     /*
   2640      * Decrement the suspend counts for all threads.  No need for atomic
   2641      * writes, since nobody should be moving until we decrement the count.
   2642      * We do need to hold the thread list because of JNI attaches.
   2643      */
   2644     dvmLockThreadList(self);
   2645     lockThreadSuspendCount();
   2646     for (thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   2647         if (thread == self)
   2648             continue;
   2649 
   2650         /* debugger events don't suspend JDWP thread */
   2651         if ((why == SUSPEND_FOR_DEBUG || why == SUSPEND_FOR_DEBUG_EVENT) &&
   2652             thread->handle == dvmJdwpGetDebugThread(gDvm.jdwpState))
   2653         {
   2654             continue;
   2655         }
   2656 
   2657         if (thread->suspendCount > 0) {
   2658             dvmAddToSuspendCounts(thread, -1,
   2659                                   (why == SUSPEND_FOR_DEBUG ||
   2660                                   why == SUSPEND_FOR_DEBUG_EVENT)
   2661                                   ? -1 : 0);
   2662         } else {
   2663             LOG_THREAD("threadid=%d:  suspendCount already zero",
   2664                 thread->threadId);
   2665         }
   2666     }
   2667     unlockThreadSuspendCount();
   2668     dvmUnlockThreadList();
   2669 
   2670     /*
   2671      * In some ways it makes sense to continue to hold the thread-suspend
   2672      * lock while we issue the wakeup broadcast.  It allows us to complete
   2673      * one operation before moving on to the next, which simplifies the
   2674      * thread activity debug traces.
   2675      *
   2676      * This approach caused us some difficulty under Linux, because the
   2677      * condition variable broadcast not only made the threads runnable,
   2678      * but actually caused them to execute, and it was a while before
   2679      * the thread performing the wakeup had an opportunity to release the
   2680      * thread-suspend lock.
   2681      *
   2682      * This is a problem because, when a thread tries to acquire that
   2683      * lock, it times out after 3 seconds.  If at some point the thread
   2684      * is told to suspend, the clock resets; but since the VM is still
   2685      * theoretically mid-resume, there's no suspend pending.  If, for
   2686      * example, the GC was waking threads up while the SIGQUIT handler
   2687      * was trying to acquire the lock, we would occasionally time out on
   2688      * a busy system and SignalCatcher would abort.
   2689      *
   2690      * We now perform the unlock before the wakeup broadcast.  The next
   2691      * suspend can't actually start until the broadcast completes and
   2692      * returns, because we're holding the thread-suspend-count lock, but the
   2693      * suspending thread is now able to make progress and we avoid the abort.
   2694      *
   2695      * (Technically there is a narrow window between when we release
   2696      * the thread-suspend lock and grab the thread-suspend-count lock.
   2697      * This could cause us to send a broadcast to threads with nonzero
   2698      * suspend counts, but this is expected and they'll all just fall
   2699      * right back to sleep.  It's probably safe to grab the suspend-count
   2700      * lock before releasing thread-suspend, since we're still following
   2701      * the correct order of acquisition, but it feels weird.)
   2702      */
   2703 
   2704     LOG_THREAD("threadid=%d: ResumeAll waking others", self->threadId);
   2705     unlockThreadSuspend();
   2706 
   2707     /*
   2708      * Broadcast a notification to all suspended threads, some or all of
   2709      * which may choose to wake up.  No need to wait for them.
   2710      */
   2711     lockThreadSuspendCount();
   2712     int cc = pthread_cond_broadcast(&gDvm.threadSuspendCountCond);
   2713     if (cc != 0) {
   2714         ALOGE("pthread_cond_broadcast(&gDvm.threadSuspendCountCond) failed: %s", strerror(cc));
   2715         dvmAbort();
   2716     }
   2717     unlockThreadSuspendCount();
   2718 
   2719     LOG_THREAD("threadid=%d: ResumeAll complete", self->threadId);
   2720 }
   2721 
   2722 /*
   2723  * Undo any debugger suspensions.  This is called when the debugger
   2724  * disconnects.
   2725  */
   2726 void dvmUndoDebuggerSuspensions()
   2727 {
   2728     Thread* self = dvmThreadSelf();
   2729     Thread* thread;
   2730 
   2731     lockThreadSuspend("undo", SUSPEND_FOR_DEBUG);
   2732     LOG_THREAD("threadid=%d: UndoDebuggerSusp starting", self->threadId);
   2733 
   2734     /*
   2735      * Decrement the suspend counts for all threads.  No need for atomic
   2736      * writes, since nobody should be moving until we decrement the count.
   2737      * We do need to hold the thread list because of JNI attaches.
   2738      */
   2739     dvmLockThreadList(self);
   2740     lockThreadSuspendCount();
   2741     for (thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   2742         if (thread == self)
   2743             continue;
   2744 
   2745         /* debugger events don't suspend JDWP thread */
   2746         if (thread->handle == dvmJdwpGetDebugThread(gDvm.jdwpState)) {
   2747             assert(thread->dbgSuspendCount == 0);
   2748             continue;
   2749         }
   2750 
   2751         assert(thread->suspendCount >= thread->dbgSuspendCount);
   2752         dvmAddToSuspendCounts(thread, -thread->dbgSuspendCount,
   2753                               -thread->dbgSuspendCount);
   2754     }
   2755     unlockThreadSuspendCount();
   2756     dvmUnlockThreadList();
   2757 
   2758     /*
   2759      * Broadcast a notification to all suspended threads, some or all of
   2760      * which may choose to wake up.  No need to wait for them.
   2761      */
   2762     lockThreadSuspendCount();
   2763     int cc = pthread_cond_broadcast(&gDvm.threadSuspendCountCond);
   2764     if (cc != 0) {
   2765         ALOGE("pthread_cond_broadcast(&gDvm.threadSuspendCountCond) failed: %s", strerror(cc));
   2766         dvmAbort();
   2767     }
   2768     unlockThreadSuspendCount();
   2769 
   2770     unlockThreadSuspend();
   2771 
   2772     LOG_THREAD("threadid=%d: UndoDebuggerSusp complete", self->threadId);
   2773 }
   2774 
   2775 /*
   2776  * Determine if a thread is suspended.
   2777  *
   2778  * As with all operations on foreign threads, the caller should hold
   2779  * the thread list lock before calling.
   2780  *
   2781  * If the thread is suspending or waking, these fields could be changing
   2782  * out from under us (or the thread could change state right after we
   2783  * examine it), making this generally unreliable.  This is chiefly
   2784  * intended for use by the debugger.
   2785  */
   2786 bool dvmIsSuspended(const Thread* thread)
   2787 {
   2788     /*
   2789      * The thread could be:
   2790      *  (1) Running happily.  status is RUNNING, suspendCount is zero.
   2791      *      Return "false".
   2792      *  (2) Pending suspend.  status is RUNNING, suspendCount is nonzero.
   2793      *      Return "false".
   2794      *  (3) Suspended.  suspendCount is nonzero, and status is !RUNNING.
   2795      *      Return "true".
   2796      *  (4) Waking up.  suspendCount is zero, status is SUSPENDED
   2797      *      Return "false" (since it could change out from under us, unless
   2798      *      we hold suspendCountLock).
   2799      */
   2800 
   2801     return (thread->suspendCount != 0 &&
   2802             thread->status != THREAD_RUNNING);
   2803 }
   2804 
   2805 /*
   2806  * Wait until another thread self-suspends.  This is specifically for
   2807  * synchronization between the JDWP thread and a thread that has decided
   2808  * to suspend itself after sending an event to the debugger.
   2809  *
   2810  * Threads that encounter "suspend all" events work as well -- the thread
   2811  * in question suspends everybody else and then itself.
   2812  *
   2813  * We can't hold a thread lock here or in the caller, because we could
   2814  * get here just before the to-be-waited-for-thread issues a "suspend all".
   2815  * There's an opportunity for badness if the thread we're waiting for exits
   2816  * and gets cleaned up, but since the thread in question is processing a
   2817  * debugger event, that's not really a possibility.  (To avoid deadlock,
   2818  * it's important that we not be in THREAD_RUNNING while we wait.)
   2819  */
   2820 void dvmWaitForSuspend(Thread* thread)
   2821 {
   2822     Thread* self = dvmThreadSelf();
   2823 
   2824     LOG_THREAD("threadid=%d: waiting for threadid=%d to sleep",
   2825         self->threadId, thread->threadId);
   2826 
   2827     assert(thread->handle != dvmJdwpGetDebugThread(gDvm.jdwpState));
   2828     assert(thread != self);
   2829     assert(self->status != THREAD_RUNNING);
   2830 
   2831     waitForThreadSuspend(self, thread);
   2832 
   2833     LOG_THREAD("threadid=%d: threadid=%d is now asleep",
   2834         self->threadId, thread->threadId);
   2835 }
   2836 
   2837 /*
   2838  * Check to see if we need to suspend ourselves.  If so, go to sleep on
   2839  * a condition variable.
   2840  *
   2841  * Returns "true" if we suspended ourselves.
   2842  */
   2843 static bool fullSuspendCheck(Thread* self)
   2844 {
   2845     assert(self != NULL);
   2846     assert(self->suspendCount >= 0);
   2847 
   2848     /*
   2849      * Grab gDvm.threadSuspendCountLock.  This gives us exclusive write
   2850      * access to self->suspendCount.
   2851      */
   2852     lockThreadSuspendCount();   /* grab gDvm.threadSuspendCountLock */
   2853 
   2854     bool needSuspend = (self->suspendCount != 0);
   2855     if (needSuspend) {
   2856         LOG_THREAD("threadid=%d: self-suspending", self->threadId);
   2857         ThreadStatus oldStatus = self->status;      /* should be RUNNING */
   2858         self->status = THREAD_SUSPENDED;
   2859 
   2860         ATRACE_BEGIN("DVM Suspend");
   2861         while (self->suspendCount != 0) {
   2862             /*
   2863              * Wait for wakeup signal, releasing lock.  The act of releasing
   2864              * and re-acquiring the lock provides the memory barriers we
   2865              * need for correct behavior on SMP.
   2866              */
   2867             dvmWaitCond(&gDvm.threadSuspendCountCond,
   2868                     &gDvm.threadSuspendCountLock);
   2869         }
   2870         ATRACE_END();
   2871         assert(self->suspendCount == 0 && self->dbgSuspendCount == 0);
   2872         self->status = oldStatus;
   2873         LOG_THREAD("threadid=%d: self-reviving, status=%d",
   2874             self->threadId, self->status);
   2875     }
   2876 
   2877     unlockThreadSuspendCount();
   2878 
   2879     return needSuspend;
   2880 }
   2881 
   2882 /*
   2883  * Check to see if a suspend is pending.  If so, suspend the current
   2884  * thread, and return "true" after we have been resumed.
   2885  */
   2886 bool dvmCheckSuspendPending(Thread* self)
   2887 {
   2888     assert(self != NULL);
   2889     if (self->suspendCount == 0) {
   2890         return false;
   2891     } else {
   2892         return fullSuspendCheck(self);
   2893     }
   2894 }
   2895 
   2896 /*
   2897  * Update our status.
   2898  *
   2899  * The "self" argument, which may be NULL, is accepted as an optimization.
   2900  *
   2901  * Returns the old status.
   2902  */
   2903 ThreadStatus dvmChangeStatus(Thread* self, ThreadStatus newStatus)
   2904 {
   2905     ThreadStatus oldStatus;
   2906 
   2907     if (self == NULL)
   2908         self = dvmThreadSelf();
   2909 
   2910     LOGVV("threadid=%d: (status %d -> %d)",
   2911         self->threadId, self->status, newStatus);
   2912 
   2913     oldStatus = self->status;
   2914     if (oldStatus == newStatus)
   2915         return oldStatus;
   2916 
   2917     if (newStatus == THREAD_RUNNING) {
   2918         /*
   2919          * Change our status to THREAD_RUNNING.  The transition requires
   2920          * that we check for pending suspension, because the VM considers
   2921          * us to be "asleep" in all other states, and another thread could
   2922          * be performing a GC now.
   2923          *
   2924          * The order of operations is very significant here.  One way to
   2925          * do this wrong is:
   2926          *
   2927          *   GCing thread                   Our thread (in NATIVE)
   2928          *   ------------                   ----------------------
   2929          *                                  check suspend count (== 0)
   2930          *   dvmSuspendAllThreads()
   2931          *   grab suspend-count lock
   2932          *   increment all suspend counts
   2933          *   release suspend-count lock
   2934          *   check thread state (== NATIVE)
   2935          *   all are suspended, begin GC
   2936          *                                  set state to RUNNING
   2937          *                                  (continue executing)
   2938          *
   2939          * We can correct this by grabbing the suspend-count lock and
   2940          * performing both of our operations (check suspend count, set
   2941          * state) while holding it, now we need to grab a mutex on every
   2942          * transition to RUNNING.
   2943          *
   2944          * What we do instead is change the order of operations so that
   2945          * the transition to RUNNING happens first.  If we then detect
   2946          * that the suspend count is nonzero, we switch to SUSPENDED.
   2947          *
   2948          * Appropriate compiler and memory barriers are required to ensure
   2949          * that the operations are observed in the expected order.
   2950          *
   2951          * This does create a small window of opportunity where a GC in
   2952          * progress could observe what appears to be a running thread (if
   2953          * it happens to look between when we set to RUNNING and when we
   2954          * switch to SUSPENDED).  At worst this only affects assertions
   2955          * and thread logging.  (We could work around it with some sort
   2956          * of intermediate "pre-running" state that is generally treated
   2957          * as equivalent to running, but that doesn't seem worthwhile.)
   2958          *
   2959          * We can also solve this by combining the "status" and "suspend
   2960          * count" fields into a single 32-bit value.  This trades the
   2961          * store/load barrier on transition to RUNNING for an atomic RMW
   2962          * op on all transitions and all suspend count updates (also, all
   2963          * accesses to status or the thread count require bit-fiddling).
   2964          * It also eliminates the brief transition through RUNNING when
   2965          * the thread is supposed to be suspended.  This is possibly faster
   2966          * on SMP and slightly more correct, but less convenient.
   2967          */
   2968         volatile void* raw = reinterpret_cast<volatile void*>(&self->status);
   2969         volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw);
   2970         android_atomic_acquire_store(newStatus, addr);
   2971         if (self->suspendCount != 0) {
   2972             fullSuspendCheck(self);
   2973         }
   2974     } else {
   2975         /*
   2976          * Not changing to THREAD_RUNNING.  No additional work required.
   2977          *
   2978          * We use a releasing store to ensure that, if we were RUNNING,
   2979          * any updates we previously made to objects on the managed heap
   2980          * will be observed before the state change.
   2981          */
   2982         assert(newStatus != THREAD_SUSPENDED);
   2983         volatile void* raw = reinterpret_cast<volatile void*>(&self->status);
   2984         volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw);
   2985         android_atomic_release_store(newStatus, addr);
   2986     }
   2987 
   2988     return oldStatus;
   2989 }
   2990 
   2991 /*
   2992  * Get a statically defined thread group from a field in the ThreadGroup
   2993  * Class object.  Expected arguments are "mMain" and "mSystem".
   2994  */
   2995 static Object* getStaticThreadGroup(const char* fieldName)
   2996 {
   2997     StaticField* groupField;
   2998     Object* groupObj;
   2999 
   3000     groupField = dvmFindStaticField(gDvm.classJavaLangThreadGroup,
   3001         fieldName, "Ljava/lang/ThreadGroup;");
   3002     if (groupField == NULL) {
   3003         ALOGE("java.lang.ThreadGroup does not have an '%s' field", fieldName);
   3004         dvmThrowInternalError("bad definition for ThreadGroup");
   3005         return NULL;
   3006     }
   3007     groupObj = dvmGetStaticFieldObject(groupField);
   3008     if (groupObj == NULL) {
   3009         ALOGE("java.lang.ThreadGroup.%s not initialized", fieldName);
   3010         dvmThrowInternalError(NULL);
   3011         return NULL;
   3012     }
   3013 
   3014     return groupObj;
   3015 }
   3016 Object* dvmGetSystemThreadGroup()
   3017 {
   3018     return getStaticThreadGroup("mSystem");
   3019 }
   3020 Object* dvmGetMainThreadGroup()
   3021 {
   3022     return getStaticThreadGroup("mMain");
   3023 }
   3024 
   3025 /*
   3026  * Given a VMThread object, return the associated Thread*.
   3027  *
   3028  * NOTE: if the thread detaches, the struct Thread will disappear, and
   3029  * we will be touching invalid data.  For safety, lock the thread list
   3030  * before calling this.
   3031  */
   3032 Thread* dvmGetThreadFromThreadObject(Object* vmThreadObj)
   3033 {
   3034     int vmData;
   3035 
   3036     vmData = dvmGetFieldInt(vmThreadObj, gDvm.offJavaLangVMThread_vmData);
   3037 
   3038     if (false) {
   3039         Thread* thread = gDvm.threadList;
   3040         while (thread != NULL) {
   3041             if ((Thread*)vmData == thread)
   3042                 break;
   3043 
   3044             thread = thread->next;
   3045         }
   3046 
   3047         if (thread == NULL) {
   3048             ALOGW("WARNING: vmThreadObj=%p has thread=%p, not in thread list",
   3049                 vmThreadObj, (Thread*)vmData);
   3050             vmData = 0;
   3051         }
   3052     }
   3053 
   3054     return (Thread*) vmData;
   3055 }
   3056 
   3057 /*
   3058  * Given a pthread handle, return the associated Thread*.
   3059  * Caller must hold the thread list lock.
   3060  *
   3061  * Returns NULL if the thread was not found.
   3062  */
   3063 Thread* dvmGetThreadByHandle(pthread_t handle)
   3064 {
   3065     Thread* thread;
   3066     for (thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   3067         if (thread->handle == handle)
   3068             break;
   3069     }
   3070     return thread;
   3071 }
   3072 
   3073 /*
   3074  * Given a threadId, return the associated Thread*.
   3075  * Caller must hold the thread list lock.
   3076  *
   3077  * Returns NULL if the thread was not found.
   3078  */
   3079 Thread* dvmGetThreadByThreadId(u4 threadId)
   3080 {
   3081     Thread* thread;
   3082     for (thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   3083         if (thread->threadId == threadId)
   3084             break;
   3085     }
   3086     return thread;
   3087 }
   3088 
   3089 void dvmChangeThreadPriority(Thread* thread, int newPriority)
   3090 {
   3091     os_changeThreadPriority(thread, newPriority);
   3092 }
   3093 
   3094 /*
   3095  * Return true if the thread is on gDvm.threadList.
   3096  * Caller should not hold gDvm.threadListLock.
   3097  */
   3098 bool dvmIsOnThreadList(const Thread* thread)
   3099 {
   3100     bool ret = false;
   3101 
   3102     dvmLockThreadList(NULL);
   3103     if (thread == gDvm.threadList) {
   3104         ret = true;
   3105     } else {
   3106         ret = thread->prev != NULL || thread->next != NULL;
   3107     }
   3108     dvmUnlockThreadList();
   3109 
   3110     return ret;
   3111 }
   3112 
   3113 /*
   3114  * Dump a thread to the log file -- just calls dvmDumpThreadEx() with an
   3115  * output target.
   3116  */
   3117 void dvmDumpThread(Thread* thread, bool isRunning)
   3118 {
   3119     DebugOutputTarget target;
   3120 
   3121     dvmCreateLogOutputTarget(&target, ANDROID_LOG_INFO, LOG_TAG);
   3122     dvmDumpThreadEx(&target, thread, isRunning);
   3123 }
   3124 
   3125 /*
   3126  * Try to get the scheduler group.
   3127  *
   3128  * The data from /proc/<pid>/cgroup looks (something) like:
   3129  *  2:cpu:/bg_non_interactive
   3130  *  1:cpuacct:/
   3131  *
   3132  * We return the part on the "cpu" line after the '/', which will be an
   3133  * empty string for the default cgroup.  If the string is longer than
   3134  * "bufLen", the string will be truncated.
   3135  *
   3136  * On error, -1 is returned, and an error description will be stored in
   3137  * the buffer.
   3138  */
   3139 static int getSchedulerGroup(int tid, char* buf, size_t bufLen)
   3140 {
   3141 #ifdef HAVE_ANDROID_OS
   3142     char pathBuf[32];
   3143     char lineBuf[256];
   3144     FILE *fp;
   3145 
   3146     snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
   3147     if ((fp = fopen(pathBuf, "r")) == NULL) {
   3148         snprintf(buf, bufLen, "[fopen-error:%d]", errno);
   3149         return -1;
   3150     }
   3151 
   3152     while (fgets(lineBuf, sizeof(lineBuf) -1, fp) != NULL) {
   3153         char* subsys;
   3154         char* grp;
   3155         size_t len;
   3156 
   3157         /* Junk the first field */
   3158         subsys = strchr(lineBuf, ':');
   3159         if (subsys == NULL) {
   3160             goto out_bad_data;
   3161         }
   3162 
   3163         if (strncmp(subsys, ":cpu:", 5) != 0) {
   3164             /* Not the subsys we're looking for */
   3165             continue;
   3166         }
   3167 
   3168         grp = strchr(subsys, '/');
   3169         if (grp == NULL) {
   3170             goto out_bad_data;
   3171         }
   3172         grp++; /* Drop the leading '/' */
   3173 
   3174         len = strlen(grp);
   3175         grp[len-1] = '\0'; /* Drop the trailing '\n' */
   3176 
   3177         if (bufLen <= len) {
   3178             len = bufLen - 1;
   3179         }
   3180         strncpy(buf, grp, len);
   3181         buf[len] = '\0';
   3182         fclose(fp);
   3183         return 0;
   3184     }
   3185 
   3186     snprintf(buf, bufLen, "[no-cpu-subsys]");
   3187     fclose(fp);
   3188     return -1;
   3189 
   3190 out_bad_data:
   3191     ALOGE("Bad cgroup data {%s}", lineBuf);
   3192     snprintf(buf, bufLen, "[data-parse-failed]");
   3193     fclose(fp);
   3194     return -1;
   3195 
   3196 #else
   3197     snprintf(buf, bufLen, "[n/a]");
   3198     return -1;
   3199 #endif
   3200 }
   3201 
   3202 /*
   3203  * Convert ThreadStatus to a string.
   3204  */
   3205 const char* dvmGetThreadStatusStr(ThreadStatus status)
   3206 {
   3207     switch (status) {
   3208     case THREAD_ZOMBIE:         return "ZOMBIE";
   3209     case THREAD_RUNNING:        return "RUNNABLE";
   3210     case THREAD_TIMED_WAIT:     return "TIMED_WAIT";
   3211     case THREAD_MONITOR:        return "MONITOR";
   3212     case THREAD_WAIT:           return "WAIT";
   3213     case THREAD_INITIALIZING:   return "INITIALIZING";
   3214     case THREAD_STARTING:       return "STARTING";
   3215     case THREAD_NATIVE:         return "NATIVE";
   3216     case THREAD_VMWAIT:         return "VMWAIT";
   3217     case THREAD_SUSPENDED:      return "SUSPENDED";
   3218     default:                    return "UNKNOWN";
   3219     }
   3220 }
   3221 
   3222 static void dumpSchedStat(const DebugOutputTarget* target, pid_t tid) {
   3223 #ifdef HAVE_ANDROID_OS
   3224     /* get some bits from /proc/self/stat */
   3225     ProcStatData procStatData;
   3226     if (!dvmGetThreadStats(&procStatData, tid)) {
   3227         /* failed, use zeroed values */
   3228         memset(&procStatData, 0, sizeof(procStatData));
   3229     }
   3230 
   3231     /* grab the scheduler stats for this thread */
   3232     char schedstatBuf[64];
   3233     snprintf(schedstatBuf, sizeof(schedstatBuf), "/proc/self/task/%d/schedstat", tid);
   3234     int schedstatFd = open(schedstatBuf, O_RDONLY);
   3235     strcpy(schedstatBuf, "0 0 0");          /* show this if open/read fails */
   3236     if (schedstatFd >= 0) {
   3237         ssize_t bytes;
   3238         bytes = read(schedstatFd, schedstatBuf, sizeof(schedstatBuf) - 1);
   3239         close(schedstatFd);
   3240         if (bytes >= 1) {
   3241             schedstatBuf[bytes - 1] = '\0';   /* remove trailing newline */
   3242         }
   3243     }
   3244 
   3245     /* show what we got */
   3246     dvmPrintDebugMessage(target,
   3247         "  | state=%c schedstat=( %s ) utm=%lu stm=%lu core=%d\n",
   3248         procStatData.state, schedstatBuf, procStatData.utime,
   3249         procStatData.stime, procStatData.processor);
   3250 #endif
   3251 }
   3252 
   3253 struct SchedulerStats {
   3254     int policy;
   3255     int priority;
   3256     char group[32];
   3257 };
   3258 
   3259 /*
   3260  * Get scheduler statistics.
   3261  */
   3262 static void getSchedulerStats(SchedulerStats* stats, pid_t tid) {
   3263     struct sched_param sp;
   3264     if (pthread_getschedparam(pthread_self(), &stats->policy, &sp) != 0) {
   3265         ALOGW("Warning: pthread_getschedparam failed");
   3266         stats->policy = -1;
   3267         stats->priority = -1;
   3268     } else {
   3269         stats->priority = sp.sched_priority;
   3270     }
   3271     if (getSchedulerGroup(tid, stats->group, sizeof(stats->group)) == 0 &&
   3272             stats->group[0] == '\0') {
   3273         strcpy(stats->group, "default");
   3274     }
   3275 }
   3276 
   3277 static bool shouldShowNativeStack(Thread* thread) {
   3278     // In native code somewhere in the VM? That's interesting.
   3279     if (thread->status == THREAD_VMWAIT) {
   3280         return true;
   3281     }
   3282 
   3283     // In an Object.wait variant? That's not interesting.
   3284     if (thread->status == THREAD_TIMED_WAIT || thread->status == THREAD_WAIT) {
   3285         return false;
   3286     }
   3287 
   3288     // The Signal Catcher thread? That's not interesting.
   3289     if (thread->status == THREAD_RUNNING) {
   3290         return false;
   3291     }
   3292 
   3293     // In some other native method? That's interesting.
   3294     // We don't just check THREAD_NATIVE because native methods will be in
   3295     // state THREAD_SUSPENDED if they're calling back into the VM, or THREAD_MONITOR
   3296     // if they're blocked on a monitor, or one of the thread-startup states if
   3297     // it's early enough in their life cycle (http://b/7432159).
   3298     u4* fp = thread->interpSave.curFrame;
   3299     if (fp == NULL) {
   3300         // The thread has no managed frames, so native frames are all there is.
   3301         return true;
   3302     }
   3303     const Method* currentMethod = SAVEAREA_FROM_FP(fp)->method;
   3304     return currentMethod != NULL && dvmIsNativeMethod(currentMethod);
   3305 }
   3306 
   3307 /*
   3308  * Print information about the specified thread.
   3309  *
   3310  * Works best when the thread in question is "self" or has been suspended.
   3311  * When dumping a separate thread that's still running, set "isRunning" to
   3312  * use a more cautious thread dump function.
   3313  */
   3314 void dvmDumpThreadEx(const DebugOutputTarget* target, Thread* thread,
   3315     bool isRunning)
   3316 {
   3317     Object* threadObj;
   3318     Object* groupObj;
   3319     StringObject* nameStr;
   3320     char* threadName = NULL;
   3321     char* groupName = NULL;
   3322     bool isDaemon;
   3323     int priority;               // java.lang.Thread priority
   3324 
   3325     /*
   3326      * Get the java.lang.Thread object.  This function gets called from
   3327      * some weird debug contexts, so it's possible that there's a GC in
   3328      * progress on some other thread.  To decrease the chances of the
   3329      * thread object being moved out from under us, we add the reference
   3330      * to the tracked allocation list, which pins it in place.
   3331      *
   3332      * If threadObj is NULL, the thread is still in the process of being
   3333      * attached to the VM, and there's really nothing interesting to
   3334      * say about it yet.
   3335      */
   3336     threadObj = thread->threadObj;
   3337     if (threadObj == NULL) {
   3338         ALOGI("Can't dump thread %d: threadObj not set", thread->threadId);
   3339         return;
   3340     }
   3341     dvmAddTrackedAlloc(threadObj, NULL);
   3342 
   3343     nameStr = (StringObject*) dvmGetFieldObject(threadObj,
   3344                 gDvm.offJavaLangThread_name);
   3345     threadName = dvmCreateCstrFromString(nameStr);
   3346 
   3347     priority = dvmGetFieldInt(threadObj, gDvm.offJavaLangThread_priority);
   3348     isDaemon = dvmGetFieldBoolean(threadObj, gDvm.offJavaLangThread_daemon);
   3349 
   3350     /* a null value for group is not expected, but deal with it anyway */
   3351     groupObj = (Object*) dvmGetFieldObject(threadObj,
   3352                 gDvm.offJavaLangThread_group);
   3353     if (groupObj != NULL) {
   3354         nameStr = (StringObject*)
   3355             dvmGetFieldObject(groupObj, gDvm.offJavaLangThreadGroup_name);
   3356         groupName = dvmCreateCstrFromString(nameStr);
   3357     }
   3358     if (groupName == NULL)
   3359         groupName = strdup("(null; initializing?)");
   3360 
   3361     SchedulerStats schedStats;
   3362     getSchedulerStats(&schedStats, thread->systemTid);
   3363 
   3364     dvmPrintDebugMessage(target,
   3365         "\"%s\"%s prio=%d tid=%d %s%s\n",
   3366         threadName, isDaemon ? " daemon" : "",
   3367         priority, thread->threadId, dvmGetThreadStatusStr(thread->status),
   3368 #if defined(WITH_JIT)
   3369         thread->inJitCodeCache ? " JIT" : ""
   3370 #else
   3371         ""
   3372 #endif
   3373         );
   3374     dvmPrintDebugMessage(target,
   3375         "  | group=\"%s\" sCount=%d dsCount=%d obj=%p self=%p\n",
   3376         groupName, thread->suspendCount, thread->dbgSuspendCount,
   3377         thread->threadObj, thread);
   3378     dvmPrintDebugMessage(target,
   3379         "  | sysTid=%d nice=%d sched=%d/%d cgrp=%s handle=%d\n",
   3380         thread->systemTid, getpriority(PRIO_PROCESS, thread->systemTid),
   3381         schedStats.policy, schedStats.priority, schedStats.group, (int)thread->handle);
   3382 
   3383     dumpSchedStat(target, thread->systemTid);
   3384 
   3385     if (shouldShowNativeStack(thread)) {
   3386         dvmDumpNativeStack(target, thread->systemTid);
   3387     }
   3388 
   3389     if (isRunning)
   3390         dvmDumpRunningThreadStack(target, thread);
   3391     else
   3392         dvmDumpThreadStack(target, thread);
   3393 
   3394     dvmPrintDebugMessage(target, "\n");
   3395 
   3396     dvmReleaseTrackedAlloc(threadObj, NULL);
   3397     free(threadName);
   3398     free(groupName);
   3399 }
   3400 
   3401 std::string dvmGetThreadName(Thread* thread) {
   3402     if (thread->threadObj == NULL) {
   3403         ALOGW("threadObj is NULL, name not available");
   3404         return "-unknown-";
   3405     }
   3406 
   3407     StringObject* nameObj = (StringObject*)
   3408         dvmGetFieldObject(thread->threadObj, gDvm.offJavaLangThread_name);
   3409     char* name = dvmCreateCstrFromString(nameObj);
   3410     std::string result(name);
   3411     free(name);
   3412     return result;
   3413 }
   3414 
   3415 #ifdef HAVE_ANDROID_OS
   3416 /*
   3417  * Dumps information about a non-Dalvik thread.
   3418  */
   3419 static void dumpNativeThread(const DebugOutputTarget* target, pid_t tid) {
   3420     char path[64];
   3421     snprintf(path, sizeof(path), "/proc/%d/comm", tid);
   3422 
   3423     int fd = open(path, O_RDONLY);
   3424     char name[64];
   3425     ssize_t n = 0;
   3426     if (fd >= 0) {
   3427         n = read(fd, name, sizeof(name) - 1);
   3428         close(fd);
   3429     }
   3430     if (n > 0 && name[n - 1] == '\n') {
   3431         n -= 1;
   3432     }
   3433     if (n <= 0) {
   3434         strcpy(name, "<no name>");
   3435     } else {
   3436         name[n] = '\0';
   3437     }
   3438 
   3439     SchedulerStats schedStats;
   3440     getSchedulerStats(&schedStats, tid);
   3441 
   3442     dvmPrintDebugMessage(target,
   3443         "\"%s\" sysTid=%d nice=%d sched=%d/%d cgrp=%s\n",
   3444         name, tid, getpriority(PRIO_PROCESS, tid),
   3445         schedStats.policy, schedStats.priority, schedStats.group);
   3446     dumpSchedStat(target, tid);
   3447     // Temporarily disabled collecting native stacks from non-Dalvik
   3448     // threads because sometimes they misbehave.
   3449     //dvmDumpNativeStack(target, tid);
   3450 
   3451     dvmPrintDebugMessage(target, "\n");
   3452 }
   3453 
   3454 /*
   3455  * Returns true if the specified tid is a Dalvik thread.
   3456  * Assumes the thread list lock is held.
   3457  */
   3458 static bool isDalvikThread(pid_t tid) {
   3459     for (Thread* thread = gDvm.threadList; thread != NULL; thread = thread->next) {
   3460         if (thread->systemTid == tid) {
   3461             return true;
   3462         }
   3463     }
   3464     return false;
   3465 }
   3466 #endif
   3467 
   3468 /*
   3469  * Dump all threads to the log file -- just calls dvmDumpAllThreadsEx() with
   3470  * an output target.
   3471  */
   3472 void dvmDumpAllThreads(bool grabLock)
   3473 {
   3474     DebugOutputTarget target;
   3475 
   3476     dvmCreateLogOutputTarget(&target, ANDROID_LOG_INFO, LOG_TAG);
   3477     dvmDumpAllThreadsEx(&target, grabLock);
   3478 }
   3479 
   3480 /*
   3481  * Print information about all known threads.  Assumes they have been
   3482  * suspended (or are in a non-interpreting state, e.g. WAIT or NATIVE).
   3483  *
   3484  * If "grabLock" is true, we grab the thread lock list.  This is important
   3485  * to do unless the caller already holds the lock.
   3486  */
   3487 void dvmDumpAllThreadsEx(const DebugOutputTarget* target, bool grabLock)
   3488 {
   3489     Thread* thread;
   3490 
   3491     dvmPrintDebugMessage(target, "DALVIK THREADS:\n");
   3492 
   3493 #ifdef HAVE_ANDROID_OS
   3494     dvmPrintDebugMessage(target,
   3495         "(mutexes: tll=%x tsl=%x tscl=%x ghl=%x)\n\n",
   3496         gDvm.threadListLock.value,
   3497         gDvm._threadSuspendLock.value,
   3498         gDvm.threadSuspendCountLock.value,
   3499         gDvm.gcHeapLock.value);
   3500 #endif
   3501 
   3502     if (grabLock)
   3503         dvmLockThreadList(dvmThreadSelf());
   3504 
   3505     thread = gDvm.threadList;
   3506     while (thread != NULL) {
   3507         dvmDumpThreadEx(target, thread, false);
   3508 
   3509         /* verify link */
   3510         assert(thread->next == NULL || thread->next->prev == thread);
   3511 
   3512         thread = thread->next;
   3513     }
   3514 
   3515 #ifdef HAVE_ANDROID_OS
   3516     DIR* d = opendir("/proc/self/task");
   3517     if (d != NULL) {
   3518         dirent* entry = NULL;
   3519         bool first = true;
   3520         while ((entry = readdir(d)) != NULL) {
   3521             char* end;
   3522             pid_t tid = strtol(entry->d_name, &end, 10);
   3523             if (!*end && !isDalvikThread(tid)) {
   3524                 if (first) {
   3525                     dvmPrintDebugMessage(target, "NATIVE THREADS:\n");
   3526                     first = false;
   3527                 }
   3528                 dumpNativeThread(target, tid);
   3529             }
   3530         }
   3531         closedir(d);
   3532     }
   3533 #endif
   3534 
   3535     if (grabLock)
   3536         dvmUnlockThreadList();
   3537 }
   3538 
   3539 /*
   3540  * Nuke the target thread from orbit.
   3541  *
   3542  * The idea is to send a "crash" signal to the target thread so that
   3543  * debuggerd will take notice and dump an appropriate stack trace.
   3544  * Because of the way debuggerd works, we have to throw the same signal
   3545  * at it twice.
   3546  *
   3547  * This does not necessarily cause the entire process to stop, but once a
   3548  * thread has been nuked the rest of the system is likely to be unstable.
   3549  * This returns so that some limited set of additional operations may be
   3550  * performed, but it's advisable (and expected) to call dvmAbort soon.
   3551  * (This is NOT a way to simply cancel a thread.)
   3552  */
   3553 void dvmNukeThread(Thread* thread)
   3554 {
   3555     int killResult;
   3556 
   3557     /* suppress the heapworker watchdog to assist anyone using a debugger */
   3558     gDvm.nativeDebuggerActive = true;
   3559 
   3560     /*
   3561      * Send the signals, separated by a brief interval to allow debuggerd
   3562      * to work its magic.  An uncommon signal like SIGFPE or SIGSTKFLT
   3563      * can be used instead of SIGSEGV to avoid making it look like the
   3564      * code actually crashed at the current point of execution.
   3565      *
   3566      * (Observed behavior: with SIGFPE, debuggerd will dump the target
   3567      * thread and then the thread that calls dvmAbort.  With SIGSEGV,
   3568      * you don't get the second stack trace; possibly something in the
   3569      * kernel decides that a signal has already been sent and it's time
   3570      * to just kill the process.  The position in the current thread is
   3571      * generally known, so the second dump is not useful.)
   3572      *
   3573      * The target thread can continue to execute between the two signals.
   3574      * (The first just causes debuggerd to attach to it.)
   3575      */
   3576 #ifdef SIGSTKFLT
   3577 #define SIG SIGSTKFLT
   3578 #define SIGNAME "SIGSTKFLT"
   3579 #elif defined(SIGEMT)
   3580 #define SIG SIGEMT
   3581 #define SIGNAME "SIGEMT"
   3582 #else
   3583 #error No signal available for dvmNukeThread
   3584 #endif
   3585 
   3586     ALOGD("threadid=%d: sending two " SIGNAME "s to threadid=%d (tid=%d) to"
   3587           " cause debuggerd dump",
   3588           dvmThreadSelf()->threadId, thread->threadId, thread->systemTid);
   3589     killResult = pthread_kill(thread->handle, SIG);
   3590     if (killResult != 0) {
   3591         ALOGD("NOTE: pthread_kill #1 failed: %s", strerror(killResult));
   3592     }
   3593     usleep(2 * 1000 * 1000);    // TODO: timed-wait until debuggerd attaches
   3594     killResult = pthread_kill(thread->handle, SIG);
   3595     if (killResult != 0) {
   3596         ALOGD("NOTE: pthread_kill #2 failed: %s", strerror(killResult));
   3597     }
   3598     ALOGD("Sent, pausing to let debuggerd run");
   3599     usleep(8 * 1000 * 1000);    // TODO: timed-wait until debuggerd finishes
   3600 
   3601     /* ignore SIGSEGV so the eventual dmvAbort() doesn't notify debuggerd */
   3602     signal(SIGSEGV, SIG_IGN);
   3603     ALOGD("Continuing");
   3604 }
   3605