///<summary> /// Removes a connection reference from the member. ///</summary> ///<param name="connection">Reference to remove.</param> ///<param name="index">Index of the connection in this member's list</param> internal void RemoveConnectionReference(SimulationIslandConnection connection, int index) { if (connections.Count > index) { connections.FastRemoveAt(index); if (connections.Count > index) { connections.Elements[index].SetListIndex(this, index); } } }
///<summary> /// Removes a simulation island connection from the manager. ///</summary> ///<param name="connection">Connection to remove from the manager.</param> ///<exception cref="ArgumentException">Thrown if the connection does not belong to this manager.</exception> public void Remove(SimulationIslandConnection connection) { if (connection.DeactivationManager == this) { connection.DeactivationManager = null; connection.SlatedForRemoval = true; //Don't immediately do simulation island management. //Defer the splits! splitAttempts.Enqueue(connection); } else { throw new ArgumentException("Cannot remove connection from activity manager; it is owned by a different or no activity manager."); } }
///<summary> /// Adds a simulation island connection to the deactivation manager. ///</summary> ///<param name="connection">Connection to add.</param> ///<exception cref="ArgumentException">Thrown if the connection already belongs to a manager.</exception> public void Add(SimulationIslandConnection connection) { //DO A MERGE IF NECESSARY if (connection.DeactivationManager == null) { addLocker.Enter(); connection.DeactivationManager = this; if (connection.entries.Count > 0) { var island = connection.entries.Elements[0].Member.SimulationIsland; for (int i = 1; i < connection.entries.Count; i++) { SimulationIsland opposingIsland; if (island != (opposingIsland = connection.entries.Elements[i].Member.SimulationIsland)) { //Need to do a merge between the two islands. //Note that this merge may eliminate the need for a merge with subsequent connection if they belong to the same island. island = Merge(island, opposingIsland); } } //If it was slated for removal, that means the flush stage will try to split it. //Since it was just added back, splitting is known to be pointless. //Just set the flag and the flush will ignore the split attempt. if (connection.SlatedForRemoval) { connection.SlatedForRemoval = false; } else { //If the connection was NOT slated for removal, that means the reference don't currently exist. //(If the connection was slated for removal, that would imply the connection existed previously, so it must have had references.) connection.AddReferencesToConnectedMembers(); } } addLocker.Exit(); } else { throw new ArgumentException("Cannot add connection to deactivation manager; it already belongs to one."); } }
///<summary> /// Adds a connection reference to the member. ///</summary> ///<param name="connection">Reference to add.</param> ///<returns>Index of the connection in the member's list.</returns> internal int AddConnectionReference(SimulationIslandConnection connection) { connections.Add(connection); return(connections.Count - 1); }