public void BreadthFirstTraverse( Region root, RegionEntryPredicate entryCondition, RegionProcessor regionProcessor, int maxRegions = 999999, RegionType traversableRegionTypes = RegionType.Set_Passable) { if (freeWorkers.Count == 0) { Log.Error("No free workers for breadth-first traversal. Either BFS recurred deeper than " + (object)NumWorkers + ", or a bug has put this system in an inconsistent state. Resetting.", false); } else if (root == null) { Log.Error("BreadthFirstTraverse with null root region.", false); } else { BFSWorker_Patch bfsWorker = freeWorkers.Dequeue(); try { bfsWorker.BreadthFirstTraverseWork(root, entryCondition, regionProcessor, maxRegions, traversableRegionTypes); } catch (Exception ex) { Log.Error("Exception in BreadthFirstTraverse: " + ex.ToString(), false); } finally { bfsWorker.Clear(); freeWorkers.Enqueue(bfsWorker); } } }
public static bool BreadthFirstTraverse( Region root, RegionEntryPredicate entryCondition, RegionProcessor regionProcessor, int maxRegions = 999999, RegionType traversableRegionTypes = RegionType.Set_Passable) { RegionTraverser2 regionTraverser; int t = Thread.CurrentThread.ManagedThreadId; lock (regionTraverser2Dict) { if (!regionTraverser2Dict.TryGetValue(t, out regionTraverser)) { regionTraverser = new RegionTraverser2(); regionTraverser2Dict.Add(t, regionTraverser); } } if (regionTraverser.freeWorkers.Count == 0) { Log.Error("No free workers for breadth-first traversal. Either BFS recurred deeper than " + regionTraverser.NumWorkers + ", or a bug has put this system in an inconsistent state. Resetting.", false); } else if (root == null) { Log.Error("BreadthFirstTraverse with null root region.", false); } else { BFSWorker_Patch bfsWorker = regionTraverser.freeWorkers.Dequeue(); try { bfsWorker.BreadthFirstTraverseWork(root, entryCondition, regionProcessor, maxRegions, traversableRegionTypes); } catch (Exception ex) { Log.Error("Exception in BreadthFirstTraverse: " + ex.ToString(), false); } finally { bfsWorker.Clear(); regionTraverser.freeWorkers.Enqueue(bfsWorker); } } return(false); }