View | Details | Raw Unified | Return to bug 256952 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/compat/linux/linux_event.c (-2 / +14 lines)
Lines 262-273 epoll_to_kevent(struct thread *td, int fd, struct epoll_event *l_event, Link Here
262
static void
262
static void
263
kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event)
263
kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event)
264
{
264
{
265
266
	l_event->data = kevent->ext[0];
265
	l_event->data = kevent->ext[0];
267
266
268
	if ((kevent->flags & EV_ERROR) != 0) {
267
	if ((kevent->flags & EV_ERROR) != 0) {
269
		l_event->events = LINUX_EPOLLERR;
268
		l_event->events = LINUX_EPOLLERR;
270
		return;
271
	}
269
	}
272
270
273
	/* XXX EPOLLPRI, EPOLLHUP */
271
	/* XXX EPOLLPRI, EPOLLHUP */
Lines 281-286 kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event) Link Here
281
		l_event->events = LINUX_EPOLLOUT;
279
		l_event->events = LINUX_EPOLLOUT;
282
	break;
280
	break;
283
	}
281
	}
282
283
	/* Handle all events to meet all Linux epoll cases */
284
	if ((kevent->pevents & EV_POLLIN) != 0) {
285
		l_event->events |= LINUX_EPOLLIN;
286
	}
287
	if ((kevent->pevents & EV_POLLHUP) != 0) {
288
		l_event->events |= LINUX_EPOLLHUP;
289
	}
290
	if ((kevent->pevents & EV_POLLRDHUP) != 0) {
291
		l_event->events |= LINUX_EPOLLRDHUP;
292
	}
293
	if ((kevent->pevents & EV_POLLRDNORM) != 0) {
294
		l_event->events |= LINUX_EPOLLRDNORM;
295
	}
284
}
296
}
285
297
286
/*
298
/*
(-)b/sys/kern/uipc_socket.c (+9 lines)
Lines 3830-3835 filt_soread(struct knote *kn, long hint) Link Here
3830
	kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
3830
	kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
3831
	if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3831
	if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3832
		kn->kn_flags |= EV_EOF;
3832
		kn->kn_flags |= EV_EOF;
3833
		if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3834
			kn->kn_pevents |= EV_POLLHUP;
3835
		} else {
3836
			kn->kn_pevents |=
3837
				EV_POLLIN | EV_POLLRDHUP | EV_POLLRDNORM;
3838
		}
3833
		kn->kn_fflags = so->so_error;
3839
		kn->kn_fflags = so->so_error;
3834
		return (1);
3840
		return (1);
3835
	} else if (so->so_error)	/* temporary udp error */
3841
	} else if (so->so_error)	/* temporary udp error */
Lines 3875-3880 filt_sowrite(struct knote *kn, long hint) Link Here
3875
3881
3876
	if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3882
	if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3877
		kn->kn_flags |= EV_EOF;
3883
		kn->kn_flags |= EV_EOF;
3884
		if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3885
			kn->kn_pevents |= EV_POLLHUP;
3886
		}
3878
		kn->kn_fflags = so->so_error;
3887
		kn->kn_fflags = so->so_error;
3879
		return (1);
3888
		return (1);
3880
	} else if (so->so_error)	/* temporary udp error */
3889
	} else if (so->so_error)	/* temporary udp error */
(-)b/sys/sys/event.h (-2 / +16 lines)
Lines 33-38 Link Here
33
33
34
#include <sys/_types.h>
34
#include <sys/_types.h>
35
#include <sys/queue.h>
35
#include <sys/queue.h>
36
#include <sys/poll.h>
36
37
37
#define EVFILT_READ		(-1)
38
#define EVFILT_READ		(-1)
38
#define EVFILT_WRITE		(-2)
39
#define EVFILT_WRITE		(-2)
Lines 58-63 Link Here
58
	    .fflags = (d),			\
59
	    .fflags = (d),			\
59
	    .data = (e),			\
60
	    .data = (e),			\
60
	    .udata = (f),			\
61
	    .udata = (f),			\
62
	    .pevents = 0,			\
61
	    .ext = {0},				\
63
	    .ext = {0},				\
62
	};					\
64
	};					\
63
} while(0)
65
} while(0)
Lines 73-82 Link Here
73
	(kevp)->fflags = (d);			\
75
	(kevp)->fflags = (d);			\
74
	(kevp)->data = (e);			\
76
	(kevp)->data = (e);			\
75
	(kevp)->udata = (f);			\
77
	(kevp)->udata = (f);			\
78
	(kevp)->pevents = 0;			\
76
	(kevp)->ext[0] = 0;			\
79
	(kevp)->ext[0] = 0;			\
77
	(kevp)->ext[1] = 0;			\
80
	(kevp)->ext[1] = 0;			\
78
	(kevp)->ext[2] = 0;			\
81
	(kevp)->ext[2] = 0;			\
79
	(kevp)->ext[3] = 0;			\
80
} while(0)
82
} while(0)
81
#endif
83
#endif
82
84
Lines 87-93 struct kevent { Link Here
87
	unsigned int	fflags;		/* filter flag value */
89
	unsigned int	fflags;		/* filter flag value */
88
	__int64_t	data;		/* filter data value */
90
	__int64_t	data;		/* filter data value */
89
	void		*udata;		/* opaque user data identifier */
91
	void		*udata;		/* opaque user data identifier */
90
	__uint64_t	ext[4];		/* extensions */
92
	unsigned int	pevents;	/* poll events, used to Linux epoll */
93
	__uint64_t	ext[3];		/* extensions */
91
};
94
};
92
95
93
#if defined(_WANT_FREEBSD11_KEVENT)
96
#if defined(_WANT_FREEBSD11_KEVENT)
Lines 153-158 struct kevent32_freebsd11 { Link Here
153
#define EV_EOF		0x8000		/* EOF detected */
156
#define EV_EOF		0x8000		/* EOF detected */
154
#define EV_ERROR	0x4000		/* error, data contains errno */
157
#define EV_ERROR	0x4000		/* error, data contains errno */
155
158
159
/* poll event */
160
#define EV_POLLIN	POLLIN
161
#define EV_POLLPRI	POLLPRI
162
#define EV_POLLOUT	POLLOUT
163
#define EV_POLLERR	POLLERR
164
#define EV_POLLHUP	POLLHUP
165
#define EV_POLLRDNORM	POLLRDNORM
166
#define EV_POLLRDHUP	0x00002000
167
168
156
 /*
169
 /*
157
  * data/hint flags/masks for EVFILT_USER, shared with userspace
170
  * data/hint flags/masks for EVFILT_USER, shared with userspace
158
  *
171
  *
Lines 311-316 struct knote { Link Here
311
#define kn_fflags	kn_kevent.fflags
324
#define kn_fflags	kn_kevent.fflags
312
#define kn_data		kn_kevent.data
325
#define kn_data		kn_kevent.data
313
#define kn_fp		kn_ptr.p_fp
326
#define kn_fp		kn_ptr.p_fp
327
#define kn_pevents	kn_kevent.pevents
314
};
328
};
315
struct kevent_copyops {
329
struct kevent_copyops {
316
	void	*arg;
330
	void	*arg;

Return to bug 256952