public bool HasReaderOrWriterDependency(int type, JobHandle dependency)
        {
            var typeArrayIndex = m_TypeArrayIndices[type & TypeManager.ClearFlagsMask];

            if (typeArrayIndex == NullTypeIndex)
            {
                return(true);
            }

            var writer = m_DependencyHandles[typeArrayIndex].WriteFence;

            if (JobHandle.CheckFenceIsDependencyOrDidSyncFence(dependency, writer))
            {
                return(true);
            }

            var count = m_DependencyHandles[typeArrayIndex].NumReadFences;

            for (var r = 0; r < count; r++)
            {
                var reader = m_ReadJobFences[typeArrayIndex * kMaxReadJobHandles + r];
                if (JobHandle.CheckFenceIsDependencyOrDidSyncFence(dependency, reader))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #2
0
        void CheckJobDependencies(int type, bool isReading, JobHandle dependency)
        {
            var h = m_SafetyManager.GetSafetyHandle(type, true);

            unsafe
            {
                if (!isReading)
                {
                    var        readerCount = AtomicSafetyHandle.GetReaderArray(h, 0, IntPtr.Zero);
                    JobHandle *readers     = stackalloc JobHandle[readerCount];
                    AtomicSafetyHandle.GetReaderArray(h, readerCount, (IntPtr)readers);

                    for (var i = 0; i < readerCount; ++i)
                    {
                        if (!JobHandle.CheckFenceIsDependencyOrDidSyncFence(readers[i], dependency))
                        {
                            throw new InvalidOperationException($"The system {GetType()} reads {TypeManager.GetType(type)} via {AtomicSafetyHandle.GetReaderName(h, i)} but that type was not returned as a job dependency. To ensure correct behavior of other systems, the job or a dependency of it must be returned from the OnUpdate method.");
                        }
                    }
                }

                var writer = AtomicSafetyHandle.GetWriter(h);
                if (!JobHandle.CheckFenceIsDependencyOrDidSyncFence(writer, dependency))
                {
                    throw new InvalidOperationException($"The system {GetType()} writes {TypeManager.GetType(type)} via {AtomicSafetyHandle.GetWriterName(h)} but that was not returned as a job dependency. To ensure correct behavior of other systems, the job or a dependency of it must be returned from the OnUpdate method.");
                }
            }
        }
コード例 #3
0
        public void StructuralChangeCompletesNoComponentDependenciesJob()
        {
            var system = World.GetOrCreateSystem <NoComponentDependenciesSystem>();

            system.Update();
            World.GetOrCreateSystem <DestroyAllEntitiesSystem>().Update();
            Assert.IsTrue(JobHandle.CheckFenceIsDependencyOrDidSyncFence(system.JobHandle, new JobHandle()));
        }
コード例 #4
0
        public void StructuralChangeCompletesEntityOnlyDependencyJob()
        {
            var system = World.GetOrCreateManager <EntityOnlyDependencySystem>();

            system.Update();
            World.GetOrCreateManager <DestroyAllEntitiesSystem>().Update();
            Assert.IsTrue(JobHandle.CheckFenceIsDependencyOrDidSyncFence(system.JobHandle, new JobHandle()));
        }
コード例 #5
0
        public bool HasReaderOrWriterDependency(int type, JobHandle dependency)
        {
            var writer = m_ComponentSafetyHandles[type].WriteFence;

            if (JobHandle.CheckFenceIsDependencyOrDidSyncFence(dependency, writer))
            {
                return(true);
            }

            var count = m_ComponentSafetyHandles[type].NumReadFences;

            for (var r = 0; r < count; r++)
            {
                var reader = m_ReadJobFences[type * kMaxReadJobHandles + r];
                if (JobHandle.CheckFenceIsDependencyOrDidSyncFence(dependency, reader))
                {
                    return(true);
                }
            }

            return(false);
        }