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

Collapse All | Expand All

(-)b/sys/compat/linux/linux_event.c (-9 / +25 lines)
Lines 83-89 __attribute__((packed)) Link Here
83
83
84
#define	LINUX_MAX_EVENTS	(INT_MAX / sizeof(struct epoll_event))
84
#define	LINUX_MAX_EVENTS	(INT_MAX / sizeof(struct epoll_event))
85
85
86
static int	epoll_to_kevent(struct thread *td, int fd,
86
static int	epoll_to_kevent(struct thread *td, struct file *fp, int fd,
87
		    struct epoll_event *l_event, struct kevent *kevent,
87
		    struct epoll_event *l_event, struct kevent *kevent,
88
		    int *nkevents);
88
		    int *nkevents);
89
static void	kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event);
89
static void	kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event);
Lines 196-203 linux_epoll_create1(struct thread *td, struct linux_epoll_create1_args *args) Link Here
196
196
197
/* Structure converting function from epoll to kevent. */
197
/* Structure converting function from epoll to kevent. */
198
static int
198
static int
199
epoll_to_kevent(struct thread *td, int fd, struct epoll_event *l_event,
199
epoll_to_kevent(struct thread *td, struct file *fp, int fd,
200
    struct kevent *kevent, int *nkevents)
200
    struct epoll_event *l_event, struct kevent *kevent, int *nkevents)
201
{
201
{
202
	uint32_t levents = l_event->events;
202
	uint32_t levents = l_event->events;
203
	struct linux_pemuldata *pem;
203
	struct linux_pemuldata *pem;
Lines 216-229 epoll_to_kevent(struct thread *td, int fd, struct epoll_event *l_event, Link Here
216
216
217
	/* flags related to what event is registered */
217
	/* flags related to what event is registered */
218
	if ((levents & LINUX_EPOLL_EVRD) != 0) {
218
	if ((levents & LINUX_EPOLL_EVRD) != 0) {
219
		EV_SET(kevent, fd, EVFILT_READ, kev_flags, 0, 0, 0);
219
		EV_SET(kevent, fd, EVFILT_READ, kev_flags, NOTE_HUP, 0, 0);
220
		kevent->ext[0] = l_event->data;
220
		kevent->ext[0] = l_event->data;
221
		kevent->ext[1] = fp->f_type;
221
		++kevent;
222
		++kevent;
222
		++(*nkevents);
223
		++(*nkevents);
223
	}
224
	}
224
	if ((levents & LINUX_EPOLL_EVWR) != 0) {
225
	if ((levents & LINUX_EPOLL_EVWR) != 0) {
225
		EV_SET(kevent, fd, EVFILT_WRITE, kev_flags, 0, 0, 0);
226
		EV_SET(kevent, fd, EVFILT_WRITE, kev_flags, NOTE_HUP, 0, 0);
226
		kevent->ext[0] = l_event->data;
227
		kevent->ext[0] = l_event->data;
228
		kevent->ext[1] = fp->f_type;
227
		++kevent;
229
		++kevent;
228
		++(*nkevents);
230
		++(*nkevents);
229
	}
231
	}
Lines 269-283 kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event) Link Here
269
		return;
271
		return;
270
	}
272
	}
271
273
272
	/* XXX EPOLLPRI, EPOLLHUP */
274
	/* XXX EPOLLPRI */
