Exemplo n.º 1
0
 protected void RestoreThreadLocals(Object[] oldValues)
 {
     ForkStateEntry[]       forkStateEntries     = this.forkStateEntries;
     IForkedValueResolver[] forkedValueResolvers = this.forkedValueResolvers;
     List <Object>[]        forkedValues         = this.forkedValues;
     lock (this)
     {
         for (int a = 0, size = forkStateEntries.Length; a < size; a++)
         {
             ForkStateEntry       forkStateEntry = forkStateEntries[a];
             ThreadLocal <Object> tlHandle       = (ThreadLocal <Object>)forkStateEntry.valueTL;
             Object forkedValue = tlHandle.Value;
             tlHandle.Value = oldValues[a];
             IForkedValueResolver forkedValueResolver = forkedValueResolvers[a];
             if (!(forkedValueResolver is ForkProcessorValueResolver))
             {
                 continue;
             }
             List <Object> forkedValuesItem = forkedValues[a];
             if (forkedValuesItem == null)
             {
                 forkedValuesItem = new List <Object>();
                 forkedValues[a]  = forkedValuesItem;
             }
             forkedValuesItem.Add(forkedValue);
         }
     }
 }
Exemplo n.º 2
0
        public IForkState CreateForkState()
        {
            ForkStateEntry[] forkStateEntries = GetForkStateEntries();

            IForkedValueResolver[] oldValues = new IForkedValueResolver[forkStateEntries.Length];
            for (int a = 0, size = forkStateEntries.Length; a < size; a++)
            {
                ForkStateEntry forkStateEntry = forkStateEntries[a];
                IForkProcessor forkProcessor  = forkStateEntry.forkProcessor;
                if (forkProcessor != null)
                {
                    Object value = forkProcessor.ResolveOriginalValue(forkStateEntry.tlBean, forkStateEntry.fieldName, forkStateEntry.valueTL);
                    oldValues[a] = new ForkProcessorValueResolver(value, forkProcessor);
                    continue;
                }
                {
                    Object value = forkStateEntry.getValueMI.Invoke(forkStateEntry.valueTL, ForkStateEntry.EMPTY_ARGS);
                    if (value != null && ForkableType.SHALLOW_COPY.Equals(forkStateEntry.forkableType))
                    {
                        throw new Exception("Could not clone " + value);
                    }
                    else
                    {
                        oldValues[a] = new ReferenceValueResolver(value, value);
                    }
                }
            }
            return(new ForkState(forkStateEntries, oldValues));
        }
Exemplo n.º 3
0
        public void ReintegrateForkedValues()
        {
            ForkStateEntry[]       forkStateEntries     = this.forkStateEntries;
            IForkedValueResolver[] forkedValueResolvers = this.forkedValueResolvers;
            List <Object>[]        forkedValues         = this.forkedValues;
            for (int a = 0, size = forkStateEntries.Length; a < size; a++)
            {
                ForkStateEntry forkStateEntry   = forkStateEntries[a];
                List <Object>  forkedValuesItem = forkedValues[a];

                if (forkedValues == null)
                {
                    // nothing to do
                    continue;
                }
                Object originalValue = forkedValueResolvers[a].GetOriginalValue();
                for (int b = 0, sizeB = forkedValuesItem.Count; b < sizeB; b++)
                {
                    Object forkedValue = forkedValuesItem[b];
                    forkStateEntry.forkProcessor.ReturnForkedValue(originalValue, forkedValue);
                }
            }
        }