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); }
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."); } } }
public void StructuralChangeCompletesNoComponentDependenciesJob() { var system = World.GetOrCreateSystem <NoComponentDependenciesSystem>(); system.Update(); World.GetOrCreateSystem <DestroyAllEntitiesSystem>().Update(); Assert.IsTrue(JobHandle.CheckFenceIsDependencyOrDidSyncFence(system.JobHandle, new JobHandle())); }
public void StructuralChangeCompletesEntityOnlyDependencyJob() { var system = World.GetOrCreateManager <EntityOnlyDependencySystem>(); system.Update(); World.GetOrCreateManager <DestroyAllEntitiesSystem>().Update(); Assert.IsTrue(JobHandle.CheckFenceIsDependencyOrDidSyncFence(system.JobHandle, new JobHandle())); }
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); }