public static StandardCheckRevisionImplementation GetImplementation(IEnumerable <string> formulas) { string completeText = JoinWith(formulas, ' '); StandardCheckRevisionImplementation impl = null; if (!ActiveFormulaCallbacks.TryGetValue(completeText, out impl)) { DynamicMethod method = CheckRevisionCompiler.Compile(completeText, formulas); impl = method.CreateDelegate(typeof(StandardCheckRevisionImplementation)) as StandardCheckRevisionImplementation; FormulaList.Enqueue(completeText); ActiveFormulas.Add(completeText, method); ActiveFormulaCallbacks.Add(completeText, impl); if (FormulaList.Count > MAX_CURRENT_FORMULAS) { ThreadPool.QueueUserWorkItem((WaitCallback) delegate { string formulaToRelease = FormulaList.Dequeue(); if (ActiveFormulas.ContainsKey(formulaToRelease)) { ActiveFormulas.Remove(formulaToRelease); } if (ActiveFormulaCallbacks.ContainsKey(formulaToRelease)) { ActiveFormulaCallbacks.Remove(formulaToRelease); } }); } } return(impl); }
// This method assumes all parameters have been sanity checked private static int DoCheckRevisionCompiled( uint A, uint B, uint C, IEnumerable <string> crevFormulas, Stream completeDataStream) { StandardCheckRevisionImplementation impl = CheckRevisionFormulaTracker.GetImplementation(crevFormulas); using (BinaryReader br = new BinaryReader(completeDataStream)) { uint S; while (br.BaseStream.Position < br.BaseStream.Length) { S = br.ReadUInt32(); impl(ref A, ref B, ref C, ref S); } } return(unchecked ((int)C)); }