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 #include "Dalvik.h"
     18 
     19 #include <fcntl.h>
     20 #include <stdlib.h>
     21 #include <unistd.h>
     22 #include <pthread.h>
     23 #include <time.h>
     24 #include <errno.h>
     25 
     26 /*
     27  * Every Object has a monitor associated with it, but not every Object is
     28  * actually locked.  Even the ones that are locked do not need a
     29  * full-fledged monitor until a) there is actual contention or b) wait()
     30  * is called on the Object.
     31  *
     32  * For Dalvik, we have implemented a scheme similar to the one described
     33  * in Bacon et al.'s "Thin locks: featherweight synchronization for Java"
     34  * (ACM 1998).  Things are even easier for us, though, because we have
     35  * a full 32 bits to work with.
     36  *
     37  * The two states of an Object's lock are referred to as "thin" and
     38  * "fat".  A lock may transition from the "thin" state to the "fat"
     39  * state and this transition is referred to as inflation.  Once a lock
     40  * has been inflated it remains in the "fat" state indefinitely.
     41  *
     42  * The lock value itself is stored in Object.lock.  The LSB of the
     43  * lock encodes its state.  When cleared, the lock is in the "thin"
     44  * state and its bits are formatted as follows:
     45  *
     46  *    [31 ---- 19] [18 ---- 3] [2 ---- 1] [0]
     47  *     lock count   thread id  hash state  0
     48  *
     49  * When set, the lock is in the "fat" state and its bits are formatted
     50  * as follows:
     51  *
     52  *    [31 ---- 3] [2 ---- 1] [0]
     53  *      pointer   hash state  1
     54  *
     55  * For an in-depth description of the mechanics of thin-vs-fat locking,
     56  * read the paper referred to above.
     57  */
     58 
     59 /*
     60  * Monitors provide:
     61  *  - mutually exclusive access to resources
     62  *  - a way for multiple threads to wait for notification
     63  *
     64  * In effect, they fill the role of both mutexes and condition variables.
     65  *
     66  * Only one thread can own the monitor at any time.  There may be several
     67  * threads waiting on it (the wait call unlocks it).  One or more waiting
     68  * threads may be getting interrupted or notified at any given time.
     69  *
     70  * TODO: the various members of monitor are not SMP-safe.
     71  */
     72 struct Monitor {
     73     Thread*     owner;          /* which thread currently owns the lock? */
     74     int         lockCount;      /* owner's recursive lock depth */
     75     Object*     obj;            /* what object are we part of [debug only] */
     76 
     77     Thread*     waitSet;	/* threads currently waiting on this monitor */
     78 
     79     pthread_mutex_t lock;
     80 
     81     Monitor*    next;
     82 
     83     /*
     84      * Who last acquired this monitor, when lock sampling is enabled.
     85      * Even when enabled, ownerMethod may be NULL.
     86      */
     87     const Method* ownerMethod;
     88     u4 ownerPc;
     89 };
     90 
     91 
     92 /*
     93  * Create and initialize a monitor.
     94  */
     95 Monitor* dvmCreateMonitor(Object* obj)
     96 {
     97     Monitor* mon;
     98 
     99     mon = (Monitor*) calloc(1, sizeof(Monitor));
    100     if (mon == NULL) {
    101         ALOGE("Unable to allocate monitor");
    102         dvmAbort();
    103     }
    104     mon->obj = obj;
    105     dvmInitMutex(&mon->lock);
    106 
    107     /* replace the head of the list with the new monitor */
    108     do {
    109         mon->next = gDvm.monitorList;
    110     } while (android_atomic_release_cas((int32_t)mon->next, (int32_t)mon,
    111             (int32_t*)(void*)&gDvm.monitorList) != 0);
    112 
    113     return mon;
    114 }
    115 
    116 /*
    117  * Free the monitor list.  Only used when shutting the VM down.
    118  */
    119 void dvmFreeMonitorList()
    120 {
    121     Monitor* mon;
    122     Monitor* nextMon;
    123 
    124     mon = gDvm.monitorList;
    125     while (mon != NULL) {
    126         nextMon = mon->next;
    127         free(mon);
    128         mon = nextMon;
    129     }
    130 }
    131 
    132 /*
    133  * Get the object that a monitor is part of.
    134  */
    135 Object* dvmGetMonitorObject(Monitor* mon)
    136 {
    137     if (mon == NULL)
    138         return NULL;
    139     else
    140         return mon->obj;
    141 }
    142 
    143 /*
    144  * Returns the thread id of the thread owning the given lock.
    145  */
    146 static u4 lockOwner(Object* obj)
    147 {
    148     Thread *owner;
    149     u4 lock;
    150 
    151     assert(obj != NULL);
    152     /*
    153      * Since we're reading the lock value multiple times, latch it so
    154      * that it doesn't change out from under us if we get preempted.
    155      */
    156     lock = obj->lock;
    157     if (LW_SHAPE(lock) == LW_SHAPE_THIN) {
    158         return LW_LOCK_OWNER(lock);
    159     } else {
    160         owner = LW_MONITOR(lock)->owner;
    161         return owner ? owner->threadId : 0;
    162     }
    163 }
    164 
    165 /*
    166  * Get the thread that holds the lock on the specified object.  The
    167  * object may be unlocked, thin-locked, or fat-locked.
    168  *
    169  * The caller must lock the thread list before calling here.
    170  */
    171 Thread* dvmGetObjectLockHolder(Object* obj)
    172 {
    173     u4 threadId = lockOwner(obj);
    174 
    175     if (threadId == 0)
    176         return NULL;
    177     return dvmGetThreadByThreadId(threadId);
    178 }
    179 
    180 /*
    181  * Checks whether the given thread holds the given
    182  * objects's lock.
    183  */
    184 bool dvmHoldsLock(Thread* thread, Object* obj)
    185 {
    186     if (thread == NULL || obj == NULL) {
    187         return false;
    188     } else {
    189         return thread->threadId == lockOwner(obj);
    190     }
    191 }
    192 
    193 /*
    194  * Free the monitor associated with an object and make the object's lock
    195  * thin again.  This is called during garbage collection.
    196  */
    197 static void freeMonitor(Monitor *mon)
    198 {
    199     assert(mon != NULL);
    200     assert(mon->obj != NULL);
    201     assert(LW_SHAPE(mon->obj->lock) == LW_SHAPE_FAT);
    202 
    203     /* This lock is associated with an object
    204      * that's being swept.  The only possible way
    205      * anyone could be holding this lock would be
    206      * if some JNI code locked but didn't unlock
    207      * the object, in which case we've got some bad
    208      * native code somewhere.
    209      */
    210     assert(pthread_mutex_trylock(&mon->lock) == 0);
    211     assert(pthread_mutex_unlock(&mon->lock) == 0);
    212     dvmDestroyMutex(&mon->lock);
    213     free(mon);
    214 }
    215 
    216 /*
    217  * Frees monitor objects belonging to unmarked objects.
    218  */
    219 void dvmSweepMonitorList(Monitor** mon, int (*isUnmarkedObject)(void*))
    220 {
    221     Monitor handle;
    222     Monitor *prev, *curr;
    223     Object *obj;
    224 
    225     assert(mon != NULL);
    226     assert(isUnmarkedObject != NULL);
    227     prev = &handle;
    228     prev->next = curr = *mon;
    229     while (curr != NULL) {
    230         obj = curr->obj;
    231         if (obj != NULL && (*isUnmarkedObject)(obj) != 0) {
    232             prev->next = curr->next;
    233             freeMonitor(curr);
    234             curr = prev->next;
    235         } else {
    236             prev = curr;
    237             curr = curr->next;
    238         }
    239     }
    240     *mon = handle.next;
    241 }
    242 
    243 static char *logWriteInt(char *dst, int value)
    244 {
    245     *dst++ = EVENT_TYPE_INT;
    246     set4LE((u1 *)dst, value);
    247     return dst + 4;
    248 }
    249 
    250 static char *logWriteString(char *dst, const char *value, size_t len)
    251 {
    252     *dst++ = EVENT_TYPE_STRING;
    253     len = len < 32 ? len : 32;
    254     set4LE((u1 *)dst, len);
    255     dst += 4;
    256     memcpy(dst, value, len);
    257     return dst + len;
    258 }
    259 
    260 #define EVENT_LOG_TAG_dvm_lock_sample 20003
    261 
    262 static void logContentionEvent(Thread *self, u4 waitMs, u4 samplePercent,
    263                                const char *ownerFileName, u4 ownerLineNumber)
    264 {
    265     const StackSaveArea *saveArea;
    266     const Method *meth;
    267     u4 relativePc;
    268     char eventBuffer[174];
    269     const char *fileName;
    270     char procName[33];
    271     char *cp;
    272     size_t len;
    273     int fd;
    274 
    275     /* When a thread is being destroyed it is normal that the frame depth is zero */
    276     if (self->interpSave.curFrame == NULL) {
    277         return;
    278     }
    279 
    280     saveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
    281     meth = saveArea->method;
    282     cp = eventBuffer;
    283 
    284     /* Emit the event list length, 1 byte. */
    285     *cp++ = 9;
    286 
    287     /* Emit the process name, <= 37 bytes. */
    288     fd = open("/proc/self/cmdline", O_RDONLY);
    289     memset(procName, 0, sizeof(procName));
    290     read(fd, procName, sizeof(procName) - 1);
    291     close(fd);
    292     len = strlen(procName);
    293     cp = logWriteString(cp, procName, len);
    294 
    295     /* Emit the sensitive thread ("main thread") status, 5 bytes. */
    296     bool isSensitive = false;
    297     if (gDvm.isSensitiveThreadHook != NULL) {
    298         isSensitive = gDvm.isSensitiveThreadHook();
    299     }
    300     cp = logWriteInt(cp, isSensitive);
    301 
    302     /* Emit self thread name string, <= 37 bytes. */
    303     std::string selfName = dvmGetThreadName(self);
    304     cp = logWriteString(cp, selfName.c_str(), selfName.size());
    305 
    306     /* Emit the wait time, 5 bytes. */
    307     cp = logWriteInt(cp, waitMs);
    308 
    309     /* Emit the source code file name, <= 37 bytes. */
    310     fileName = dvmGetMethodSourceFile(meth);
    311     if (fileName == NULL) fileName = "";
    312     cp = logWriteString(cp, fileName, strlen(fileName));
    313 
    314     /* Emit the source code line number, 5 bytes. */
    315     relativePc = saveArea->xtra.currentPc - saveArea->method->insns;
    316     cp = logWriteInt(cp, dvmLineNumFromPC(meth, relativePc));
    317 
    318     /* Emit the lock owner source code file name, <= 37 bytes. */
    319     if (ownerFileName == NULL) {
    320         ownerFileName = "";
    321     } else if (strcmp(fileName, ownerFileName) == 0) {
    322         /* Common case, so save on log space. */
    323         ownerFileName = "-";
    324     }
    325     cp = logWriteString(cp, ownerFileName, strlen(ownerFileName));
    326 
    327     /* Emit the source code line number, 5 bytes. */
    328     cp = logWriteInt(cp, ownerLineNumber);
    329 
    330     /* Emit the sample percentage, 5 bytes. */
    331     cp = logWriteInt(cp, samplePercent);
    332 
    333     assert((size_t)(cp - eventBuffer) <= sizeof(eventBuffer));
    334     android_btWriteLog(EVENT_LOG_TAG_dvm_lock_sample,
    335                        EVENT_TYPE_LIST,
    336                        eventBuffer,
    337                        (size_t)(cp - eventBuffer));
    338 }
    339 
    340 /*
    341  * Lock a monitor.
    342  */
    343 static void lockMonitor(Thread* self, Monitor* mon)
    344 {
    345     ThreadStatus oldStatus;
    346     u4 waitThreshold, samplePercent;
    347     u8 waitStart, waitEnd, waitMs;
    348 
    349     if (mon->owner == self) {
    350         mon->lockCount++;
    351         return;
    352     }
    353     if (dvmTryLockMutex(&mon->lock) != 0) {
    354         oldStatus = dvmChangeStatus(self, THREAD_MONITOR);
    355         waitThreshold = gDvm.lockProfThreshold;
    356         if (waitThreshold) {
    357             waitStart = dvmGetRelativeTimeUsec();
    358         }
    359 
    360         const Method* currentOwnerMethod = mon->ownerMethod;
    361         u4 currentOwnerPc = mon->ownerPc;
    362 
    363         dvmLockMutex(&mon->lock);
    364         if (waitThreshold) {
    365             waitEnd = dvmGetRelativeTimeUsec();
    366         }
    367         dvmChangeStatus(self, oldStatus);
    368         if (waitThreshold) {
    369             waitMs = (waitEnd - waitStart) / 1000;
    370             if (waitMs >= waitThreshold) {
    371                 samplePercent = 100;
    372             } else {
    373                 samplePercent = 100 * waitMs / waitThreshold;
    374             }
    375             if (samplePercent != 0 && ((u4)rand() % 100 < samplePercent)) {
    376                 const char* currentOwnerFileName = "no_method";
    377                 u4 currentOwnerLineNumber = 0;
    378                 if (currentOwnerMethod != NULL) {
    379                     currentOwnerFileName = dvmGetMethodSourceFile(currentOwnerMethod);
    380                     if (currentOwnerFileName == NULL) {
    381                         currentOwnerFileName = "no_method_file";
    382                     }
    383                     currentOwnerLineNumber = dvmLineNumFromPC(currentOwnerMethod, currentOwnerPc);
    384                 }
    385                 logContentionEvent(self, waitMs, samplePercent,
    386                                    currentOwnerFileName, currentOwnerLineNumber);
    387             }
    388         }
    389     }
    390     mon->owner = self;
    391     assert(mon->lockCount == 0);
    392 
    393     // When debugging, save the current monitor holder for future
    394     // acquisition failures to use in sampled logging.
    395     if (gDvm.lockProfThreshold > 0) {
    396         mon->ownerMethod = NULL;
    397         mon->ownerPc = 0;
    398         if (self->interpSave.curFrame == NULL) {
    399             return;
    400         }
    401         const StackSaveArea* saveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
    402         if (saveArea == NULL) {
    403             return;
    404         }
    405         mon->ownerMethod = saveArea->method;
    406         mon->ownerPc = (saveArea->xtra.currentPc - saveArea->method->insns);
    407     }
    408 }
    409 
    410 /*
    411  * Try to lock a monitor.
    412  *
    413  * Returns "true" on success.
    414  */
    415 #ifdef WITH_COPYING_GC
    416 static bool tryLockMonitor(Thread* self, Monitor* mon)
    417 {
    418     if (mon->owner == self) {
    419         mon->lockCount++;
    420         return true;
    421     } else {
    422         if (dvmTryLockMutex(&mon->lock) == 0) {
    423             mon->owner = self;
    424             assert(mon->lockCount == 0);
    425             return true;
    426         } else {
    427             return false;
    428         }
    429     }
    430 }
    431 #endif
    432 
    433 /*
    434  * Unlock a monitor.
    435  *
    436  * Returns true if the unlock succeeded.
    437  * If the unlock failed, an exception will be pending.
    438  */
    439 static bool unlockMonitor(Thread* self, Monitor* mon)
    440 {
    441     assert(self != NULL);
    442     assert(mon != NULL);
    443     if (mon->owner == self) {
    444         /*
    445          * We own the monitor, so nobody else can be in here.
    446          */
    447         if (mon->lockCount == 0) {
    448             mon->owner = NULL;
    449             mon->ownerMethod = NULL;
    450             mon->ownerPc = 0;
    451             dvmUnlockMutex(&mon->lock);
    452         } else {
    453             mon->lockCount--;
    454         }
    455     } else {
    456         /*
    457          * We don't own this, so we're not allowed to unlock it.
    458          * The JNI spec says that we should throw IllegalMonitorStateException
    459          * in this case.
    460          */
    461         dvmThrowIllegalMonitorStateException("unlock of unowned monitor");
    462         return false;
    463     }
    464     return true;
    465 }
    466 
    467 /*
    468  * Checks the wait set for circular structure.  Returns 0 if the list
    469  * is not circular.  Otherwise, returns 1.  Used only by asserts.
    470  */
    471 #ifndef NDEBUG
    472 static int waitSetCheck(Monitor *mon)
    473 {
    474     Thread *fast, *slow;
    475     size_t n;
    476 
    477     assert(mon != NULL);
    478     fast = slow = mon->waitSet;
    479     n = 0;
    480     for (;;) {
    481         if (fast == NULL) return 0;
    482         if (fast->waitNext == NULL) return 0;
    483         if (fast == slow && n > 0) return 1;
    484         n += 2;
    485         fast = fast->waitNext->waitNext;
    486         slow = slow->waitNext;
    487     }
    488 }
    489 #endif
    490 
    491 /*
    492  * Links a thread into a monitor's wait set.  The monitor lock must be
    493  * held by the caller of this routine.
    494  */
    495 static void waitSetAppend(Monitor *mon, Thread *thread)
    496 {
    497     Thread *elt;
    498 
    499     assert(mon != NULL);
    500     assert(mon->owner == dvmThreadSelf());
    501     assert(thread != NULL);
    502     assert(thread->waitNext == NULL);
    503     assert(waitSetCheck(mon) == 0);
    504     if (mon->waitSet == NULL) {
    505         mon->waitSet = thread;
    506         return;
    507     }
    508     elt = mon->waitSet;
    509     while (elt->waitNext != NULL) {
    510         elt = elt->waitNext;
    511     }
    512     elt->waitNext = thread;
    513 }
    514 
    515 /*
    516  * Unlinks a thread from a monitor's wait set.  The monitor lock must
    517  * be held by the caller of this routine.
    518  */
    519 static void waitSetRemove(Monitor *mon, Thread *thread)
    520 {
    521     Thread *elt;
    522 
    523     assert(mon != NULL);
    524     assert(mon->owner == dvmThreadSelf());
    525     assert(thread != NULL);
    526     assert(waitSetCheck(mon) == 0);
    527     if (mon->waitSet == NULL) {
    528         return;
    529     }
    530     if (mon->waitSet == thread) {
    531         mon->waitSet = thread->waitNext;
    532         thread->waitNext = NULL;
    533         return;
    534     }
    535     elt = mon->waitSet;
    536     while (elt->waitNext != NULL) {
    537         if (elt->waitNext == thread) {
    538             elt->waitNext = thread->waitNext;
    539             thread->waitNext = NULL;
    540             return;
    541         }
    542         elt = elt->waitNext;
    543     }
    544 }
    545 
    546 /*
    547  * Converts the given relative waiting time into an absolute time.
    548  */
    549 static void absoluteTime(s8 msec, s4 nsec, struct timespec *ts)
    550 {
    551     s8 endSec;
    552 
    553 #ifdef HAVE_TIMEDWAIT_MONOTONIC
    554     clock_gettime(CLOCK_MONOTONIC, ts);
    555 #else
    556     {
    557         struct timeval tv;
    558         gettimeofday(&tv, NULL);
    559         ts->tv_sec = tv.tv_sec;
    560         ts->tv_nsec = tv.tv_usec * 1000;
    561     }
    562 #endif
    563     endSec = ts->tv_sec + msec / 1000;
    564     if (endSec >= 0x7fffffff) {
    565         ALOGV("NOTE: end time exceeds epoch");
    566         endSec = 0x7ffffffe;
    567     }
    568     ts->tv_sec = endSec;
    569     ts->tv_nsec = (ts->tv_nsec + (msec % 1000) * 1000000) + nsec;
    570 
    571     /* catch rollover */
    572     if (ts->tv_nsec >= 1000000000L) {
    573         ts->tv_sec++;
    574         ts->tv_nsec -= 1000000000L;
    575     }
    576 }
    577 
    578 int dvmRelativeCondWait(pthread_cond_t* cond, pthread_mutex_t* mutex,
    579                         s8 msec, s4 nsec)
    580 {
    581     int ret;
    582     struct timespec ts;
    583     absoluteTime(msec, nsec, &ts);
    584 #if defined(HAVE_TIMEDWAIT_MONOTONIC)
    585     ret = pthread_cond_timedwait_monotonic(cond, mutex, &ts);
    586 #else
    587     ret = pthread_cond_timedwait(cond, mutex, &ts);
    588 #endif
    589     assert(ret == 0 || ret == ETIMEDOUT);
    590     return ret;
    591 }
    592 
    593 /*
    594  * Wait on a monitor until timeout, interrupt, or notification.  Used for
    595  * Object.wait() and (somewhat indirectly) Thread.sleep() and Thread.join().
    596  *
    597  * If another thread calls Thread.interrupt(), we throw InterruptedException
    598  * and return immediately if one of the following are true:
    599  *  - blocked in wait(), wait(long), or wait(long, int) methods of Object
    600  *  - blocked in join(), join(long), or join(long, int) methods of Thread
    601  *  - blocked in sleep(long), or sleep(long, int) methods of Thread
    602  * Otherwise, we set the "interrupted" flag.
    603  *
    604  * Checks to make sure that "nsec" is in the range 0-999999
    605  * (i.e. fractions of a millisecond) and throws the appropriate
    606  * exception if it isn't.
    607  *
    608  * The spec allows "spurious wakeups", and recommends that all code using
    609  * Object.wait() do so in a loop.  This appears to derive from concerns
    610  * about pthread_cond_wait() on multiprocessor systems.  Some commentary
    611  * on the web casts doubt on whether these can/should occur.
    612  *
    613  * Since we're allowed to wake up "early", we clamp extremely long durations
    614  * to return at the end of the 32-bit time epoch.
    615  */
    616 static void waitMonitor(Thread* self, Monitor* mon, s8 msec, s4 nsec,
    617     bool interruptShouldThrow)
    618 {
    619     struct timespec ts;
    620     bool wasInterrupted = false;
    621     bool timed;
    622     int ret;
    623 
    624     assert(self != NULL);
    625     assert(mon != NULL);
    626 
    627     /* Make sure that we hold the lock. */
    628     if (mon->owner != self) {
    629         dvmThrowIllegalMonitorStateException(
    630             "object not locked by thread before wait()");
    631         return;
    632     }
    633 
    634     /*
    635      * Enforce the timeout range.
    636      */
    637     if (msec < 0 || nsec < 0 || nsec > 999999) {
    638         dvmThrowIllegalArgumentException("timeout arguments out of range");
    639         return;
    640     }
    641 
    642     /*
    643      * Compute absolute wakeup time, if necessary.
    644      */
    645     if (msec == 0 && nsec == 0) {
    646         timed = false;
    647     } else {
    648         absoluteTime(msec, nsec, &ts);
    649         timed = true;
    650     }
    651 
    652     /*
    653      * Add ourselves to the set of threads waiting on this monitor, and
    654      * release our hold.  We need to let it go even if we're a few levels
    655      * deep in a recursive lock, and we need to restore that later.
    656      *
    657      * We append to the wait set ahead of clearing the count and owner
    658      * fields so the subroutine can check that the calling thread owns
    659      * the monitor.  Aside from that, the order of member updates is
    660      * not order sensitive as we hold the pthread mutex.
    661      */
    662     waitSetAppend(mon, self);
    663     int prevLockCount = mon->lockCount;
    664     mon->lockCount = 0;
    665     mon->owner = NULL;
    666 
    667     const Method* savedMethod = mon->ownerMethod;
    668     u4 savedPc = mon->ownerPc;
    669     mon->ownerMethod = NULL;
    670     mon->ownerPc = 0;
    671 
    672     /*
    673      * Update thread status.  If the GC wakes up, it'll ignore us, knowing
    674      * that we won't touch any references in this state, and we'll check
    675      * our suspend mode before we transition out.
    676      */
    677     if (timed)
    678         dvmChangeStatus(self, THREAD_TIMED_WAIT);
    679     else
    680         dvmChangeStatus(self, THREAD_WAIT);
    681 
    682     dvmLockMutex(&self->waitMutex);
    683 
    684     /*
    685      * Set waitMonitor to the monitor object we will be waiting on.
    686      * When waitMonitor is non-NULL a notifying or interrupting thread
    687      * must signal the thread's waitCond to wake it up.
    688      */
    689     assert(self->waitMonitor == NULL);
    690     self->waitMonitor = mon;
    691 
    692     /*
    693      * Handle the case where the thread was interrupted before we called
    694      * wait().
    695      */
    696     if (self->interrupted) {
    697         wasInterrupted = true;
    698         self->waitMonitor = NULL;
    699         dvmUnlockMutex(&self->waitMutex);
    700         goto done;
    701     }
    702 
    703     /*
    704      * Release the monitor lock and wait for a notification or
    705      * a timeout to occur.
    706      */
    707     dvmUnlockMutex(&mon->lock);
    708 
    709     if (!timed) {
    710         ret = pthread_cond_wait(&self->waitCond, &self->waitMutex);
    711         assert(ret == 0);
    712     } else {
    713 #ifdef HAVE_TIMEDWAIT_MONOTONIC
    714         ret = pthread_cond_timedwait_monotonic(&self->waitCond, &self->waitMutex, &ts);
    715 #else
    716         ret = pthread_cond_timedwait(&self->waitCond, &self->waitMutex, &ts);
    717 #endif
    718         assert(ret == 0 || ret == ETIMEDOUT);
    719     }
    720     if (self->interrupted) {
    721         wasInterrupted = true;
    722     }
    723 
    724     self->interrupted = false;
    725     self->waitMonitor = NULL;
    726 
    727     dvmUnlockMutex(&self->waitMutex);
    728 
    729     /* Reacquire the monitor lock. */
    730     lockMonitor(self, mon);
    731 
    732 done:
    733     /*
    734      * We remove our thread from wait set after restoring the count
    735      * and owner fields so the subroutine can check that the calling
    736      * thread owns the monitor. Aside from that, the order of member
    737      * updates is not order sensitive as we hold the pthread mutex.
    738      */
    739     mon->owner = self;
    740     mon->lockCount = prevLockCount;
    741     mon->ownerMethod = savedMethod;
    742     mon->ownerPc = savedPc;
    743     waitSetRemove(mon, self);
    744 
    745     /* set self->status back to THREAD_RUNNING, and self-suspend if needed */
    746     dvmChangeStatus(self, THREAD_RUNNING);
    747 
    748     if (wasInterrupted) {
    749         /*
    750          * We were interrupted while waiting, or somebody interrupted an
    751          * un-interruptible thread earlier and we're bailing out immediately.
    752          *
    753          * The doc sayeth: "The interrupted status of the current thread is
    754          * cleared when this exception is thrown."
    755          */
    756         self->interrupted = false;
    757         if (interruptShouldThrow) {
    758             dvmThrowInterruptedException(NULL);
    759         }
    760     }
    761 }
    762 
    763 /*
    764  * Notify one thread waiting on this monitor.
    765  */
    766 static void notifyMonitor(Thread* self, Monitor* mon)
    767 {
    768     Thread* thread;
    769 
    770     assert(self != NULL);
    771     assert(mon != NULL);
    772 
    773     /* Make sure that we hold the lock. */
    774     if (mon->owner != self) {
    775         dvmThrowIllegalMonitorStateException(
    776             "object not locked by thread before notify()");
    777         return;
    778     }
    779     /* Signal the first waiting thread in the wait set. */
    780     while (mon->waitSet != NULL) {
    781         thread = mon->waitSet;
    782         mon->waitSet = thread->waitNext;
    783         thread->waitNext = NULL;
    784         dvmLockMutex(&thread->waitMutex);
    785         /* Check to see if the thread is still waiting. */
    786         if (thread->waitMonitor != NULL) {
    787             pthread_cond_signal(&thread->waitCond);
    788             dvmUnlockMutex(&thread->waitMutex);
    789             return;
    790         }
    791         dvmUnlockMutex(&thread->waitMutex);
    792     }
    793 }
    794 
    795 /*
    796  * Notify all threads waiting on this monitor.
    797  */
    798 static void notifyAllMonitor(Thread* self, Monitor* mon)
    799 {
    800     Thread* thread;
    801 
    802     assert(self != NULL);
    803     assert(mon != NULL);
    804 
    805     /* Make sure that we hold the lock. */
    806     if (mon->owner != self) {
    807         dvmThrowIllegalMonitorStateException(
    808             "object not locked by thread before notifyAll()");
    809         return;
    810     }
    811     /* Signal all threads in the wait set. */
    812     while (mon->waitSet != NULL) {
    813         thread = mon->waitSet;
    814         mon->waitSet = thread->waitNext;
    815         thread->waitNext = NULL;
    816         dvmLockMutex(&thread->waitMutex);
    817         /* Check to see if the thread is still waiting. */
    818         if (thread->waitMonitor != NULL) {
    819             pthread_cond_signal(&thread->waitCond);
    820         }
    821         dvmUnlockMutex(&thread->waitMutex);
    822     }
    823 }
    824 
    825 /*
    826  * Changes the shape of a monitor from thin to fat, preserving the
    827  * internal lock state.  The calling thread must own the lock.
    828  */
    829 static void inflateMonitor(Thread *self, Object *obj)
    830 {
    831     Monitor *mon;
    832     u4 thin;
    833 
    834     assert(self != NULL);
    835     assert(obj != NULL);
    836     assert(LW_SHAPE(obj->lock) == LW_SHAPE_THIN);
    837     assert(LW_LOCK_OWNER(obj->lock) == self->threadId);
    838     /* Allocate and acquire a new monitor. */
    839     mon = dvmCreateMonitor(obj);
    840     lockMonitor(self, mon);
    841     /* Propagate the lock state. */
    842     thin = obj->lock;
    843     mon->lockCount = LW_LOCK_COUNT(thin);
    844     thin &= LW_HASH_STATE_MASK << LW_HASH_STATE_SHIFT;
    845     thin |= (u4)mon | LW_SHAPE_FAT;
    846     /* Publish the updated lock word. */
    847     android_atomic_release_store(thin, (int32_t *)&obj->lock);
    848 }
    849 
    850 /*
    851  * Implements monitorenter for "synchronized" stuff.
    852  *
    853  * This does not fail or throw an exception (unless deadlock prediction
    854  * is enabled and set to "err" mode).
    855  */
    856 void dvmLockObject(Thread* self, Object *obj)
    857 {
    858     volatile u4 *thinp;
    859     ThreadStatus oldStatus;
    860     struct timespec tm;
    861     long sleepDelayNs;
    862     long minSleepDelayNs = 1000000;  /* 1 millisecond */
    863     long maxSleepDelayNs = 1000000000;  /* 1 second */
    864     u4 thin, newThin, threadId;
    865 
    866     assert(self != NULL);
    867     assert(obj != NULL);
    868     threadId = self->threadId;
    869     thinp = &obj->lock;
    870 retry:
    871     thin = *thinp;
    872     if (LW_SHAPE(thin) == LW_SHAPE_THIN) {
    873         /*
    874          * The lock is a thin lock.  The owner field is used to
    875          * determine the acquire method, ordered by cost.
    876          */
    877         if (LW_LOCK_OWNER(thin) == threadId) {
    878             /*
    879              * The calling thread owns the lock.  Increment the
    880              * value of the recursion count field.
    881              */
    882             obj->lock += 1 << LW_LOCK_COUNT_SHIFT;
    883             if (LW_LOCK_COUNT(obj->lock) == LW_LOCK_COUNT_MASK) {
    884                 /*
    885                  * The reacquisition limit has been reached.  Inflate
    886                  * the lock so the next acquire will not overflow the
    887                  * recursion count field.
    888                  */
    889                 inflateMonitor(self, obj);
    890             }
    891         } else if (LW_LOCK_OWNER(thin) == 0) {
    892             /*
    893              * The lock is unowned.  Install the thread id of the
    894              * calling thread into the owner field.  This is the
    895              * common case.  In performance critical code the JIT
    896              * will have tried this before calling out to the VM.
    897              */
    898             newThin = thin | (threadId << LW_LOCK_OWNER_SHIFT);
    899             if (android_atomic_acquire_cas(thin, newThin,
    900                     (int32_t*)thinp) != 0) {
    901                 /*
    902                  * The acquire failed.  Try again.
    903                  */
    904                 goto retry;
    905             }
    906         } else {
    907             ALOGV("(%d) spin on lock %p: %#x (%#x) %#x",
    908                  threadId, &obj->lock, 0, *thinp, thin);
    909             /*
    910              * The lock is owned by another thread.  Notify the VM
    911              * that we are about to wait.
    912              */
    913             oldStatus = dvmChangeStatus(self, THREAD_MONITOR);
    914             /*
    915              * Spin until the thin lock is released or inflated.
    916              */
    917             sleepDelayNs = 0;
    918             for (;;) {
    919                 thin = *thinp;
    920                 /*
    921                  * Check the shape of the lock word.  Another thread
    922                  * may have inflated the lock while we were waiting.
    923                  */
    924                 if (LW_SHAPE(thin) == LW_SHAPE_THIN) {
    925                     if (LW_LOCK_OWNER(thin) == 0) {
    926                         /*
    927                          * The lock has been released.  Install the
    928                          * thread id of the calling thread into the
    929                          * owner field.
    930                          */
    931                         newThin = thin | (threadId << LW_LOCK_OWNER_SHIFT);
    932                         if (android_atomic_acquire_cas(thin, newThin,
    933                                 (int32_t *)thinp) == 0) {
    934                             /*
    935                              * The acquire succeed.  Break out of the
    936                              * loop and proceed to inflate the lock.
    937                              */
    938                             break;
    939                         }
    940                     } else {
    941                         /*
    942                          * The lock has not been released.  Yield so
    943                          * the owning thread can run.
    944                          */
    945                         if (sleepDelayNs == 0) {
    946                             sched_yield();
    947                             sleepDelayNs = minSleepDelayNs;
    948                         } else {
    949                             tm.tv_sec = 0;
    950                             tm.tv_nsec = sleepDelayNs;
    951                             nanosleep(&tm, NULL);
    952                             /*
    953                              * Prepare the next delay value.  Wrap to
    954                              * avoid once a second polls for eternity.
    955                              */
    956                             if (sleepDelayNs < maxSleepDelayNs / 2) {
    957                                 sleepDelayNs *= 2;
    958                             } else {
    959                                 sleepDelayNs = minSleepDelayNs;
    960                             }
    961                         }
    962                     }
    963                 } else {
    964                     /*
    965                      * The thin lock was inflated by another thread.
    966                      * Let the VM know we are no longer waiting and
    967                      * try again.
    968                      */
    969                     ALOGV("(%d) lock %p surprise-fattened",
    970                              threadId, &obj->lock);
    971                     dvmChangeStatus(self, oldStatus);
    972                     goto retry;
    973                 }
    974             }
    975             ALOGV("(%d) spin on lock done %p: %#x (%#x) %#x",
    976                  threadId, &obj->lock, 0, *thinp, thin);
    977             /*
    978              * We have acquired the thin lock.  Let the VM know that
    979              * we are no longer waiting.
    980              */
    981             dvmChangeStatus(self, oldStatus);
    982             /*
    983              * Fatten the lock.
    984              */
    985             inflateMonitor(self, obj);
    986             ALOGV("(%d) lock %p fattened", threadId, &obj->lock);
    987         }
    988     } else {
    989         /*
    990          * The lock is a fat lock.
    991          */
    992         assert(LW_MONITOR(obj->lock) != NULL);
    993         lockMonitor(self, LW_MONITOR(obj->lock));
    994     }
    995 }
    996 
    997 /*
    998  * Implements monitorexit for "synchronized" stuff.
    999  *
   1000  * On failure, throws an exception and returns "false".
   1001  */
   1002 bool dvmUnlockObject(Thread* self, Object *obj)
   1003 {
   1004     u4 thin;
   1005 
   1006     assert(self != NULL);
   1007     assert(self->status == THREAD_RUNNING);
   1008     assert(obj != NULL);
   1009     /*
   1010      * Cache the lock word as its value can change while we are
   1011      * examining its state.
   1012      */
   1013     thin = *(volatile u4 *)&obj->lock;
   1014     if (LW_SHAPE(thin) == LW_SHAPE_THIN) {
   1015         /*
   1016          * The lock is thin.  We must ensure that the lock is owned
   1017          * by the given thread before unlocking it.
   1018          */
   1019         if (LW_LOCK_OWNER(thin) == self->threadId) {
   1020             /*
   1021              * We are the lock owner.  It is safe to update the lock
   1022              * without CAS as lock ownership guards the lock itself.
   1023              */
   1024             if (LW_LOCK_COUNT(thin) == 0) {
   1025                 /*
   1026                  * The lock was not recursively acquired, the common
   1027                  * case.  Unlock by clearing all bits except for the
   1028                  * hash state.
   1029                  */
   1030                 thin &= (LW_HASH_STATE_MASK << LW_HASH_STATE_SHIFT);
   1031                 android_atomic_release_store(thin, (int32_t*)&obj->lock);
   1032             } else {
   1033                 /*
   1034                  * The object was recursively acquired.  Decrement the
   1035                  * lock recursion count field.
   1036                  */
   1037                 obj->lock -= 1 << LW_LOCK_COUNT_SHIFT;
   1038             }
   1039         } else {
   1040             /*
   1041              * We do not own the lock.  The JVM spec requires that we
   1042              * throw an exception in this case.
   1043              */
   1044             dvmThrowIllegalMonitorStateException("unlock of unowned monitor");
   1045             return false;
   1046         }
   1047     } else {
   1048         /*
   1049          * The lock is fat.  We must check to see if unlockMonitor has
   1050          * raised any exceptions before continuing.
   1051          */
   1052         assert(LW_MONITOR(obj->lock) != NULL);
   1053         if (!unlockMonitor(self, LW_MONITOR(obj->lock))) {
   1054             /*
   1055              * An exception has been raised.  Do not fall through.
   1056              */
   1057             return false;
   1058         }
   1059     }
   1060     return true;
   1061 }
   1062 
   1063 /*
   1064  * Object.wait().  Also called for class init.
   1065  */
   1066 void dvmObjectWait(Thread* self, Object *obj, s8 msec, s4 nsec,
   1067     bool interruptShouldThrow)
   1068 {
   1069     Monitor* mon;
   1070     u4 thin = *(volatile u4 *)&obj->lock;
   1071 
   1072     /* If the lock is still thin, we need to fatten it.
   1073      */
   1074     if (LW_SHAPE(thin) == LW_SHAPE_THIN) {
   1075         /* Make sure that 'self' holds the lock.
   1076          */
   1077         if (LW_LOCK_OWNER(thin) != self->threadId) {
   1078             dvmThrowIllegalMonitorStateException(
   1079                 "object not locked by thread before wait()");
   1080             return;
   1081         }
   1082 
   1083         /* This thread holds the lock.  We need to fatten the lock
   1084          * so 'self' can block on it.  Don't update the object lock
   1085          * field yet, because 'self' needs to acquire the lock before
   1086          * any other thread gets a chance.
   1087          */
   1088         inflateMonitor(self, obj);
   1089         ALOGV("(%d) lock %p fattened by wait()", self->threadId, &obj->lock);
   1090     }
   1091     mon = LW_MONITOR(obj->lock);
   1092     waitMonitor(self, mon, msec, nsec, interruptShouldThrow);
   1093 }
   1094 
   1095 /*
   1096  * Object.notify().
   1097  */
   1098 void dvmObjectNotify(Thread* self, Object *obj)
   1099 {
   1100     u4 thin = *(volatile u4 *)&obj->lock;
   1101 
   1102     /* If the lock is still thin, there aren't any waiters;
   1103      * waiting on an object forces lock fattening.
   1104      */
   1105     if (LW_SHAPE(thin) == LW_SHAPE_THIN) {
   1106         /* Make sure that 'self' holds the lock.
   1107          */
   1108         if (LW_LOCK_OWNER(thin) != self->threadId) {
   1109             dvmThrowIllegalMonitorStateException(
   1110                 "object not locked by thread before notify()");
   1111             return;
   1112         }
   1113 
   1114         /* no-op;  there are no waiters to notify.
   1115          */
   1116     } else {
   1117         /* It's a fat lock.
   1118          */
   1119         notifyMonitor(self, LW_MONITOR(thin));
   1120     }
   1121 }
   1122 
   1123 /*
   1124  * Object.notifyAll().
   1125  */
   1126 void dvmObjectNotifyAll(Thread* self, Object *obj)
   1127 {
   1128     u4 thin = *(volatile u4 *)&obj->lock;
   1129 
   1130     /* If the lock is still thin, there aren't any waiters;
   1131      * waiting on an object forces lock fattening.
   1132      */
   1133     if (LW_SHAPE(thin) == LW_SHAPE_THIN) {
   1134         /* Make sure that 'self' holds the lock.
   1135          */
   1136         if (LW_LOCK_OWNER(thin) != self->threadId) {
   1137             dvmThrowIllegalMonitorStateException(
   1138                 "object not locked by thread before notifyAll()");
   1139             return;
   1140         }
   1141 
   1142         /* no-op;  there are no waiters to notify.
   1143          */
   1144     } else {
   1145         /* It's a fat lock.
   1146          */
   1147         notifyAllMonitor(self, LW_MONITOR(thin));
   1148     }
   1149 }
   1150 
   1151 /*
   1152  * This implements java.lang.Thread.sleep(long msec, int nsec).
   1153  *
   1154  * The sleep is interruptible by other threads, which means we can't just
   1155  * plop into an OS sleep call.  (We probably could if we wanted to send
   1156  * signals around and rely on EINTR, but that's inefficient and relies
   1157  * on native code respecting our signal mask.)
   1158  *
   1159  * We have to do all of this stuff for Object.wait() as well, so it's
   1160  * easiest to just sleep on a private Monitor.
   1161  *
   1162  * It appears that we want sleep(0,0) to go through the motions of sleeping
   1163  * for a very short duration, rather than just returning.
   1164  */
   1165 void dvmThreadSleep(u8 msec, u4 nsec)
   1166 {
   1167     Thread* self = dvmThreadSelf();
   1168     Monitor* mon = gDvm.threadSleepMon;
   1169 
   1170     /* sleep(0,0) wakes up immediately, wait(0,0) means wait forever; adjust */
   1171     if (msec == 0 && nsec == 0)
   1172         nsec++;
   1173 
   1174     lockMonitor(self, mon);
   1175     waitMonitor(self, mon, msec, nsec, true);
   1176     unlockMonitor(self, mon);
   1177 }
   1178 
   1179 /*
   1180  * Implement java.lang.Thread.interrupt().
   1181  */
   1182 void dvmThreadInterrupt(Thread* thread)
   1183 {
   1184     assert(thread != NULL);
   1185 
   1186     dvmLockMutex(&thread->waitMutex);
   1187 
   1188     /*
   1189      * If the interrupted flag is already set no additional action is
   1190      * required.
   1191      */
   1192     if (thread->interrupted == true) {
   1193         dvmUnlockMutex(&thread->waitMutex);
   1194         return;
   1195     }
   1196 
   1197     /*
   1198      * Raise the "interrupted" flag.  This will cause it to bail early out
   1199      * of the next wait() attempt, if it's not currently waiting on
   1200      * something.
   1201      */
   1202     thread->interrupted = true;
   1203 
   1204     /*
   1205      * Is the thread waiting?
   1206      *
   1207      * Note that fat vs. thin doesn't matter here;  waitMonitor
   1208      * is only set when a thread actually waits on a monitor,
   1209      * which implies that the monitor has already been fattened.
   1210      */
   1211     if (thread->waitMonitor != NULL) {
   1212         pthread_cond_signal(&thread->waitCond);
   1213     }
   1214 
   1215     dvmUnlockMutex(&thread->waitMutex);
   1216 }
   1217 
   1218 #ifndef WITH_COPYING_GC
   1219 u4 dvmIdentityHashCode(Object *obj)
   1220 {
   1221     return (u4)obj;
   1222 }
   1223 #else
   1224 /*
   1225  * Returns the identity hash code of the given object.
   1226  */
   1227 u4 dvmIdentityHashCode(Object *obj)
   1228 {
   1229     Thread *self, *thread;
   1230     volatile u4 *lw;
   1231     size_t size;
   1232     u4 lock, owner, hashState;
   1233 
   1234     if (obj == NULL) {
   1235         /*
   1236          * Null is defined to have an identity hash code of 0.
   1237          */
   1238         return 0;
   1239     }
   1240     lw = &obj->lock;
   1241 retry:
   1242     hashState = LW_HASH_STATE(*lw);
   1243     if (hashState == LW_HASH_STATE_HASHED) {
   1244         /*
   1245          * The object has been hashed but has not had its hash code
   1246          * relocated by the garbage collector.  Use the raw object
   1247          * address.
   1248          */
   1249         return (u4)obj >> 3;
   1250     } else if (hashState == LW_HASH_STATE_HASHED_AND_MOVED) {
   1251         /*
   1252          * The object has been hashed and its hash code has been
   1253          * relocated by the collector.  Use the value of the naturally
   1254          * aligned word following the instance data.
   1255          */
   1256         assert(!dvmIsClassObject(obj));
   1257         if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISARRAY)) {
   1258             size = dvmArrayObjectSize((ArrayObject *)obj);
   1259             size = (size + 2) & ~2;
   1260         } else {
   1261             size = obj->clazz->objectSize;
   1262         }
   1263         return *(u4 *)(((char *)obj) + size);
   1264     } else if (hashState == LW_HASH_STATE_UNHASHED) {
   1265         /*
   1266          * The object has never been hashed.  Change the hash state to
   1267          * hashed and use the raw object address.
   1268          */
   1269         self = dvmThreadSelf();
   1270         if (self->threadId == lockOwner(obj)) {
   1271             /*
   1272              * We already own the lock so we can update the hash state
   1273              * directly.
   1274              */
   1275             *lw |= (LW_HASH_STATE_HASHED << LW_HASH_STATE_SHIFT);
   1276             return (u4)obj >> 3;
   1277         }
   1278         /*
   1279          * We do not own the lock.  Try acquiring the lock.  Should
   1280          * this fail, we must suspend the owning thread.
   1281          */
   1282         if (LW_SHAPE(*lw) == LW_SHAPE_THIN) {
   1283             /*
   1284              * If the lock is thin assume it is unowned.  We simulate
   1285              * an acquire, update, and release with a single CAS.
   1286              */
   1287             lock = (LW_HASH_STATE_HASHED << LW_HASH_STATE_SHIFT);
   1288             if (android_atomic_acquire_cas(
   1289                                 0,
   1290                                 (int32_t)lock,
   1291                                 (int32_t *)lw) == 0) {
   1292                 /*
   1293                  * A new lockword has been installed with a hash state
   1294                  * of hashed.  Use the raw object address.
   1295                  */
   1296                 return (u4)obj >> 3;
   1297             }
   1298         } else {
   1299             if (tryLockMonitor(self, LW_MONITOR(*lw))) {
   1300                 /*
   1301                  * The monitor lock has been acquired.  Change the
   1302                  * hash state to hashed and use the raw object
   1303                  * address.
   1304                  */
   1305                 *lw |= (LW_HASH_STATE_HASHED << LW_HASH_STATE_SHIFT);
   1306                 unlockMonitor(self, LW_MONITOR(*lw));
   1307                 return (u4)obj >> 3;
   1308             }
   1309         }
   1310         /*
   1311          * At this point we have failed to acquire the lock.  We must
   1312          * identify the owning thread and suspend it.
   1313          */
   1314         dvmLockThreadList(self);
   1315         /*
   1316          * Cache the lock word as its value can change between
   1317          * determining its shape and retrieving its owner.
   1318          */
   1319         lock = *lw;
   1320         if (LW_SHAPE(lock) == LW_SHAPE_THIN) {
   1321             /*
   1322              * Find the thread with the corresponding thread id.
   1323              */
   1324             owner = LW_LOCK_OWNER(lock);
   1325             assert(owner != self->threadId);
   1326             /*
   1327              * If the lock has no owner do not bother scanning the
   1328              * thread list and fall through to the failure handler.
   1329              */
   1330             thread = owner ? gDvm.threadList : NULL;
   1331             while (thread != NULL) {
   1332                 if (thread->threadId == owner) {
   1333                     break;
   1334                 }
   1335                 thread = thread->next;
   1336             }
   1337         } else {
   1338             thread = LW_MONITOR(lock)->owner;
   1339         }
   1340         /*
   1341          * If thread is NULL the object has been released since the
   1342          * thread list lock was acquired.  Try again.
   1343          */
   1344         if (thread == NULL) {
   1345             dvmUnlockThreadList();
   1346             goto retry;
   1347         }
   1348         /*
   1349          * Wait for the owning thread to suspend.
   1350          */
   1351         dvmSuspendThread(thread);
   1352         if (dvmHoldsLock(thread, obj)) {
   1353             /*
   1354              * The owning thread has been suspended.  We can safely
   1355              * change the hash state to hashed.
   1356              */
   1357             *lw |= (LW_HASH_STATE_HASHED << LW_HASH_STATE_SHIFT);
   1358             dvmResumeThread(thread);
   1359             dvmUnlockThreadList();
   1360             return (u4)obj >> 3;
   1361         }
   1362         /*
   1363          * The wrong thread has been suspended.  Try again.
   1364          */
   1365         dvmResumeThread(thread);
   1366         dvmUnlockThreadList();
   1367         goto retry;
   1368     }
   1369     ALOGE("object %p has an unknown hash state %#x", obj, hashState);
   1370     dvmDumpThread(dvmThreadSelf(), false);
   1371     dvmAbort();
   1372     return 0;  /* Quiet the compiler. */
   1373 }
   1374 #endif  /* WITH_COPYING_GC */
   1375