示例#1
0
/*----------------------------------------------------------------------------*/
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;
}
示例#2
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;
}
示例#3
0
/*---------------------------------------------------------------------------*/
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));
}