3 #include "fdevent_impl.h"
12 #ifdef FDEVENT_USE_SOLARIS_DEVPOLL
14 # include <sys/devpoll.h>
15 # include <sys/ioctl.h>
18 static void fdevent_solaris_devpoll_free(fdevents
*ev
) {
20 close(ev
->devpoll_fd
);
23 /* return -1 is fine here */
25 static int fdevent_solaris_devpoll_event_del(fdevents
*ev
, fdnode
*fdn
) {
28 pfd
.events
= POLLREMOVE
;
30 return (-1 != write(ev
->devpoll_fd
, &pfd
, sizeof(pfd
))) ? 0 : -1;
33 static int fdevent_solaris_devpoll_event_set(fdevents
*ev
, fdnode
*fdn
, int events
) {
35 pfd
.fd
= fdn
->fde_ndx
= fdn
->fd
;
38 return (-1 != write(ev
->devpoll_fd
, &pfd
, sizeof(pfd
))) ? 0 : -1;
41 static int fdevent_solaris_devpoll_poll(fdevents
*ev
, int timeout_ms
) {
43 server
* const srv
= ev
->srv
;
46 dopoll
.dp_timeout
= timeout_ms
;
47 dopoll
.dp_nfds
= ev
->maxfds
- 1;
48 dopoll
.dp_fds
= ev
->devpollfds
;
50 n
= ioctl(ev
->devpoll_fd
, DP_POLL
, &dopoll
);
52 for (int i
= 0; i
< n
; ++i
) {
53 fdnode
* const fdn
= ev
->fdarray
[ev
->devpollfds
[i
].fd
];
54 int revents
= ev
->devpollfds
[i
].revents
;
55 if (0 == ((uintptr_t)fdn
& 0x3)) {
56 (*fdn
->handler
)(srv
, fdn
->ctx
, revents
);
63 int fdevent_solaris_devpoll_reset(fdevents
*ev
) {
64 /* a forked process does only inherit the filedescriptor,
65 * but every operation on the device will lead to a EACCES */
66 if ((ev
->devpoll_fd
= fdevent_open_cloexec("/dev/poll", 1, O_RDWR
, 0)) < 0) return -1;
71 int fdevent_solaris_devpoll_init(fdevents
*ev
) {
72 force_assert(POLLIN
== FDEVENT_IN
);
73 force_assert(POLLPRI
== FDEVENT_PRI
);
74 force_assert(POLLOUT
== FDEVENT_OUT
);
75 force_assert(POLLERR
== FDEVENT_ERR
);
76 force_assert(POLLHUP
== FDEVENT_HUP
);
77 force_assert(POLLNVAL
== FDEVENT_NVAL
);
78 force_assert(POLLRDHUP
== FDEVENT_RDHUP
);
80 ev
->type
= FDEVENT_HANDLER_SOLARIS_DEVPOLL
;
81 ev
->event_set
= fdevent_solaris_devpoll_event_set
;
82 ev
->event_del
= fdevent_solaris_devpoll_event_del
;
83 ev
->poll
= fdevent_solaris_devpoll_poll
;
84 ev
->reset
= fdevent_solaris_devpoll_reset
;
85 ev
->free
= fdevent_solaris_devpoll_free
;
87 ev
->devpollfds
= malloc(sizeof(*ev
->devpollfds
) * ev
->maxfds
);
88 force_assert(NULL
!= ev
->devpollfds
);