void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { aeFileEvent *fe = NULL; if(fd >= eventLoop->setsize) { return; } fe = &eventLoop->events[fd]; if(fe->mask == AE_NONE) { return; } fe->mask = fe->mask & (~mask); if(fd == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ int j = 0; for(j = eventLoop->maxfd-1; j >= 0; j--) { if (eventLoop->events[j].mask != AE_NONE) { break; } } eventLoop->maxfd = j; } aeApiDelEvent(eventLoop, fd, mask); }
/* * 删除文件事件 * * eventLoop 事件处理器指针 * fd 事件文件描述符 * mask 事件类型掩码 * */ void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { // 事件文件描述符大于等于已追踪的最大文件描述符,直接返回 if (fd >= eventLoop->setsize) return; // 获取文件描述符对应的文件事件指针 aeFileEvent *fe = &eventLoop->events[fd]; // 事件类型掩码为未设置,直接返回 if (fe->mask == AE_NONE) return; // 使用对应平台模块中的aeApiDelEvent方法 aeApiDelEvent(eventLoop, fd, mask); // 设置事件类型掩码,事件类型掩码取反然后与当前事件类型进行按位与运算 fe->mask = fe->mask & (~mask); // 当前事件文件描述符等于已注册的最大文件描述符并且当前文件事件状态为未设置 if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ // 循环计数器 int j; // 获取最大文件描述符 for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; // 更新已注册的最大文件描述符 eventLoop->maxfd = j; } }
/*** * 删除IO事件 * @eventLoop[IN]: 要从中删除事件的事件循环处理器 * @fd[IN]: 要删除的IO事件对应的文件描述符 * @mask[IN]: 要删除IO事件的哪种事件, AE_READABLE与AE_WRITEABLE的任意组合 */ void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { /* 如果要删除的事件对应的fd不小于setsize, 则不作任何动作, 因为fd必定不再此eventLoop中 */ if (fd >= eventLoop->setsize) return; /* 根据fd定位到已注册IO事件数组中相应的event元素 */ aeFileEvent *fe = &eventLoop->events[fd]; /* 如果该事件的mask标记为AE_NONE, 说明根本未曾注册, 所以也是直接不动作返回 */ if (fe->mask == AE_NONE) return; /* 从操作系统特定IO复用设施中删除fd的mask标记的事件类型 */ aeApiDelEvent(eventLoop, fd, mask); /* 从event的mask中去除要删除的掩码位 */ fe->mask = fe->mask & (~mask); /* 如果更新后的mask为NONE(说明该IO事件既不关心读也不关心写), * 意味着fd对应的事件将不再处于注册状态. * 如果此fd恰好也是maxfd, 则需要更新maxfd */ if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { int j; /* 从描述符maxfd-1开始向下查找数组中的元素, 直到遇到的第一个mask不等于AE_NONE的event, * 该event对应的fd就是新的maxfd */ for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; eventLoop->maxfd = j; } }
int delete_event(int fd) { if (fd >= AE_SETSIZE) return -1; loop.conns[fd] = NULL; if (aeApiDelEvent(&loop, fd) == -1) return -1; return 0; }
void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { if (fd >= eventLoop->setsize) return; aeFileEvent *fe = &eventLoop->events[fd]; if (fe->mask == AE_NONE) return; fe->mask = fe->mask & (~mask); if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { int j; for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; eventLoop->maxfd = j; } aeApiDelEvent(eventLoop, fd, mask); }
/* 删除文件事件 */ void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { if (fd >= eventLoop->setsize) return; aeFileEvent *fe = &eventLoop->events[fd]; if (fe->mask == AE_NONE) return; //删除文件事件 aeApiDelEvent(eventLoop, fd, mask); fe->mask = fe->mask & (~mask); if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ int j; for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; //找出最大的文件描述符ID eventLoop->maxfd = j; } }
//删除指定文件事件 void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { if (fd >= eventLoop->setsize) return; aeFileEvent *fe = &eventLoop->events[fd]; if (fe->mask == AE_NONE) return; aeApiDelEvent(eventLoop, fd, mask); fe->mask = fe->mask & (~mask); //如果该fd是最大的并且该fd对应的event已经没有事件监听,则更新maxfd if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ int j; for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; eventLoop->maxfd = j; } }
void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { if (fd >= AE_SETSIZE) return; aeFileEvent *fe = &eventLoop->events[fd]; if (fe->mask == AE_NONE) return; fe->mask = fe->mask & (~mask); //更新maxfd select模型用得到 if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ int j; for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; eventLoop->maxfd = j; } aeApiDelEvent(eventLoop, fd, mask); }
/* * 将 fd 从 mask 指定的监听队列中删除 */ void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask) { if (fd >= eventLoop->setsize) return; aeFileEvent *fe = &eventLoop->events[fd]; // 未设置监听的事件类型,直接返回 if (fe->mask == AE_NONE) return; fe->mask = fe->mask & (~mask); if (fd == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ int j; for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; eventLoop->maxfd = j; } // 取消监听给定 fd aeApiDelEvent(eventLoop, fd, mask); }
void aeDeleteFileEvent(aeEventLoop *eventLoop, socket_t fd, int mask) { aeFileEvent *fe; int fdi; #ifdef _WIN32 fdi = lookupFDI(eventLoop, fd); if (fdi == INVALID_FDI) { errno = EBADF; return; } #else fdi = fd; #endif if (fdi >= eventLoop->setsize) { #ifdef _WIN32 unmapFDToIndex(eventLoop, fd); #endif return; } fe = &eventLoop->events[fdi]; if (fe->mask == AE_NONE) return; fe->mask = fe->mask & (~mask); if (fdi == eventLoop->maxfd && fe->mask == AE_NONE) { /* Update the max fd */ socket_t j; for (j = eventLoop->maxfd-1; j >= 0; j--) if (eventLoop->events[j].mask != AE_NONE) break; eventLoop->maxfd = j; } #ifdef _WIN32 if (fe->mask == AE_NONE) { unmapFDToIndex(eventLoop, fd); } #endif aeApiDelEvent(eventLoop, fd, mask); }