Пример #1
0
        public override void Set(IStmMemory memoryRef, object value, int[] memoryVersion = null)
        {
            IInnerTransactionStmMemory innerMemoryRef = (IInnerTransactionStmMemory)memoryRef;
            MemoryTuple memoryTuple = GenerateMemoryTuple(innerMemoryRef, memoryVersion, value);

            FixMemoryChange(innerMemoryRef, memoryTuple);
            if (!memoryRefsToUpdate.Contains(innerMemoryRef))
            {
                memoryRefsToUpdate.Add(innerMemoryRef);
            }
        }
Пример #2
0
        public override object Get(IStmMemory memoryRef, int[] memoryVersion = null)
        {
            IInnerTransactionStmMemory innerMemoryRef = (IInnerTransactionStmMemory)memoryRef;
            MemoryTuple memoryTuple = GenerateMemoryTuple(innerMemoryRef, memoryVersion);

            if (!memoryChanges.ContainsKey(innerMemoryRef))
            {
                FixMemoryChange(innerMemoryRef, memoryTuple);
            }
            return(memoryTuple.value);
        }
Пример #3
0
 private void FixMemoryChange(IInnerTransactionStmMemory memoryRef, MemoryTuple memoryTyple)
 {
     if (memoryChanges.ContainsKey(memoryRef))
     {
         memoryChanges[memoryRef] = memoryTyple.value;
     }
     else
     {
         memoryChanges.Add(memoryRef, memoryTyple.value);
         FixMemoryVersion(memoryRef, memoryTyple);
     }
 }
Пример #4
0
        public void SetMemoryVersionsToCurrent()
        {
            int countMemoryRefVersioned = memoryStartVersions.Count;

            IInnerTransactionStmMemory[] memoryRefs = new IInnerTransactionStmMemory[countMemoryRefVersioned];
            memoryStartVersions.Keys.CopyTo(memoryRefs, 0);
            for (int i = 0; i < countMemoryRefVersioned; i++)
            {
                IInnerTransactionStmMemory memoryRef = memoryRefs[i];
                memoryStartVersions[memoryRef] = memoryRef.GetVersionForImbrication(imbrication);
            }
            state = I_TRANSACTION_STATE.ROLLBACKED_BY_SUBTRANSACTION;
        }
Пример #5
0
 public void FixMemoryVersion(IInnerTransactionStmMemory memoryRef, MemoryTuple memoryTuple)
 {
     lock (subTransactionsLocker)
     {
         if (!memoryStartVersions.ContainsKey(memoryRef))
         {
             memoryStartVersions.Add(memoryRef, memoryTuple.version[imbrication]);
             if (parentTransaction != null)
             {
                 ParentTransaction.FixMemoryVersion(memoryRef, memoryTuple);
             }
         }
     }
 }
Пример #6
0
 private MemoryTuple GenerateMemoryTuple(IInnerTransactionStmMemory memoryRef, int[] memoryVersion, object memoryValue = null)
 {
     int[] currentMemVersion = null;
     if (memoryVersion == null)
     {
         currentMemVersion = memoryRef.Version;
     }
     if (memoryValue == null)
     {
         return(MemoryTuple.Get(GetTransactionMemoryValue(memoryRef), currentMemVersion));
     }
     else
     {
         return(MemoryTuple.Get(memoryValue, currentMemVersion));
     }
 }
Пример #7
0
 public object GetTransactionMemoryValue(IInnerTransactionStmMemory memoryRef)
 {
     if (memoryChanges.ContainsKey(memoryRef))
     {
         return(memoryChanges[memoryRef]);
     }
     else
     {
         if (parentTransaction != null)
         {
             return(ParentTransaction.GetTransactionMemoryValue(memoryRef));
         }
         else
         {
             return(memoryRef.GetValue());
         }
     }
 }
Пример #8
0
        public bool ValidateMemoryVersion(IInnerTransactionStmMemory memoryRef)//ok
        {
            if (parentTransaction != null)
            {
                if (!ParentTransaction.ValidateMemoryVersion(memoryRef))
                {
                    state = I_TRANSACTION_STATE.PARENT_CONFLICT;
                    return(false);
                }
            }
            int currentImbricationMemoryVersion = memoryRef.GetVersionForImbrication(imbrication);

            if (currentImbricationMemoryVersion != memoryStartVersions[memoryRef])
            {
                state = I_TRANSACTION_STATE.CONFLICT;
                return(false);
            }
            return(true);
        }
Пример #9
0
 private void UpdateMemory(IInnerTransactionStmMemory memoryRef)
 {
     memoryRef.SetVersionForImbrication(imbrication, number);
     memoryRef.SetValue(memoryChanges[memoryRef]);
 }