/*----------------------------------------------------------------------------*/ int CloseEpollSocket(mctx_t mctx, int epid) { mtcp_manager_t mtcp; struct mtcp_epoll *ep; mtcp = GetMTCPManager(mctx); if (!mtcp) { return -1; } ep = mtcp->smap[epid].ep; if (!ep) { errno = EINVAL; return -1; } DestroyEventQueue(ep->usr_queue); DestroyEventQueue(ep->usr_shadow_queue); DestroyEventQueue(ep->mtcp_queue); free(ep); pthread_mutex_lock(&ep->epoll_lock); mtcp->ep = NULL; mtcp->smap[epid].ep = NULL; pthread_cond_signal(&ep->epoll_cond); pthread_mutex_unlock(&ep->epoll_lock); pthread_cond_destroy(&ep->epoll_cond); pthread_mutex_destroy(&ep->epoll_lock); return 0; }
/*----------------------------------------------------------------------------*/ int mtcp_epoll_create(mctx_t mctx, int size) { mtcp_manager_t mtcp = g_mtcp[mctx->cpu]; struct mtcp_epoll *ep; socket_map_t epsocket; if (size <= 0) { errno = EINVAL; return -1; } epsocket = AllocateSocket(mctx, MTCP_SOCK_EPOLL, FALSE); if (!epsocket) { errno = ENFILE; return -1; } ep = (struct mtcp_epoll *)calloc(1, sizeof(struct mtcp_epoll)); if (!ep) { FreeSocket(mctx, epsocket->id, FALSE); return -1; } /* create event queues */ ep->usr_queue = CreateEventQueue(size); if (!ep->usr_queue) return -1; ep->usr_shadow_queue = CreateEventQueue(size); if (!ep->usr_shadow_queue) { DestroyEventQueue(ep->usr_queue); return -1; } ep->mtcp_queue = CreateEventQueue(size); if (!ep->mtcp_queue) { DestroyEventQueue(ep->usr_queue); DestroyEventQueue(ep->usr_shadow_queue); return -1; } TRACE_EPOLL("epoll structure of size %d created.\n", size); mtcp->ep = ep; epsocket->ep = ep; if (pthread_mutex_init(&ep->epoll_lock, NULL)) { return -1; } if (pthread_cond_init(&ep->epoll_cond, NULL)) { return -1; } return epsocket->id; }
/*---------------------------------------------------------------------------*/ void FreeMonListener(mtcp_manager_t mtcp, socket_map_t socket) { struct mon_listener *monitor = socket->monitor_listener; #ifdef NEWEV stree_dec_ref(mtcp->ev_store, monitor->stree_dontcare); stree_dec_ref(mtcp->ev_store, monitor->stree_pre_rcv); stree_dec_ref(mtcp->ev_store, monitor->stree_post_snd); monitor->stree_dontcare = NULL; monitor->stree_pre_rcv = NULL; monitor->stree_post_snd = NULL; #else CleanupEvB(mtcp, &monitor->dontcare_evb); CleanupEvB(mtcp, &monitor->pre_tcp_evb); CleanupEvB(mtcp, &monitor->post_tcp_evb); #endif DestroyEventQueue(monitor->eq); /* Clean up monitor filter */ if (ISSET_BPFFILTER(&monitor->stream_syn_fcode)) sfbpf_freecode(&monitor->stream_syn_fcode); if (ISSET_BPFFILTER(&monitor->stream_orphan_fcode)) sfbpf_freecode(&monitor->stream_orphan_fcode); memset(monitor, 0, sizeof(struct mon_listener)); }