public void TestLockable() { SpacegameServer.Core.Core Instance = SpacegameServer.Core.Core.Instance; SpacegameServer.Core.User x = Mock.MockUserAndAdd(Instance); int shipId1 = (int)Instance.identities.shipLock.getNext(); int shipId2 = (int)Instance.identities.shipLock.getNext(); SpacegameServer.Core.Ship Ship1, Ship2; Ship1 = new SpacegameServer.Core.Ship(shipId1); Ship2 = new SpacegameServer.Core.Ship(shipId2); SpacegameServer.Core.Colony Colony1; Colony1 = new SpacegameServer.Core.Colony(1); //Object can only be locked once Assert.IsTrue(Ship1.setLock()); Assert.IsFalse(Ship1.setLock()); //LockAll of Ships can only be set once Assert.IsTrue(SpacegameServer.Core.Ship.setLockAll()); Assert.IsFalse(SpacegameServer.Core.Ship.setLockAll()); //ships can't be lcoked anymore, colonies can Assert.IsFalse(Ship1.setLock()); Assert.IsFalse(Ship2.setLock()); Assert.IsTrue(Colony1.setLock()); Ship1.removeLock(); Colony1.removeLock(); //after removing LockAll, all is lockable again SpacegameServer.Core.Ship.removeLockAll(); Assert.IsTrue(Ship1.setLock()); Assert.IsTrue(Ship2.setLock()); Assert.IsTrue(Colony1.setLock()); }
public static bool build(int userId, int colonyId, ref string xml) { SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance; // lock colony Colony colony = core.colonies[colonyId]; if (colony == null) { return(false); } for (int i = 0; i < 10; i++) { bool colonyLocked = false; colonyLocked = colony.setLock(); if (colonyLocked) { //userId may have been changed by another thread, so check it again after locking if (colony.userId != userId) { colony.removeLock(); return(false); } Core.Instance.dataConnection.buildModules(userId, colonyId, ref xml); // get colony data (goods, later population (colony ships)) Core.Instance.dataConnection.getColonyStock(core, colony); //release the ressources and return true colony.removeLock(); BC.XMLGroups.Colonize bCCol = new BC.XMLGroups.Colonize(); bCCol.Colony = colony; BC.BusinessConnector.Serialize <BC.XMLGroups.Colonize>(bCCol, ref xml); return(true); } else { Thread.Sleep(Lockable.rnd.Next(0, 50)); } } return(true); }
public bool build(int _shipTemplateId, int _userId, int _colonyId, bool _fastBuild, ref string _xml) { // lock colony Colony colony = core.colonies[_colonyId]; if (colony == null) { return(false); } for (int i = 0; i < 10; i++) { bool colonyLocked = false; colonyLocked = colony.setLock(); if (colonyLocked) { //userId may have been changed by another thread, so check it again after locking if (colony.userId != _userId) { colony.removeLock(); return(false); } int newShipId = 0; Core.Instance.dataConnection.buildShip(_shipTemplateId, _userId, _colonyId, _fastBuild, ref _xml, ref newShipId); //get new ship data Core.Instance.dataConnection.getShips(core, newShipId, null); Core.Instance.dataConnection.getShipModules(core, core.ships[newShipId], false); // get colony data (goods, later population (colony ships)) Core.Instance.dataConnection.getColonyStock(core, colony); //release the ressources and return true colony.removeLock(); return(true); } else { Thread.Sleep(Lockable.rnd.Next(0, 50)); } } return(true); }