273
	switch (kevent->filter) {
275
	switch (kevent->filter) {
274
	case EVFILT_READ:
276
	case EVFILT_READ:
275
		l_event->events = LINUX_EPOLLIN;
277
		l_event->events = LINUX_EPOLLIN;
276
		if ((kevent->flags & EV_EOF) != 0)
278
		if (kevent->ext[1] == DTYPE_SOCKET) {
277
			l_event->events |= LINUX_EPOLLRDHUP;
279
			if ((kevent->flags & EV_EOF) != 0)
280
				l_event->events |= LINUX_EPOLLRDHUP;
281
			if ((kevent->fflags & NOTE_HUP) != 0)
282
				 l_event->events |= LINUX_EPOLLHUP;
283
		} else
284
			if ((kevent->flags & EV_EOF) != 0)
285
				l_event->events |= LINUX_EPOLLHUP;
278
	break;
286
	break;
279
	case EVFILT_WRITE:
287
	case EVFILT_WRITE:
280
		l_event->events = LINUX_EPOLLOUT;
288
		l_event->events = LINUX_EPOLLOUT;
289
		if (kevent->ext[1] == DTYPE_SOCKET) {
290
			if ((kevent->fflags & NOTE_HUP) != 0)
291
				l_event->events |= LINUX_EPOLLIN |
292
				    LINUX_EPOLLHUP | LINUX_EPOLLRDHUP;
293
		} else
294
			if ((kevent->flags & EV_EOF) != 0)
295
				l_event->events |=
296
				    LINUX_EPOLLIN | LINUX_EPOLLHUP;
281
	break;
297
	break;
282
	}
298
	}
283
}
299
}
Lines 379-385 linux_epoll_ctl(struct thread *td, struct linux_epoll_ctl_args *args) Link Here
379
	ciargs.changelist = kev;
395
	ciargs.changelist = kev;
380
396
381
	if (args->op != LINUX_EPOLL_CTL_DEL) {
397
	if (args->op != LINUX_EPOLL_CTL_DEL) {
382
		error = epoll_to_kevent(td, args->fd, &le, kev, &nchanges);
398
		error = epoll_to_kevent(td, fp, args->fd, &le, kev, &nchanges);
383
		if (error != 0)
399
		if (error != 0)
384
			goto leave0;
400
			goto leave0;
385
	}
401
	}
(-)b/sys/kern/uipc_socket.c (+6 lines)
Lines 3852-3857 filt_soread(struct knote *kn, long hint) Link Here
3852
	if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3852
	if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3853
		kn->kn_flags |= EV_EOF;
3853
		kn->kn_flags |= EV_EOF;
3854
		kn->kn_fflags = so->so_error;
3854
		kn->kn_fflags = so->so_error;
3855
		if (so->so_snd.sb_state & SBS_CANTSENDMORE &&
3856
		    kn->kn_sfflags & NOTE_HUP)
3857
			kn->kn_fflags |= NOTE_HUP;
3855
		return (1);
3858
		return (1);
3856
	} else if (so->so_error || so->so_rerror)
3859
	} else if (so->so_error || so->so_rerror)
3857
		return (1);
3860
		return (1);
Lines 3897-3902 filt_sowrite(struct knote *kn, long hint) Link Here
3897
	if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3900
	if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3898
		kn->kn_flags |= EV_EOF;
3901
		kn->kn_flags |= EV_EOF;
3899
		kn->kn_fflags = so->so_error;
3902
		kn->kn_fflags = so->so_error;
3903
		if (so->so_rcv.sb_state & SBS_CANTRCVMORE &&
3904
		    kn->kn_sfflags & NOTE_HUP)
3905
			kn->kn_fflags |= NOTE_HUP;
3900
		return (1);
3906
		return (1);
3901
	} else if (so->so_error)	/* temporary udp error */
3907
	} else if (so->so_error)	/* temporary udp error */
3902
		return (1);
3908
		return (1);
(-)b/sys/sys/event.h (+1 lines)
Lines 178-183 struct kevent32_freebsd11 { Link Here
178
 */
178
 */
179
#define NOTE_LOWAT	0x0001			/* low water mark */
179
#define NOTE_LOWAT	0x0001			/* low water mark */
180
#define NOTE_FILE_POLL	0x0002			/* behave like poll() */
180
#define NOTE_FILE_POLL	0x0002			/* behave like poll() */
181
#define	NOTE_HUP	0x80000000		/* socket disconnected */
181
182
182
/*
183
/*
183
 * data/hint flags for EVFILT_VNODE, shared with userspace
184
 * data/hint flags for EVFILT_VNODE, shared with userspace

Return to bug 256952