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; }
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; }
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; }
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; }