# HG changeset patch # User cin # Date 1455813534 -10800 # Node ID 5802131432e41edeb1de28fa005c6f5911a71555 # Parent 5558e43c79bb2fd37982c64f8720579a96553c19 fixed regression: race condition in Promise DFA refactoring diff -r 5558e43c79bb -r 5802131432e4 Implab/AbstractEvent.cs --- a/Implab/AbstractEvent.cs Thu Feb 18 16:06:14 2016 +0300 +++ b/Implab/AbstractEvent.cs Thu Feb 18 19:38:54 2016 +0300 @@ -160,8 +160,12 @@ if (slot < RESERVED_HANDLERS_COUNT) { - if (slot == 0) - Interlocked.CompareExchange(ref m_handlers, new THandler[RESERVED_HANDLERS_COUNT], null); + if (slot == 0) { + m_handlers = new THandler[RESERVED_HANDLERS_COUNT]; + } else { + while (m_handlers == null) + Thread.MemoryBarrier(); + } m_handlers[slot] = handler; diff -r 5558e43c79bb -r 5802131432e4 Implab/Parsing/CDFADefinition.cs --- a/Implab/Parsing/CDFADefinition.cs Thu Feb 18 16:06:14 2016 +0300 +++ b/Implab/Parsing/CDFADefinition.cs Thu Feb 18 19:38:54 2016 +0300 @@ -11,10 +11,8 @@ } public CDFADefinition Optimize() { - var optimized = new CDFADefinition(new CharAlphabet()); - - Optimize(optimized, m_alphabet, optimized.Alphabet); - return optimized; + + return (CDFADefinition)Optimize(alphabet => new CDFADefinition((CharAlphabet)alphabet), m_alphabet, new CharAlphabet()); } public void PrintDFA() { diff -r 5558e43c79bb -r 5802131432e4 Implab/Parsing/DFADefinition.cs --- a/Implab/Parsing/DFADefinition.cs Thu Feb 18 16:06:14 2016 +0300 +++ b/Implab/Parsing/DFADefinition.cs Thu Feb 18 19:38:54 2016 +0300 @@ -66,8 +66,8 @@ m_states[s1].transitions[symbol] = s2; } - public void Optimize(IDFADefinition minimalDFA,IAlphabet sourceAlphabet, IAlphabet minimalAlphabet) { - Safe.ArgumentNotNull(minimalDFA, "minimalDFA"); + protected IDFADefinition Optimize(Func, IDFADefinition> dfaFactory,IAlphabet sourceAlphabet, IAlphabet minimalAlphabet) { + Safe.ArgumentNotNull(dfaFactory, "dfaFactory"); Safe.ArgumentNotNull(minimalAlphabet, "minimalAlphabet"); var setComparer = new CustomEqualityComparer>( @@ -211,6 +211,8 @@ // построение автомата + var minimalDFA = dfaFactory(minimalAlphabet); + var states = new int[ optimalMap.Length ]; states[0] = UNREACHEBLE_STATE; @@ -237,6 +239,7 @@ } } + return minimalDFA; } public void PrintDFA(IAlphabet alphabet) { diff -r 5558e43c79bb -r 5802131432e4 Implab/Parsing/EDFADefinition.cs --- a/Implab/Parsing/EDFADefinition.cs Thu Feb 18 16:06:14 2016 +0300 +++ b/Implab/Parsing/EDFADefinition.cs Thu Feb 18 19:38:54 2016 +0300 @@ -18,10 +18,8 @@ } public EDFADefinition Optimize() { - var optimized = new EDFADefinition(new EnumAlphabet()); - Optimize(optimized, m_alphabet, optimized.Alphabet); - - return optimized; + + return (EDFADefinition)Optimize(alphabet => new EDFADefinition((EnumAlphabet)alphabet), m_alphabet, new EnumAlphabet()); } public void PrintDFA() {