internal void Dispose() { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckDeallocateAndThrow(m_Safety); #endif if (m_Data != null) { EntitySharedComponentCommand *cleanup_list = m_Data->m_CleanupList; while (cleanup_list != null) { cleanup_list->BoxedObject.Free(); cleanup_list = cleanup_list->Prev; } m_Data->m_CleanupList = null; var label = m_Data->m_Allocator; while (m_Data->m_Tail != null) { var prev = m_Data->m_Tail->Prev; UnsafeUtility.Free(m_Data->m_Tail, m_Data->m_Allocator); m_Data->m_Tail = prev; } m_Data->m_Head = null; UnsafeUtility.Free(m_Data, label); m_Data = null; } }
internal unsafe void AddEntitySharedComponentCommand <T>(EntityCommandBufferChain *chain, int jobIndex, ECBCommand op, Entity e, int hashCode, object boxedObject) where T : struct { int size = Align(sizeof(EntitySharedComponentCommand), 8); EntitySharedComponentCommand *commandPtr = (EntitySharedComponentCommand *)ref this.Reserve(chain, jobIndex, size); commandPtr->Header.Header.CommandType = (int)op; commandPtr->Header.Header.TotalSize = size; commandPtr->Header.Header.SortIndex = chain.m_LastSortIndex; commandPtr->Header.Entity = e; commandPtr->ComponentTypeIndex = TypeManager.GetTypeIndex <T>(); commandPtr->HashCode = hashCode; if (boxedObject == null) { commandPtr->BoxedObject = new GCHandle(); } else { commandPtr->BoxedObject = GCHandle.Alloc(boxedObject); commandPtr->Prev = chain.m_CleanupList; chain.m_CleanupList = commandPtr; } }