Beispiel #1
0
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;
}
Beispiel #2
0
//----------------------------------------------------------------------------------------------
long Refcount::Release(bool Force /*= false*/)
{
	::InterlockedExchangeAdd(&m_nCount, -1);

	if (Force || m_nCount == 0)
	{
		DoRelease();
		return 0;
	}
	return m_nCount;
}
Beispiel #3
0
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();
	}
Beispiel #5
0
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;
}
Beispiel #6
0
void LinkageWorker::OnDisconnected(struct client_t *client)
{
    DoRelease(client, true);
}
Beispiel #7
0
void LinkageWorker::OnError(struct client_t *client, bool reading_or_writing, int errnum)
{
    client->linkage->OnError(reading_or_writing, errnum);
    DoRelease(client, true);
}
Beispiel #8
0
void LinkageWorker::OnTimer(struct timer_t *timer)
{
    if (!timer->runnable->Run()) {
        DoRelease(timer, true);
    }
}