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); } } }
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)); }
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); } } }