コード例 #1
0
        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);
        }
コード例 #2
0
        // 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));
        }