void Object::_edje_signal_handler_callback( void *data, Evas_Object *obj, const char *emission, const char *source ) { Dout( dc::notice, "Object::_edje_signal_handler_callback( " << (emission ? emission:"<null>") << ", " << (source ? source:"<null>") << " ) " ); SignalSignal* signal = reinterpret_cast<SignalSignal*>( data ); if ( signal ) signal->emit( emission, source ); else Dout( dc::warning, "Object::_edje_signal_handler_callback() - got callback without valid signal" ); }
void StateMachineLoop::run() { LOG4CXX_TRACE(mLogger, "+run"); StateMachineAccessor &stateMachineAccessor(StateMachineAccessor::getInstance()); while (mRunning) { LOG4CXX_TRACE(mLogger, "+run::running while"); mEventMutex.lock(); // this waiting loop runs until someone pushed an event to the event queue while (!mSM->hasEvents()) { LOG4CXX_TRACE(mLogger, "!mSM->eventQueue.empty()"); // here is the point the loop waits if no event is in the event queue mEventsInQueue.wait(mEventMutex); if (!mRunning) { mEventMutex.unlock(); LOG4CXX_TRACE(mLogger, "!mRunning"); return; } } LOG4CXX_TRACE(mLogger, "mSM->eventQueue.empty()"); int event = mSM->getNextEvent(); mEventMutex.unlock(); LOG4CXX_DEBUG(mLogger, "+EventQueue size: " << mSM->getEventCount()); try { mSM->evaluateState(event); } catch (StateMachineFinishException finisEx) { mRunning = false; LOG4CXX_INFO(mLogger, "trigger statemachine finish"); } // pop element after working LOG4CXX_DEBUG(mLogger, "-EventQueue size: " << mSM->getEventCount()); // emit event signals multimap <int, SignalSignal *>::iterator findResult = mSignalList.find(event); multimap <int, SignalSignal *>::iterator lastElement = mSignalList.upper_bound(event); if (findResult != mSignalList.end()) { // emit also multible signals... for (; findResult != lastElement; ++findResult) { LOG4CXX_DEBUG(mLogger, "call event '" << event << "' to app"); SignalSignal *signal = (*findResult).second; signal->emit(event); } } LOG4CXX_TRACE(mLogger, "-run::running while"); // emit the signal broadcast // this is e.g. useful to dispatch signals to another thread mSignalBroadcast.emit(event); mEventMutex.lock(); mSM->popEvent(); mEventMutex.unlock(); LOG4CXX_TRACE(mLogger, "-run"); } }