public void Rollback() { lock (modelLock) { transactionModel.RollbackUpdate(); transactionModel = model; } }
public void Commit() { lock (modelLock) { model = transactionModel; model.CommitUpdate(); } }
public List <ResourceDescription> Next(int n, NetworkModel model) { if (n < 0) { return(null); } int left = ResourcesLeft(); int count = n < left ? n : left; List <ResourceDescription> result = new List <ResourceDescription>(count); int i; for (i = position; i < position + count; ++i) { long gid = gids[i]; result.Add(model.GetValues(gid, properties[ModelCodeHelper.GetTypeFromGID(gid)])); } position = i; return(result); }
public NetworkModel(NetworkModel nm) { nm.rwLock.EnterReadLock(); try { containers = new Dictionary <DMSType, Container>(nm.containers.Count); foreach (KeyValuePair <DMSType, Container> container in nm.containers) { containers.Add(container.Key, new Container(container.Value)); } counters = new Dictionary <DMSType, int>(nm.counters); db = nm.db; rwLock = new ReaderWriterLockSlim(); } finally { nm.rwLock.ExitReadLock(); } }
public UpdateResult ApplyUpdate(Delta delta) { lock (updateLock) { bool ok; DuplexClient <ITransactionManager, ITransaction> client = new DuplexClient <ITransactionManager, ITransaction>("callbackEndpoint", this); client.Connect(); if (!client.Call <bool>(tm => tm.StartEnlist(), out ok) || !ok) //TM.StartEnlist() { client.Disconnect(); return(new UpdateResult(ResultType.Failure)); } NetworkModel tModel = new NetworkModel(model); Tuple <Dictionary <long, long>, List <long>, List <long> > result = tModel.ApplyUpdate(delta); if (result == null) { client.Call <bool>(tm => tm.EndEnlist(false), out ok); //TM.EndEnlist(false) client.Disconnect(); return(new UpdateResult(ResultType.Failure)); } lock (modelLock) { transactionModel = tModel; } if (!client.Call <bool>(tm => tm.Enlist(), out ok) || !ok) //TM.Enlist() { lock (modelLock) { transactionModel = model; } client.Call <bool>(tm => tm.EndEnlist(false), out ok); //TM.EndEnlist(false) client.Disconnect(); return(new UpdateResult(ResultType.Failure)); } { Client <ISCADAServiceContract> scadaClient = new Client <ISCADAServiceContract>("SCADAEndpoint"); // Call SCADA scadaClient.Connect(); if (!scadaClient.Call <bool>(scada => scada.ApplyUpdate(new List <long>(result.Item1.Values), result.Item2, result.Item3), out ok) || !ok) { scadaClient.Disconnect(); lock (modelLock) { transactionModel = model; } client.Call <bool>(tm => tm.EndEnlist(false), out ok); //TM.EndEnlist(false) client.Disconnect(); return(new UpdateResult(ResultType.Failure)); } scadaClient.Disconnect(); } { Client <ICalculationEngineServiceContract> ceClient = new Client <ICalculationEngineServiceContract>("CEEndpoint"); // Call CE ceClient.Connect(); if (!ceClient.Call <bool>(ce => ce.ApplyUpdate(new List <long>(result.Item1.Values), result.Item2, result.Item3), out ok) || !ok) { ceClient.Disconnect(); lock (modelLock) { transactionModel = model; } client.Call <bool>(tm => tm.EndEnlist(false), out ok); //TM.EndEnlist(false) client.Disconnect(); return(new UpdateResult(ResultType.Failure)); } ceClient.Disconnect(); } if (!client.Call <bool>(tm => tm.EndEnlist(true), out ok) || !ok) //TM.EndEnlist(true) { lock (modelLock) { transactionModel = model; } client.Disconnect(); return(new UpdateResult(ResultType.Failure)); } client.Disconnect(); bool success; lock (modelLock) { success = model == tModel; } if (success) { Client <IPublishing> pubClient = new Client <IPublishing>("publishingEndpoint"); pubClient.Connect(); pubClient.Call <bool>(pub => { pub.Publish(new NetworkModelChanged()); return(true); }, out ok); pubClient.Disconnect(); } return(success ? new UpdateResult(ResultType.Success, null, result.Item1, result.Item2, result.Item3) : new UpdateResult(ResultType.Failure)); } }