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);
        }