public static IEnumerator ActionRemoveParked(ThreadBase t) { VehicleInfo info = m_removeParkedInfo; for (ushort i = 0; i < VehicleManager.instance.m_parkedVehicles.m_size; i++) { if (VehicleManager.instance.m_parkedVehicles.m_buffer[i].Info != null) { if (info == VehicleManager.instance.m_parkedVehicles.m_buffer[i].Info) { VehicleManager.instance.ReleaseParkedVehicle(i); } } if (i % 256 == 255) { yield return(i); } } }
public static IEnumerator ActionRemoveExisting(ThreadBase t) { VehicleInfo info = m_removeInfo; Array16 <Vehicle> vehicles = VehicleManager.instance.m_vehicles; for (ushort i = 0; i < vehicles.m_buffer.Length; i++) { if (vehicles.m_buffer[i].Info != null) { if (info == vehicles.m_buffer[i].Info) { VehicleManager.instance.ReleaseVehicle(i); } } if (i % 256 == 255) { yield return(i); } } }
private static void AddThread(ThreadBase thread) { //可以立即执行的时候尝试去执行,但不一定能立即执行成功 if (thread.isExecuteable) { thread.Execute(); } if (thread.isCompleted) { if (thread.exception == null) { thread.OnCompleted(); } else { Debug.LogError(thread.exception); } } else { Instance.threads.Add(thread); } }
private static void delete_thread(ThreadBase th) { ThreadHelper.lock_grab(th.spinlock /*mutex*/); th.exit = true; // Search must be already finished ThreadHelper.lock_release(th.spinlock /*mutex*/); th.notify_one(); //TODO: is call needed? //th.join(); // Wait for thread termination }
public static IEnumerator UpdateCapacityUnits(ThreadBase t) { int count = 0; Array16 <Vehicle> vehicles = VehicleManager.instance.m_vehicles; for (int i = 0; i < vehicles.m_size; i++) { if ((vehicles.m_buffer[i].m_flags & Vehicle.Flags.Spawned) == Vehicle.Flags.Spawned) { if (prefabUpdateUnits == null || vehicles.m_buffer[i].Info == prefabUpdateUnits) { int capacity = GetUnitsCapacity(vehicles.m_buffer[i].Info.m_vehicleAI); if (capacity != -1) { CitizenUnit[] units = CitizenManager.instance.m_units.m_buffer; uint unit = vehicles.m_buffer[i].m_citizenUnits; int currentUnitCount = GetTotalUnitGroups(unit); int newUnitCount = Mathf.CeilToInt(capacity / 5f); // Capacity reduced if (newUnitCount < currentUnitCount) { // Get the first unit to remove uint n = unit; for (int j = 1; j < newUnitCount; j++) { n = units[n].m_nextUnit; } // Releasing units excess CitizenManager.instance.ReleaseUnits(units[n].m_nextUnit); units[n].m_nextUnit = 0; count++; } // Capacity increased else if (newUnitCount > currentUnitCount) { // Get the last unit uint n = unit; while (units[n].m_nextUnit != 0) { n = units[n].m_nextUnit; } // Creating missing units int newCapacity = capacity - currentUnitCount * 5; CitizenManager.instance.CreateUnits(out units[n].m_nextUnit, ref SimulationManager.instance.m_randomizer, 0, (ushort)i, 0, 0, 0, newCapacity, 0); count++; } } } } if (i % 256 == 255) { yield return(null); } } prefabUpdateUnits = null; DebugUtils.Log("Modified capacity of " + count + " vehicle(s). Total unit count: " + CitizenManager.instance.m_unitCount + "/" + CitizenManager.MAX_UNIT_COUNT); }
private static IEnumerator FixEnumerableThread(ThreadBase t) { SimulationManager.instance.ForcedSimulationPaused = true; try { uint brokenCount = 0; uint confusedCount = 0; // Fix broken offers TransferManager.TransferOffer[] incomingOffers = typeof(TransferManager).GetField("m_incomingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[]; TransferManager.TransferOffer[] outgoingOffers = typeof(TransferManager).GetField("m_outgoingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[]; ushort[] incomingCount = typeof(TransferManager).GetField("m_incomingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[]; ushort[] outgoingCount = typeof(TransferManager).GetField("m_outgoingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[]; int[] incomingAmount = typeof(TransferManager).GetField("m_incomingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[]; int[] outgoingAmount = typeof(TransferManager).GetField("m_outgoingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[]; // Based on TransferManager.RemoveAllOffers for (int i = 0; i < 64; i++) { for (int j = 0; j < 8; j++) { int num = i * 8 + j; int num2 = (int)incomingCount[num]; for (int k = num2 - 1; k >= 0; k--) { int num3 = num * 256 + k; if (IsInfoNull(incomingOffers[num3])) { incomingAmount[i] -= incomingOffers[num3].Amount; incomingOffers[num3] = incomingOffers[--num2]; brokenCount++; } } incomingCount[num] = (ushort)num2; int num4 = (int)outgoingCount[num]; for (int l = num4 - 1; l >= 0; l--) { int num5 = num * 256 + l; if (IsInfoNull(outgoingOffers[num5])) { outgoingAmount[i] -= outgoingOffers[num5].Amount; outgoingOffers[num5] = outgoingOffers[--num4]; brokenCount++; } } outgoingCount[num] = (ushort)num4; } yield return(null); } if (brokenCount > 0) { Debug.Log("Removed " + brokenCount + " broken transfer offers."); } // Fix broken vehicles Array16 <Vehicle> vehicles = VehicleManager.instance.m_vehicles; for (int i = 0; i < vehicles.m_size; i++) { if (vehicles.m_buffer[i].m_flags != Vehicle.Flags.None) { bool exists = (vehicles.m_buffer[i].m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None; // Vehicle validity InstanceID target; bool isInfoNull = vehicles.m_buffer[i].Info == null; bool isLeading = vehicles.m_buffer[i].m_leadingVehicle == 0; bool isWaiting = !exists && (vehicles.m_buffer[i].m_flags & Vehicle.Flags.WaitingSpace) != Vehicle.Flags.None; bool isConfused = exists && isLeading && !isInfoNull && vehicles.m_buffer[i].Info.m_vehicleAI.GetLocalizedStatus((ushort)i, ref vehicles.m_buffer[i], out target) == Locale.Get("VEHICLE_STATUS_CONFUSED"); if (isInfoNull || isWaiting || isConfused) { try { VehicleManager.instance.ReleaseVehicle((ushort)i); if (isInfoNull) { brokenCount++; } if (isConfused) { confusedCount++; } } catch { } } } if (i % 256 == 255) { yield return(null); } } if (confusedCount > 0) { Debug.Log("Removed " + confusedCount + " confused vehicle instances."); } Array16 <VehicleParked> vehiclesParked = VehicleManager.instance.m_parkedVehicles; for (int i = 0; i < vehiclesParked.m_size; i++) { if (vehiclesParked.m_buffer[i].Info == null) { try { VehicleManager.instance.ReleaseParkedVehicle((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) { yield return(null); } } if (brokenCount > 0) { Debug.Log("Removed " + brokenCount + " broken vehicle instances."); } brokenCount = 0; // Fix broken buildings Array16 <Building> buildings = BuildingManager.instance.m_buildings; for (int i = 0; i < buildings.m_size; i++) { if (buildings.m_buffer[i].Info == null) { try { BuildingManager.instance.ReleaseBuilding((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) { yield return(null); } } if (brokenCount > 0) { Debug.Log("Removed " + brokenCount + " broken building instances."); } brokenCount = 0; // Fix broken props Array16 <PropInstance> props = PropManager.instance.m_props; for (int i = 0; i < props.m_size; i++) { if (props.m_buffer[i].Info == null) { try { PropManager.instance.ReleaseProp((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) { yield return(null); } } if (brokenCount > 0) { Debug.Log("Removed " + brokenCount + " broken prop instances."); } brokenCount = 0; // Fix broken trees Array32 <TreeInstance> trees = TreeManager.instance.m_trees; for (int i = 0; i < trees.m_size; i++) { if (trees.m_buffer[i].Info == null) { try { TreeManager.instance.ReleaseTree((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) { yield return(null); } } if (brokenCount > 0) { Debug.Log("Removed " + brokenCount + " broken tree instances."); } brokenCount = 0; } finally { SimulationManager.instance.ForcedSimulationPaused = false; } }
public static ThreadPool Threads = new ThreadPool(); // Global object //void check_time(); // start_routine() is the C function which is called when a new thread // is launched. It is a wrapper to the virtual function idle_loop(). public static int start_routine(ThreadBase th) { th.idle_loop(); return(0); }
public void RegisterThread(ThreadBase thread) { if (registeredThreads.Contains(thread)) { return; } registeredThreads.Add(thread); }
private static IEnumerator FixEnumerableThread(ThreadBase t) { SimulationManager.instance.ForcedSimulationPaused = true; try { uint brokenCount = 0; uint confusedCount = 0; // Fix broken offers TransferManager.TransferOffer[] incomingOffers = typeof(TransferManager).GetField("m_incomingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[]; TransferManager.TransferOffer[] outgoingOffers = typeof(TransferManager).GetField("m_outgoingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[]; ushort[] incomingCount = typeof(TransferManager).GetField("m_incomingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[]; ushort[] outgoingCount = typeof(TransferManager).GetField("m_outgoingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[]; int[] incomingAmount = typeof(TransferManager).GetField("m_incomingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[]; int[] outgoingAmount = typeof(TransferManager).GetField("m_outgoingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[]; // Based on TransferManager.RemoveAllOffers for (int i = 0; i < 64; i++) { for (int j = 0; j < 8; j++) { int num = i * 8 + j; int num2 = (int)incomingCount[num]; for (int k = num2 - 1; k >= 0; k--) { int num3 = num * 256 + k; if (IsInfoNull(incomingOffers[num3])) { incomingAmount[i] -= incomingOffers[num3].Amount; incomingOffers[num3] = incomingOffers[--num2]; brokenCount++; } } incomingCount[num] = (ushort)num2; int num4 = (int)outgoingCount[num]; for (int l = num4 - 1; l >= 0; l--) { int num5 = num * 256 + l; if (IsInfoNull(outgoingOffers[num5])) { outgoingAmount[i] -= outgoingOffers[num5].Amount; outgoingOffers[num5] = outgoingOffers[--num4]; brokenCount++; } } outgoingCount[num] = (ushort)num4; } yield return null; } if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken transfer offers."); // Fix broken vehicles Array16<Vehicle> vehicles = VehicleManager.instance.m_vehicles; for (int i = 0; i < vehicles.m_size; i++) { if (vehicles.m_buffer[i].m_flags != Vehicle.Flags.None) { bool exists = (vehicles.m_buffer[i].m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None; // Vehicle validity InstanceID target; bool isInfoNull = vehicles.m_buffer[i].Info == null; bool isLeading = vehicles.m_buffer[i].m_leadingVehicle == 0; bool isWaiting = !exists && (vehicles.m_buffer[i].m_flags & Vehicle.Flags.WaitingSpace) != Vehicle.Flags.None; bool isConfused = exists && isLeading && !isInfoNull && vehicles.m_buffer[i].Info.m_vehicleAI.GetLocalizedStatus((ushort)i, ref vehicles.m_buffer[i], out target) == Locale.Get("VEHICLE_STATUS_CONFUSED"); if (isInfoNull || isWaiting || isConfused) { try { VehicleManager.instance.ReleaseVehicle((ushort)i); if (isInfoNull) brokenCount++; if (isConfused) confusedCount++; } catch { } } } if (i % 256 == 255) yield return null; } if (confusedCount > 0) Debug.Log("Removed " + confusedCount + " confused vehicle instances."); Array16<VehicleParked> vehiclesParked = VehicleManager.instance.m_parkedVehicles; for (int i = 0; i < vehiclesParked.m_size; i++) { if (vehiclesParked.m_buffer[i].Info == null) { try { VehicleManager.instance.ReleaseParkedVehicle((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) yield return null; } if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken vehicle instances."); brokenCount = 0; // Fix broken buildings Array16<Building> buildings = BuildingManager.instance.m_buildings; for (int i = 0; i < buildings.m_size; i++) { if (buildings.m_buffer[i].Info == null) { try { BuildingManager.instance.ReleaseBuilding((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) yield return null; } if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken building instances."); brokenCount = 0; // Fix broken props Array16<PropInstance> props = PropManager.instance.m_props; for (int i = 0; i < props.m_size; i++) { if (props.m_buffer[i].Info == null) { try { PropManager.instance.ReleaseProp((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) yield return null; } if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken prop instances."); brokenCount = 0; // Fix broken trees Array32<TreeInstance> trees = TreeManager.instance.m_trees; for (int i = 0; i < trees.m_size; i++) { if (trees.m_buffer[i].Info == null) { try { TreeManager.instance.ReleaseTree((ushort)i); brokenCount++; } catch { } } if (i % 256 == 255) yield return null; } if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken tree instances."); brokenCount = 0; } finally { SimulationManager.instance.ForcedSimulationPaused = false; } }