KConnectionSelectable::~KConnectionSelectable() { if (socket) { if (selector) { /** * 这里为什么要调用一次removeSocket呢? * 一般来讲,在linux下面,一个socket close了。epoll自动会删除。 * 但如果存在多进程的时候,此socket在一瞬间被其它进程共享, * 则close此socket,epoll还是会返回相关事件。 */ selector->removeSocket(this); } delRequest(st_flags,socket); socket->shutdown(SHUT_RDWR); delete socket; } if (ls) { ls->release(); } #ifdef KSOCKET_SSL if (sni) { delete sni; } #endif }
static void dispatch_operation(struct session *session, DNDSMessage_t *msg) { dsop_PR operation; DSMessage_get_operation(msg, &operation); switch (operation) { case dsop_PR_nodeConnectInfo: nodeConnectInfo(session, msg); break; case dsop_PR_addRequest: addRequest(msg); break; case dsop_PR_delRequest: delRequest(session, msg); break; case dsop_PR_modifyRequest: modifyRequest(session, msg); break; case dsop_PR_searchRequest: searchRequest(session, msg); break; /* terminateRequest is a special case since * it has no Response message associated with it. * simply disconnect the client; */ case dsop_PR_NOTHING: default: jlog(L_WARNING, "not a valid DSM operation"); case dsop_PR_terminateRequest: terminate(session); break; } }