/* * Returns true iff <obj> points to a valid allocated object. */ bool dvmIsValidObject(const Object* obj) { /* Don't bother if it's NULL or not 8-byte aligned. */ #ifdef FASTIVA_PRELOAD_STATIC_INSTANCE if (obj != NULL) { if (d2f_isFastivaClassObject(obj)) { return true; } if (((uintptr_t)obj & (8-1)) == 0) { return dvmHeapSourceContains(obj); } } #else if (obj != NULL && ((uintptr_t)obj & (8-1)) == 0) { /* Even if the heap isn't locked, this shouldn't return * any false negatives. The only mutation that could * be happening is allocation, which means that another * thread could be in the middle of a read-modify-write * to add a new bit for a new object. However, that * RMW will have completed by the time any other thread * could possibly see the new pointer, so there is no * danger of dvmIsValidObject() being called on a valid * pointer whose bit isn't set. * * Freeing will only happen during the sweep phase, which * only happens while the heap is locked. */ return dvmHeapSourceContains(obj); } #endif return false; }
bool dvmIsZygoteObject(const Object* obj) { HeapSource *hs = gHs; HS_BOILERPLATE(); if (dvmHeapSourceContains(obj) && hs->sawZygote) { Heap *heap = ptr2heap(hs, obj); if (heap != NULL) { /* If the object is not in the active heap, we assume that * it was allocated as part of zygote. */ return heap != hs->heaps; } } /* The pointer is outside of any known heap, or we are not * running in zygote mode. */ return false; }