/* * Stop tracking an object. * * We allow attempts to delete NULL "obj" so that callers don't have to wrap * calls with "if != NULL". */ void dvmReleaseTrackedAlloc(Object* obj, Thread* self) { if (obj == NULL) return; if (self == NULL) self = dvmThreadSelf(); assert(self != NULL); if (!dvmRemoveFromReferenceTable(&self->internalLocalRefTable, self->internalLocalRefTable.table, obj)) { LOGE("threadid=%d: failed to remove %p from internal ref table", self->threadId, obj); dvmAbort(); } }
/* * Stop tracking an object. * * We allow attempts to delete NULL "obj" so that callers don't have to wrap * calls with "if != NULL". */ void dvmReleaseTrackedAlloc(Object* obj, Thread* self) { if (obj == NULL) return; if (self == NULL) self = dvmThreadSelf(); assert(self != NULL); //LOGI("TRACK REM %p (%s)\n", obj, // (obj->clazz != NULL) ? obj->clazz->name : ""); if (!dvmRemoveFromReferenceTable(&self->internalLocalRefTable, self->internalLocalRefTable.table, obj)) { LOGE("threadid=%d: failed to remove %p from internal ref table\n", self->threadId, obj); dvmAbort(); } }
/* * Stop tracking an object. * * We allow attempts to delete NULL "obj" so that callers don't have to wrap * calls with "if != NULL". */ void dvmReleaseTrackedAlloc(Object* obj, Thread* self) { if (obj == NULL) return; if (self == NULL) self = dvmThreadSelf(); assert(self != NULL); pthread_mutex_lock(&gDvm.s_mtx); if(gDvm.freeObjHook) { gDvm.freeObjHook(obj, self); } pthread_mutex_unlock(&gDvm.s_mtx); if (!dvmRemoveFromReferenceTable(&self->internalLocalRefTable, self->internalLocalRefTable.table, obj)) { ALOGE("threadid=%d: failed to remove %p from internal ref table", self->threadId, obj); dvmAbort(); } }