SkPicture::~SkPicture() { // TODO: move this to ~SkBigPicture() only? // If the ID is still zero, no one has read it, so no need to send this message. uint32_t id = sk_atomic_load(&fUniqueID, sk_memory_order_relaxed); if (id != 0) { SkPicture::DeletionMessage msg = { (int32_t)id }; SkMessageBus<SkPicture::DeletionMessage>::Post(msg); } }
uint32_t SkPicture::uniqueID() const { static uint32_t gNextID = 1; uint32_t id = sk_atomic_load(&fUniqueID, sk_memory_order_relaxed); while (id == 0) { uint32_t next = sk_atomic_fetch_add(&gNextID, 1u); if (sk_atomic_compare_exchange(&fUniqueID, &id, next, sk_memory_order_relaxed, sk_memory_order_relaxed)) { id = next; } else { // sk_atomic_compare_exchange replaced id with the current value of fUniqueID. } } return id; }
SkEventTracer* SkEventTracer::GetInstance() { if (SkEventTracer* tracer = sk_atomic_load(&gUserTracer, sk_memory_order_acquire)) { return tracer; } return gDefaultTracer.get(); }
void SkEventTracer::SetInstance(SkEventTracer* tracer) { SkASSERT(nullptr == sk_atomic_load(&gUserTracer, sk_memory_order_acquire)); sk_atomic_store(&gUserTracer, tracer, sk_memory_order_release); // An atomic load during process shutdown is probably overkill, but safe overkill. atexit([](){ SkDELETE(sk_atomic_load(&gUserTracer, sk_memory_order_acquire)); }); }