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; } }
byte *Reserve(int size) { EntityCommandBufferData *data = m_Data; if (data->m_Tail == null || data->m_Tail->Capacity < size) { var c = (Chunk *)UnsafeUtility.Malloc(sizeof(Chunk) + size, 16, data->m_Allocator); c->Next = null; c->Prev = data->m_Tail != null ? data->m_Tail : null; c->Used = 0; c->Size = size; if (data->m_Tail != null) { data->m_Tail->Next = c; } if (data->m_Head == null) { data->m_Head = c; } data->m_Tail = c; } var offset = data->m_Tail->Bump(size); var ptr = ((byte *)data->m_Tail) + sizeof(Chunk) + offset; return(ptr); }
byte *Reserve(int size) { EntityCommandBufferData *data = m_Data; if (data->m_Tail == null || data->m_Tail->Capacity < size) { int chunkSize = math.max(MinimumChunkSize, size); var c = (Chunk *)UnsafeUtility.Malloc(sizeof(Chunk) + chunkSize, 16, data->m_Allocator); Chunk *prev = data->m_Tail; c->Next = null; c->Prev = prev; c->Used = 0; c->Size = chunkSize; if (prev != null) { prev->Next = c; } if (data->m_Head == null) { data->m_Head = c; } data->m_Tail = c; } var offset = data->m_Tail->Bump(size); var ptr = ((byte *)data->m_Tail) + sizeof(Chunk) + offset; return(ptr); }
/// <summary> /// Creates a new command buffer. Note that this is internal and not exposed to user code. /// </summary> /// <param name="label">Memory allocator to use for chunks and data</param> internal EntityCommandBuffer(Allocator label) { m_Data = (EntityCommandBufferData *)UnsafeUtility.Malloc(sizeof(EntityCommandBufferData), UnsafeUtility.AlignOf <EntityCommandBufferData>(), label); m_Data->m_Allocator = label; m_Data->m_Tail = null; m_Data->m_Head = null; m_Data->m_MinimumChunkSize = kDefaultMinimumChunkSize; #if ENABLE_UNITY_COLLECTIONS_CHECKS m_Safety = AtomicSafetyHandle.Create(); #endif }
internal void Dispose() { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckDeallocateAndThrow(m_Safety); #endif if (m_Data != 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; } }