void RPCTarget::RequestDone(FRT_RPCRequest *req) { HandlerList handlers; { vespalib::MonitorGuard guard(_lock); assert(_state == TARGET_INVOKED); if (req->CheckReturnTypes("s")) { FRT_Values &val = *req->GetReturn(); try { _version.reset(new vespalib::Version(val[0]._string._str)); } catch (vespalib::IllegalArgumentException &e) { (void)e; } } else if (req->GetErrorCode() == FRTE_RPC_NO_SUCH_METHOD) { _version.reset(new vespalib::Version("4.1")); } _versionHandlers.swap(handlers); _state = PROCESSING_HANDLERS; } for (HandlerList::iterator it = handlers.begin(); it != handlers.end(); ++it) { (*it)->handleVersion(_version.get()); } { vespalib::MonitorGuard guard(_lock); _state = (_version.get() ? VERSION_RESOLVED : VERSION_NOT_RESOLVED); guard.broadcast(); } req->SubRef(); }
void EraseHandler(HandlerList& l,SignalHandler* h) { list<SignalHandler*>::iterator i,p; for(i=l.begin();i!=l.end();i++) { if(*i==h) { p=i; p--; l.erase(i); i=p; } } }
void SignalHandler::handle_signal( int signal) { typedef std::vector<const HandlerMap::value_type *> HandlerList; time_t now = ::time(NULL); std::cerr << "Sierra received signal " << signal << " at " << ::ctime(&now) << std::endl; HandlerList handlers; std::pair<HandlerMap::const_iterator, HandlerMap::const_iterator> range = m_handlerMap.equal_range(signal); for (HandlerMap::const_iterator pos = range.first; pos != range.second; ++pos) handlers.push_back(&*pos); for (HandlerList::const_iterator it = handlers.begin(); it != handlers.end(); ++it) { CallbackBase &obj = *(*it)->second; obj(); } }