⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 events_standard.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
			 */			if (!(fde->additional_flags & EPOLL_ADDITIONAL_FD_FLAG_REPORT_ERROR)) {				epoll_del_event(std_ev, fde);				continue;			}			flags |= EVENT_FD_READ;		}		if (events[i].events & EPOLLIN) flags |= EVENT_FD_READ;		if (events[i].events & EPOLLOUT) flags |= EVENT_FD_WRITE;		if (flags) {			fde->handler(std_ev->ev, fde, flags, fde->private_data);			if (destruction_count != std_ev->destruction_count) {				break;			}		}	}	return 0;}#else#define epoll_init_ctx(std_ev) #define epoll_add_event(std_ev,fde)#define epoll_del_event(std_ev,fde)#define epoll_change_event(std_ev,fde)#define epoll_event_loop(std_ev,tvalp) (-1)#define epoll_check_reopen(std_ev)#endif/*  create a std_event_context structure.*/static int std_event_context_init(struct event_context *ev){	struct std_event_context *std_ev;	std_ev = talloc_zero(ev, struct std_event_context);	if (!std_ev) return -1;	std_ev->ev = ev;	std_ev->epoll_fd = -1;	epoll_init_ctx(std_ev);	ev->additional_data = std_ev;	return 0;}/*  recalculate the maxfd*/static void calc_maxfd(struct std_event_context *std_ev){	struct fd_event *fde;	std_ev->maxfd = 0;	for (fde = std_ev->fd_events; fde; fde = fde->next) {		if (fde->fd > std_ev->maxfd) {			std_ev->maxfd = fde->fd;		}	}}/* to mark the ev->maxfd invalid * this means we need to recalculate it */#define EVENT_INVALID_MAXFD (-1)/*  destroy an fd_event*/static int std_event_fd_destructor(struct fd_event *fde){	struct event_context *ev = fde->event_ctx;	struct std_event_context *std_ev = talloc_get_type(ev->additional_data,							   struct std_event_context);	epoll_check_reopen(std_ev);	if (std_ev->maxfd == fde->fd) {		std_ev->maxfd = EVENT_INVALID_MAXFD;	}	DLIST_REMOVE(std_ev->fd_events, fde);	std_ev->destruction_count++;	epoll_del_event(std_ev, fde);	if (fde->flags & EVENT_FD_AUTOCLOSE) {		close(fde->fd);		fde->fd = -1;	}	return 0;}/*  add a fd based event  return NULL on failure (memory allocation error)*/static struct fd_event *std_event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx,					 int fd, uint16_t flags,					 event_fd_handler_t handler,					 void *private_data){	struct std_event_context *std_ev = talloc_get_type(ev->additional_data,							   struct std_event_context);	struct fd_event *fde;	epoll_check_reopen(std_ev);	fde = talloc(mem_ctx?mem_ctx:ev, struct fd_event);	if (!fde) return NULL;	fde->event_ctx		= ev;	fde->fd			= fd;	fde->flags		= flags;	fde->handler		= handler;	fde->private_data	= private_data;	fde->additional_flags	= 0;	fde->additional_data	= NULL;	DLIST_ADD(std_ev->fd_events, fde);	if ((std_ev->maxfd != EVENT_INVALID_MAXFD)	    && (fde->fd > std_ev->maxfd)) {		std_ev->maxfd = fde->fd;	}	talloc_set_destructor(fde, std_event_fd_destructor);	epoll_add_event(std_ev, fde);	return fde;}/*  return the fd event flags*/static uint16_t std_event_get_fd_flags(struct fd_event *fde){	return fde->flags;}/*  set the fd event flags*/static void std_event_set_fd_flags(struct fd_event *fde, uint16_t flags){	struct event_context *ev;	struct std_event_context *std_ev;	if (fde->flags == flags) return;	ev = fde->event_ctx;	std_ev = talloc_get_type(ev->additional_data, struct std_event_context);	fde->flags = flags;	epoll_check_reopen(std_ev);	epoll_change_event(std_ev, fde);}/*  event loop handling using select()*/static int std_event_loop_select(struct std_event_context *std_ev, struct timeval *tvalp){	fd_set r_fds, w_fds;	struct fd_event *fde;	int selrtn;	uint32_t destruction_count = ++std_ev->destruction_count;	/* we maybe need to recalculate the maxfd */	if (std_ev->maxfd == EVENT_INVALID_MAXFD) {		calc_maxfd(std_ev);	}	FD_ZERO(&r_fds);	FD_ZERO(&w_fds);	/* setup any fd events */	for (fde = std_ev->fd_events; fde; fde = fde->next) {		if (fde->flags & EVENT_FD_READ) {			FD_SET(fde->fd, &r_fds);		}		if (fde->flags & EVENT_FD_WRITE) {			FD_SET(fde->fd, &w_fds);		}	}	if (std_ev->ev->num_signal_handlers && 	    common_event_check_signal(std_ev->ev)) {		return 0;	}	selrtn = select(std_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp);	if (selrtn == -1 && errno == EINTR && 	    std_ev->ev->num_signal_handlers) {		common_event_check_signal(std_ev->ev);		return 0;	}	if (selrtn == -1 && errno == EBADF) {		/* the socket is dead! this should never		   happen as the socket should have first been		   made readable and that should have removed		   the event, so this must be a bug. This is a		   fatal error. */		DEBUG(0,("ERROR: EBADF on std_event_loop_once\n"));		std_ev->exit_code = EBADF;		return -1;	}	if (selrtn == 0 && tvalp) {		/* we don't care about a possible delay here */		common_event_loop_timer_delay(std_ev->ev);		return 0;	}	if (selrtn > 0) {		/* at least one file descriptor is ready - check		   which ones and call the handler, being careful to allow		   the handler to remove itself when called */		for (fde = std_ev->fd_events; fde; fde = fde->next) {			uint16_t flags = 0;			if (FD_ISSET(fde->fd, &r_fds)) flags |= EVENT_FD_READ;			if (FD_ISSET(fde->fd, &w_fds)) flags |= EVENT_FD_WRITE;			if (flags) {				fde->handler(std_ev->ev, fde, flags, fde->private_data);				if (destruction_count != std_ev->destruction_count) {					break;				}			}		}	}	return 0;}		/*  do a single event loop using the events defined in ev */static int std_event_loop_once(struct event_context *ev){	struct std_event_context *std_ev = talloc_get_type(ev->additional_data,		 					   struct std_event_context);	struct timeval tval;	tval = common_event_loop_timer_delay(ev);	if (timeval_is_zero(&tval)) {		return 0;	}	epoll_check_reopen(std_ev);	if (epoll_event_loop(std_ev, &tval) == 0) {		return 0;	}	return std_event_loop_select(std_ev, &tval);}/*  return on failure or (with 0) if all fd events are removed*/static int std_event_loop_wait(struct event_context *ev){	struct std_event_context *std_ev = talloc_get_type(ev->additional_data,							   struct std_event_context);	std_ev->exit_code = 0;	while (std_ev->fd_events && std_ev->exit_code == 0) {		if (std_event_loop_once(ev) != 0) {			break;		}	}	return std_ev->exit_code;}static const struct event_ops std_event_ops = {	.context_init	= std_event_context_init,	.add_fd		= std_event_add_fd,	.get_fd_flags	= std_event_get_fd_flags,	.set_fd_flags	= std_event_set_fd_flags,	.add_timed	= common_event_add_timed,	.add_signal	= common_event_add_signal,	.loop_once	= std_event_loop_once,	.loop_wait	= std_event_loop_wait,};bool events_standard_init(void){	return event_register_backend("standard", &std_event_ops);}#if _SAMBA_BUILD__PUBLIC_ NTSTATUS s4_events_standard_init(void){	if (!events_standard_init()) {		return NT_STATUS_INTERNAL_ERROR;	}	return NT_STATUS_OK;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -