bool LinkageWorker::Run() { if (!OnInitialize()) { return false; } HealthTimer *health = new HealthTimer(this); if (!RegisterTimer(1000000000LL, health, true)) { delete health; return false; } bool result = true; while (!_quit) { if (!ev_run(_loop, 0)) { CLOG.Error("Linkage: ev_run() returned false."); result = false; break; } } OnShutdown(); for (events_t::iterator p = _events.begin(); p != _events.end(); ++p) { DoRelease(p->second, false); } for (timers_t::iterator p = _timers.begin(); p != _timers.end(); ++p) { DoRelease(*p, false); } _events.clear(); _timers.clear(); return result; }
//---------------------------------------------------------------------------------------------- long Refcount::Release(bool Force /*= false*/) { ::InterlockedExchangeAdd(&m_nCount, -1); if (Force || m_nCount == 0) { DoRelease(); return 0; } return m_nCount; }
bool LinkageWorker::Run() { if (!OnInitialize()) { return false; } HealthTimer *health = new HealthTimer(this); if (!RegisterTimer(1000000000LL, health, true)) { delete health; return false; } _running_thread_id = get_current_thread_id(); LOG(VERBOSE) << "Linkage: enter event loop [" << _running_thread_id << "]"; bool result = true; while (!_quit) { if (!ev_run(_loop, 0)) { CLOG.Error("Linkage: ev_run() returned false."); result = false; break; } } LOG(VERBOSE) << "Linkage: leave event loop [" << _running_thread_id << "]"; _running_thread_id = 0; OnShutdown(); for (events_t::iterator p = _events.begin(); p != _events.end(); ++p) { DoRelease(p->second, false); } for (timers_t::iterator p = _timers.begin(); p != _timers.end(); ++p) { DoRelease(*p, false); } _events.clear(); _timers.clear(); return result; }
EXPORT_C void MCTTokenInterface::Release() { LOG(_L("MCTTokenInterface::Release: token interface released")); LOG_INC_INDENT(); // Get a copy of the token now before we delete the object MCTToken& token = Token(); // Delete the object DoRelease(); // THE OBJECT MAY NOW BE DELETED // Tell the token what's happened. token.Release(); LOG_DEC_INDENT(); }
bool LinkageWorker::OnHealthCheck(int64_t now) { std::list<struct client_t *> drops; for (events_t::iterator p = _events.begin(); p != _events.end(); ++p) { struct client_t *client = p->second; LinkageBase *linkage = client->linkage; if (!linkage->Cleanup(now)) { drops.push_back(client); } } for (std::list<struct client_t *>::iterator p = drops.begin(); p != drops.end(); ++p) { struct client_t *client = *p; CLOG.Verbose("Linkage: disconnect timed out connection: fd = %d", client->fd); DoRelease(client, true); } return true; }
void LinkageWorker::OnDisconnected(struct client_t *client) { DoRelease(client, true); }
void LinkageWorker::OnError(struct client_t *client, bool reading_or_writing, int errnum) { client->linkage->OnError(reading_or_writing, errnum); DoRelease(client, true); }
void LinkageWorker::OnTimer(struct timer_t *timer) { if (!timer->runnable->Run()) { DoRelease(timer, true); } }