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);
        }
Esempio n. 4
0
        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));
            }
        }