From 090016a3f5bcd66d6265fe1504430430f1dee7ed Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Fri, 9 Jun 2017 10:15:16 +0200 Subject: EVLOOP_NO_EXIT_ON_EMPTY workaround --- src/uscxml/interpreter/BasicDelayedEventQueue.cpp | 2 +- src/uscxml/interpreter/FastMicroStep.cpp | 79 ----------------------- src/uscxml/server/HTTPServer.cpp | 23 ++++++- src/uscxml/server/HTTPServer.h | 1 + 4 files changed, 23 insertions(+), 82 deletions(-) diff --git a/src/uscxml/interpreter/BasicDelayedEventQueue.cpp b/src/uscxml/interpreter/BasicDelayedEventQueue.cpp index 885ff2c..b89468b 100644 --- a/src/uscxml/interpreter/BasicDelayedEventQueue.cpp +++ b/src/uscxml/interpreter/BasicDelayedEventQueue.cpp @@ -137,7 +137,7 @@ void BasicDelayedEventQueue::run(void* instance) { /** * EVLOOP_NO_EXIT_ON_EMPTY was removed in libevent2.1 - we are * using the event in the far future approach to get blocking - * behavior back (see comments in contructor) + * behavior back (see comments in constructor) */ // #ifndef EVLOOP_NO_EXIT_ON_EMPTY diff --git a/src/uscxml/interpreter/FastMicroStep.cpp b/src/uscxml/interpreter/FastMicroStep.cpp index 7ca1171..4fdfc99 100644 --- a/src/uscxml/interpreter/FastMicroStep.cpp +++ b/src/uscxml/interpreter/FastMicroStep.cpp @@ -718,7 +718,6 @@ InterpreterState FastMicroStep::step(size_t blockMs) { goto SELECT_TRANSITIONS; } -#if 1 /* manage uninvocations */ i = _invocations.find_first(); while(i != boost::dynamic_bitset::npos) { @@ -750,35 +749,6 @@ InterpreterState FastMicroStep::step(size_t blockMs) { } i = _configuration.find_next(i); } -#else - - for (i = 0; i < USCXML_NUMBER_STATES; i++) { - /* uninvoke */ - if (!BIT_HAS(i, _configuration) && BIT_HAS(i, _invocations)) { - if (USCXML_GET_STATE(i).invoke.size() > 0) { - for (auto invIter = USCXML_GET_STATE(i).invoke.begin(); invIter != USCXML_GET_STATE(i).invoke.end(); invIter++) { - _callbacks->uninvoke(*invIter); - } - } - BIT_CLEAR(i, _invocations) - } - /* invoke */ - if (BIT_HAS(i, _configuration) && !BIT_HAS(i, _invocations)) { - if (USCXML_GET_STATE(i).invoke.size() > 0) { - for (auto invIter = USCXML_GET_STATE(i).invoke.begin(); invIter != USCXML_GET_STATE(i).invoke.end(); invIter++) { - try { - _callbacks->invoke(*invIter); - } catch (ErrorEvent e) { - LOG(_callbacks->getLogger(), USCXML_WARN) << e; - // TODO: Shall we deliver the event into the interpreter runtime? - } catch (...) { - } - } - } - BIT_SET_AT(i, _invocations) - } - } -#endif // we dequeued all internal events and ought to signal stable configuration if (!(_flags & USCXML_CTX_STABLE)) { @@ -1111,28 +1081,6 @@ ESTABLISH_ENTRYSET: USCXML_MONITOR_CALLBACK1(monitors, afterEnteringState, USCXML_GET_STATE(i).element); /* take history and initial transitions */ -#if 0 - for (j = 0; j < USCXML_NUMBER_TRANS; j++) { - if unlikely(BIT_HAS(j, _transSet) && - (USCXML_GET_TRANS(j).type & (USCXML_TRANS_HISTORY | USCXML_TRANS_INITIAL)) && - USCXML_GET_STATE(USCXML_GET_TRANS(j).source).parent == i) { - - USCXML_MONITOR_CALLBACK1(monitors, beforeTakingTransition, USCXML_GET_TRANS(j).element); - - /* call executable content in transition */ - if (USCXML_GET_TRANS(j).onTrans != NULL) { - try { - _callbacks->process(USCXML_GET_TRANS(j).onTrans); - } catch (...) { - // do nothing and continue with next block - } - } - - USCXML_MONITOR_CALLBACK1(monitors, afterTakingTransition, USCXML_GET_TRANS(j).element); - - } - } -#else j = _transSet.find_first(); while(j != boost::dynamic_bitset::npos) { if unlikely((USCXML_GET_TRANS(j).type & (USCXML_TRANS_HISTORY | USCXML_TRANS_INITIAL)) && @@ -1154,7 +1102,6 @@ ESTABLISH_ENTRYSET: j = _transSet.find_next(j); } -#endif /* handle final states */ if unlikely(USCXML_STATE_MASK(USCXML_GET_STATE(i).type) == USCXML_STATE_FINAL) { @@ -1173,29 +1120,6 @@ ESTABLISH_ENTRYSET: * 3. Iterate all active final states and remove their ancestors * 4. If a state remains, not all children of a parallel are final */ -#if 0 - for (j = 0; j < USCXML_NUMBER_STATES; j++) { - if unlikely(USCXML_STATE_MASK(USCXML_GET_STATE(j).type) == USCXML_STATE_PARALLEL && - BIT_HAS(j, USCXML_GET_STATE(i).ancestors)) { - _tmpStates.reset(); - k = _configuration.find_first(); - while (k != boost::dynamic_bitset::npos) { - if (BIT_HAS(j, USCXML_GET_STATE(k).ancestors)) { - if (USCXML_STATE_MASK(USCXML_GET_STATE(k).type) == USCXML_STATE_FINAL) { - _tmpStates ^= USCXML_GET_STATE(k).ancestors; - } else { - BIT_SET_AT(k, _tmpStates); - } - } - k = _configuration.find_next(k); - } - if (!_tmpStates.any()) { - // raise done for state j - _callbacks->raiseDoneEvent(USCXML_GET_STATE(j).element, USCXML_GET_STATE(j).doneData); - } - } - } -#else j = USCXML_GET_STATE(i).ancestors.find_first(); while(j != boost::dynamic_bitset::npos) { if unlikely(USCXML_STATE_MASK(USCXML_GET_STATE(j).type) == USCXML_STATE_PARALLEL) { @@ -1219,7 +1143,6 @@ ESTABLISH_ENTRYSET: j = USCXML_GET_STATE(i).ancestors.find_next(j); } -#endif } } USCXML_MONITOR_CALLBACK(monitors, afterMicroStep); @@ -1411,8 +1334,6 @@ bool FastMicroStep::hasLegalConfiguration() { } } - - // When the configuration contains an atomic state, it contains all of its and ancestors. for (size_t i = 0; i < config.size(); i++) { if (isAtomic(Element(config[i]))) { diff --git a/src/uscxml/server/HTTPServer.cpp b/src/uscxml/server/HTTPServer.cpp index 22267dd..faf91d8 100644 --- a/src/uscxml/server/HTTPServer.cpp +++ b/src/uscxml/server/HTTPServer.cpp @@ -71,6 +71,15 @@ extern "C" { namespace uscxml { +static void dummyCallback(evutil_socket_t fd, short what, void *arg) { + // see comments in BasicDelayedEventQueue::run + timeval tv; + tv.tv_sec = 365 * 24 * 3600; + tv.tv_usec = 0; + event *ev = *(event **)arg; + evtimer_add(ev, &tv); +} + HTTPServer::HTTPServer(unsigned short port, unsigned short wsPort, SSLConfig* sslConf) { _port = port; _base = event_base_new(); @@ -79,6 +88,12 @@ HTTPServer::HTTPServer(unsigned short port, unsigned short wsPort, SSLConfig* ss _thread = NULL; _httpHandle = NULL; + timeval tv; + tv.tv_sec = 365 * 24 * 3600; + tv.tv_usec = 0; + _dummyEvent = evtimer_new(_base, dummyCallback, &_dummyEvent); + evtimer_add(_dummyEvent, &tv); + #ifdef _WIN32 _wsHandle = NULL; #else @@ -738,8 +753,12 @@ void HTTPServer::run(void* instance) { while(INSTANCE->_isRunning) { // getting this to be non-polling is somewhat tricky and changes among versions // event_base_loop(INSTANCE->_base, EVLOOP_ONCE | EVLOOP_NO_EXIT_ON_EMPTY); - event_base_dispatch(INSTANCE->_base); - } +// event_base_dispatch(INSTANCE->_base); + + // BasicDelayedEventQueue::run + event_base_loop(INSTANCE->_base, EVLOOP_ONCE); + + } LOGD(USCXML_INFO) << "HTTP Server stopped" << std::endl; } diff --git a/src/uscxml/server/HTTPServer.h b/src/uscxml/server/HTTPServer.h index 02a2a93..3d7f6b4 100644 --- a/src/uscxml/server/HTTPServer.h +++ b/src/uscxml/server/HTTPServer.h @@ -169,6 +169,7 @@ private: struct event_base* _base; struct evhttp* _http; struct evws* _evws; + struct event* _dummyEvent; struct evhttp_bound_socket* _httpHandle; evutil_socket_t _wsHandle; -- cgit v0.12