public static void Release(BlobAssetBatch *batch) { int newRefCount = Interlocked.Decrement(ref batch->RefCount); if (newRefCount <= 0) { // Debug.Log("Freeing blob"); #if ENABLE_UNITY_COLLECTIONS_CHECKS if (newRefCount < 0) { throw new InvalidOperationException("BlobAssetBatch refcount is less than zero. It has been corrupted."); } if (batch->TotalDataSize == 0) { throw new InvalidOperationException("BlobAssetBatch has been corrupted. Likely it has already been unloaded or released."); } var header = (BlobAssetHeader *)(batch + 1); for (int i = 0; i != batch->BlobAssetHeaderCount; i++) { if (header->ValidationPtr != (header + 1)) { throw new InvalidOperationException("The BlobAssetReference has been corrupted. Likely it has already been unloaded or released."); } header->Invalidate(); header = (BlobAssetHeader *)(((byte *)(header + 1)) + header->Length); } header--; if (header == (byte *)batch + batch->TotalDataSize) { throw new InvalidOperationException("BlobAssetBatch has been corrupted. Likely it has already been unloaded or released."); } batch->TotalDataSize = 0; batch->BlobAssetHeaderCount = 0; #endif UnsafeUtility.Free(batch, Allocator.Persistent); } }
public BlobAssetOwner(void *buffer, int expectedTotalDataSize) { BlobAssetBatchPtr = BlobAssetBatch.CreateFromMemory(buffer, expectedTotalDataSize); }
public static void Retain(BlobAssetBatch *batch) { Interlocked.Increment(ref batch->RefCount); }