Lines Matching refs:ospoll
32 #include "ospoll.h"
72 struct ospoll {
93 struct ospoll {
113 struct ospoll {
130 ospoll_find(struct ospoll *ospoll, int fd)
133 int hi = ospoll->num - 1;
138 int t = ospoll->fds[m]->fd;
141 int t = ospoll->fds[m].fd;
156 ospoll_clean_deleted(struct ospoll *ospoll)
160 xorg_list_for_each_entry_safe(osfd, tmp, &ospoll->deleted, deleted) {
201 struct ospoll *
205 struct ospoll *ospoll = calloc(1, sizeof (struct ospoll));
207 ospoll->ps = pollset_create(-1);
208 if (ospoll->ps < 0) {
209 free (ospoll);
212 return ospoll;
215 struct ospoll *ospoll = calloc(1, sizeof (struct ospoll));
217 ospoll->epoll_fd = port_create();
218 if (ospoll->epoll_fd < 0) {
219 free (ospoll);
222 xorg_list_init(&ospoll->deleted);
223 return ospoll;
226 struct ospoll *ospoll = calloc(1, sizeof (struct ospoll));
228 ospoll->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
229 if (ospoll->epoll_fd < 0) {
230 free (ospoll);
233 xorg_list_init(&ospoll->deleted);
234 return ospoll;
237 return calloc(1, sizeof (struct ospoll));
242 ospoll_destroy(struct ospoll *ospoll)
245 if (ospoll) {
246 assert (ospoll->num == 0);
247 pollset_destroy(ospoll->ps);
248 free(ospoll->fds);
249 free(ospoll);
253 if (ospoll) {
254 assert (ospoll->num == 0);
255 close(ospoll->epoll_fd);
256 ospoll_clean_deleted(ospoll);
257 free(ospoll->fds);
258 free(ospoll);
262 if (ospoll) {
263 assert (ospoll->num == 0);
264 free (ospoll->fds);
265 free (ospoll->osfds);
266 free (ospoll);
272 ospoll_add(struct ospoll *ospoll, int fd,
277 int pos = ospoll_find(ospoll, fd);
280 if (ospoll->num == ospoll->size) {
282 int new_size = ospoll->size ? ospoll->size * 2 : MAXCLIENTS * 2;
284 new_fds = reallocarray(ospoll->fds, new_size, sizeof (ospoll->fds[0]));
287 ospoll->fds = new_fds;
288 ospoll->size = new_size;
291 array_insert(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
292 ospoll->num++;
294 ospoll->fds[pos].fd = fd;
295 ospoll->fds[pos].xevents = 0;
296 ospoll->fds[pos].revents = 0;
298 ospoll->fds[pos].trigger = trigger;
299 ospoll->fds[pos].callback = callback;
300 ospoll->fds[pos].data = data;
310 if (ospoll->num >= ospoll->size) {
312 int new_size = ospoll->size ? ospoll->size * 2 : MAXCLIENTS * 2;
314 new_fds = reallocarray(ospoll->fds, new_size, sizeof (ospoll->fds[0]));
319 ospoll->fds = new_fds;
320 ospoll->size = new_size;
327 array_insert(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
328 ospoll->fds[pos] = osfd;
329 ospoll->num++;
331 osfd = ospoll->fds[pos];
348 if (ospoll->num >= ospoll->size) {
350 int new_size = ospoll->size ? ospoll->size * 2 : MAXCLIENTS * 2;
352 new_fds = reallocarray(ospoll->fds, new_size, sizeof (ospoll->fds[0]));
357 ospoll->fds = new_fds;
358 ospoll->size = new_size;
365 if (epoll_ctl(ospoll->epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) {
373 array_insert(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
374 ospoll->fds[pos] = osfd;
375 ospoll->num++;
377 osfd = ospoll->fds[pos];
385 if (ospoll->num == ospoll->size) {
388 int new_size = ospoll->size ? ospoll->size * 2 : MAXCLIENTS * 2;
390 new_fds = reallocarray(ospoll->fds, new_size, sizeof (ospoll->fds[0]));
393 ospoll->fds = new_fds;
394 new_osfds = reallocarray(ospoll->osfds, new_size, sizeof (ospoll->osfds[0]));
397 ospoll->osfds = new_osfds;
398 ospoll->size = new_size;
401 array_insert(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
402 array_insert(ospoll->osfds, ospoll->num, sizeof (ospoll->osfds[0]), pos);
403 ospoll->num++;
404 ospoll->changed = TRUE;
406 ospoll->fds[pos].fd = fd;
407 ospoll->fds[pos].events = 0;
408 ospoll->fds[pos].revents = 0;
409 ospoll->osfds[pos].revents = 0;
411 ospoll->osfds[pos].trigger = trigger;
412 ospoll->osfds[pos].callback = callback;
413 ospoll->osfds[pos].data = data;
419 ospoll_remove(struct ospoll *ospoll, int fd)
421 int pos = ospoll_find(ospoll, fd);
423 pos = ospoll_find(ospoll, fd);
426 struct ospollfd *osfd = &ospoll->fds[pos];
428 pollset_ctl(ospoll->ps, &ctl, 1);
430 array_delete(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
431 ospoll->num--;
434 struct ospollfd *osfd = ospoll->fds[pos];
435 port_dissociate(ospoll->epoll_fd, PORT_SOURCE_FD, fd);
437 array_delete(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
438 ospoll->num--;
441 xorg_list_add(&osfd->deleted, &ospoll->deleted);
444 struct ospollfd *osfd = ospoll->fds[pos];
448 (void) epoll_ctl(ospoll->epoll_fd, EPOLL_CTL_DEL, fd, &ev);
450 array_delete(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
451 ospoll->num--;
454 xorg_list_add(&osfd->deleted, &ospoll->deleted);
457 array_delete(ospoll->fds, ospoll->num, sizeof (ospoll->fds[0]), pos);
458 array_delete(ospoll->osfds, ospoll->num, sizeof (ospoll->osfds[0]), pos);
459 ospoll->num--;
460 ospoll->changed = TRUE;
467 epoll_mod(struct ospoll *ospoll, struct ospollfd *osfd)
474 port_associate(ospoll->epoll_fd, PORT_SOURCE_FD, osfd->fd, events, osfd);
480 epoll_mod(struct ospoll *ospoll, struct ospollfd *osfd)
491 (void) epoll_ctl(ospoll->epoll_fd, EPOLL_CTL_MOD, osfd->fd, &ev);
496 ospoll_listen(struct ospoll *ospoll, int fd, int xevents)
498 int pos = ospoll_find(ospoll, fd);
505 ospoll->fds[pos].revents &= ~POLLIN;
509 ospoll->fds[pos].revents &= ~POLLOUT;
511 pollset_ctl(ospoll->ps, &ctl, 1);
512 ospoll->fds[pos].xevents |= xevents;
515 struct ospollfd *osfd = ospoll->fds[pos];
517 epoll_mod(ospoll, osfd);
521 ospoll->fds[pos].events |= POLLIN;
522 ospoll->osfds[pos].revents &= ~POLLIN;
525 ospoll->fds[pos].events |= POLLOUT;
526 ospoll->osfds[pos].revents &= ~POLLOUT;
533 ospoll_mute(struct ospoll *ospoll, int fd, int xevents)
535 int pos = ospoll_find(ospoll, fd);
539 struct ospollfd *osfd = &ospoll->fds[pos];
542 pollset_ctl(ospoll->ps, &ctl, 1);
551 pollset_ctl(ospoll->ps, &ctl, 1);
555 struct ospollfd *osfd = ospoll->fds[pos];
557 epoll_mod(ospoll, osfd);
561 ospoll->fds[pos].events &= ~POLLIN;
563 ospoll->fds[pos].events &= ~POLLOUT;
570 ospoll_wait(struct ospoll *ospoll, int timeout)
577 nready = pollset_poll(ospoll->ps, events, MAX_EVENTS, timeout);
580 int pos = ospoll_find(ospoll, ev->fd);
581 struct ospollfd *osfd = &ospoll->fds[pos];
610 if (port_getn(ospoll->epoll_fd, events, MAX_EVENTS, &nget, &port_timeout)
632 epoll_mod(ospoll, osfd);
635 ospoll_clean_deleted(ospoll);
642 nready = epoll_wait(ospoll->epoll_fd, events, MAX_EVENTS, timeout);
659 ospoll_clean_deleted(ospoll);
662 nready = xserver_poll(ospoll->fds, ospoll->num, timeout);
663 ospoll->changed = FALSE;
666 for (f = 0; f < ospoll->num; f++) {
667 short revents = ospoll->fds[f].revents;
668 short oldevents = ospoll->osfds[f].revents;
670 ospoll->osfds[f].revents = (revents & (POLLIN|POLLOUT));
671 if (ospoll->osfds[f].trigger == ospoll_trigger_edge)
681 ospoll->osfds[f].callback(ospoll->fds[f].fd, xevents,
682 ospoll->osfds[f].data);
687 if (ospoll->changed)
697 ospoll_reset_events(struct ospoll *ospoll, int fd)
700 int pos = ospoll_find(ospoll, fd);
705 ospoll->fds[pos].revents = 0;
708 int pos = ospoll_find(ospoll, fd);
713 epoll_mod(ospoll, ospoll->fds[pos]);
716 int pos = ospoll_find(ospoll, fd);
721 ospoll->osfds[pos].revents = 0;
726 ospoll_data(struct ospoll *ospoll, int fd)
728 int pos = ospoll_find(ospoll, fd);
733 return ospoll->fds[pos].data;
736 return ospoll->fds[pos]->data;
739 return ospoll->osfds[pos].data;