uint32_t SkPixelRef::getGenerationID() const { uint32_t id = fTaggedGenID.load(); if (0 == id) { uint32_t next = next_gen_id() | 1u; if (fTaggedGenID.compare_exchange(&id, next)) { id = next; // There was no race or we won the race. fTaggedGenID is next now. } else { // We lost a race to set fTaggedGenID. compare_exchange() filled id with the winner. } // We can't quite SkASSERT(this->genIDIsUnique()). It could be non-unique // if we got here via the else path (pretty unlikely, but possible). } return id & ~1u; // Mask off bottom unique bit. }
SkPixelRef::SkPixelRef(const SkImageInfo& info, SkBaseMutex* mutex) : fInfo(validate_info(info)) #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK , fStableID(next_gen_id()) #endif { this->setMutex(mutex); fRec.zero(); fLockCount = 0; this->needsNewGenID(); fIsImmutable = false; fPreLocked = false; fAddedToCache.store(false); }
SkPixelRef::SkPixelRef(const SkImageInfo& info, SkBaseMutex* mutex) : fInfo(validate_info(info)) #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK , fStableID(next_gen_id()) #endif { #ifdef SK_TRACE_PIXELREF_LIFETIME SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter)); #endif this->setMutex(mutex); fRec.zero(); fLockCount = 0; this->needsNewGenID(); fIsImmutable = false; fPreLocked = false; fAddedToCache.store(false); }