Beispiel #1
0
        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);
        }
Beispiel #3
0
        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;
            }
        }