static bool CheckJobDependencies(ref SafetyErrorDetails details, int type, ComponentDependencyManager *dependencyManager) { var h = dependencyManager->Safety.GetSafetyHandle(type, true); 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 (!dependencyManager->HasReaderOrWriterDependency(type, readers[i])) { details.m_ProblematicTypeIndex = type; details.m_ProblematicHandle = h; details.m_ReaderIndex = i; return(true); } } if (!dependencyManager->HasReaderOrWriterDependency(type, AtomicSafetyHandle.GetWriter(h))) { details.m_ProblematicTypeIndex = type; details.m_ProblematicHandle = h; details.m_ReaderIndex = -1; return(true); } return(false); }
internal static bool CheckSafetyAfterUpdate(ref UnsafeIntList readingSystems, ref UnsafeIntList writingSystems, ComponentDependencyManager *dependencyManager, out SafetyErrorDetails details) { details = default; // Check that all reading and writing jobs are a dependency of the output job, to // catch systems that forget to add one of their jobs to the dependency graph. // // Note that this check is not strictly needed as we would catch the mistake anyway later, // but checking it here means we can flag the system that has the mistake, rather than some // other (innocent) system that is doing things correctly. //@TODO: It is not ideal that we call m_SafetyManager.GetDependency, // it can result in JobHandle.CombineDependencies calls. // Which seems like debug code might have side-effects for (var index = 0; index < readingSystems.Length; index++) { var type = readingSystems.Ptr[index]; if (CheckJobDependencies(ref details, type, dependencyManager)) { return(true); } } for (var index = 0; index < writingSystems.Length; index++) { var type = writingSystems.Ptr[index]; if (CheckJobDependencies(ref details, type, dependencyManager)) { return(true); } } // EmergencySyncAllJobs(ref readingSystems, ref writingSystems, dependencyManager); return(false); }