static int8_t unsetHupEvent(dispatcher_t* disp, entity_context_t* ent_context) {

	int8_t ret = -1;
	pthread_mutex_lock(&(disp->disp_state));
	ret = delEvent(disp, ent_context, EPOLLHUP);
	if (ret > 0)
		ent_context->event_flags ^= EPOLLHUP;
	pthread_mutex_unlock(&(disp->disp_state));
	return ret;
}
示例#2
0
int EpollManager::unregisterEvent(int event, EventHandler *handler)
{
    if (-1 == m_fd) return EG_INVAL;

    int &reEvent = handler->getRegisterEvent();
    LockGuard<SpinLock> guard(m_lock);

    reEvent &= ~event;
    if (NONE == reEvent) return delEvent(event, handler);

    return modifyEvent(reEvent, handler);
}
static int8_t registerEntity(dispatcher_t* disp,
		entity_context_t* ent_context) {

	pthread_mutex_lock(&(disp->disp_state));
	int32_t ret = 0;
	if (ent_context->fd >= disp->fd_lk->max_fds) {
		ret = -1;
		goto disp_unlock;
	}
	if (disp->fd_flag[ent_context->fd] == -1) {
		int8_t found_event = 0;
		int8_t found_timeout = 0;
		disp->fd_flag[ent_context->fd] = 1;
		disp->con_ptr[ent_context->fd] = ent_context;
		if ((ent_context->fd >= 0) && (ent_context->event_flags)) {
			if (addEvent(disp, ent_context, 
						ent_context->event_flags) < 0) {
				ret = -2;
				goto reg_error;
			}
			found_event = 1;
			setNonBlocking(ent_context->fd);
		}
		if ((ent_context->to_be_scheduled.tv_sec != 0) &&
				(ent_context->to_be_scheduled.tv_usec != 0)) {
			if (scheduleTimeoutEventLockHeld(disp,
						ent_context) < 0) {
				if (found_event == 1)
					delEvent(disp, ent_context, 
							ent_context->event_flags);
				ret = -2;
				goto reg_error;
			}
			found_timeout = 1;
		}
		if ((found_event == 1) || (found_timeout == 1)) {
			DBG_DISPLOG(DISP_MOD_NAME, DISP_MSG, disp_log_id, "Register success");
			ret = 1;
			goto disp_unlock;
		}
		ret = -3;
		goto reg_error;
	}
	ret = -4;
reg_error:
	disp->fd_flag[ent_context->fd] = -1;
	disp->con_ptr[ent_context->fd] = NULL;
disp_unlock:
	pthread_mutex_unlock(&(disp->disp_state));
	return ret;
}
示例#4
0
CwxAppHandler4Base* CwxAppEpoll::removeHandler (CWX_HANDLE handle)
{
    if ((handle < 0) || (handle >= CWX_APP_MAX_IO_NUM))
    {
        CWX_ERROR(("Invalid io handle id[%d], range[0,%d]", handle, CWX_APP_MAX_IO_NUM));
        return NULL;
    }
    CwxAppHandler4Base* event_handler = m_eHandler[handle].m_handler;
    if (!event_handler) return NULL;
    if (event_handler->index() >=0)
    {//timeout
        m_timeHeap.erase(event_handler);
        event_handler->setTimeout(0);
    }
    delEvent(handle, m_eHandler[handle].m_mask);
    m_eHandler[handle].m_mask = 0;
    m_eHandler[handle].m_handler = NULL;
    return event_handler;
}
示例#5
0
int CwxAppEpoll::suspendHandler (CWX_HANDLE handle,
                    int suspend_mask)
{
    if ((handle < 0) || (handle >= CWX_APP_MAX_IO_NUM))
    {
        CWX_ERROR(("Invalid io handle id[%d], range[0,%d]", handle, CWX_APP_MAX_IO_NUM));
        return -1;
    }
    CwxAppHandler4Base* event_handler = m_eHandler[handle].m_handler;
    if (!event_handler)
    {
        CWX_ERROR(("Handler[%d] doesn't exist.", handle));
        return -1;
    }
    suspend_mask &=(CwxAppHandler4Base::RW_MASK&m_eHandler[handle].m_mask);
    if(!suspend_mask) return 0;
    if (0 != delEvent(handle, suspend_mask))
    {
        CWX_ERROR(("Failure to suspend handler[%d]", handle));
        return -1;
    }
    m_eHandler[handle].m_mask &=~suspend_mask;
    return 0;
}