Lines Matching refs:pfds

848 int ofi_pollfds_create(struct ofi_pollfds **pfds)  in ofi_pollfds_create()  argument
852 *pfds = calloc(1, sizeof(struct ofi_pollfds)); in ofi_pollfds_create()
853 if (!*pfds) in ofi_pollfds_create()
856 (*pfds)->size = 64; in ofi_pollfds_create()
857 (*pfds)->fds = calloc((*pfds)->size, sizeof(*(*pfds)->fds) + in ofi_pollfds_create()
858 sizeof(*(*pfds)->context)); in ofi_pollfds_create()
859 if (!(*pfds)->fds) { in ofi_pollfds_create()
863 (*pfds)->context = (void *)((*pfds)->fds + (*pfds)->size); in ofi_pollfds_create()
865 ret = fd_signal_init(&(*pfds)->signal); in ofi_pollfds_create()
869 (*pfds)->fds[(*pfds)->nfds].fd = (*pfds)->signal.fd[FI_READ_FD]; in ofi_pollfds_create()
870 (*pfds)->fds[(*pfds)->nfds].events = POLLIN; in ofi_pollfds_create()
871 (*pfds)->context[(*pfds)->nfds++] = NULL; in ofi_pollfds_create()
872 slist_init(&(*pfds)->work_item_list); in ofi_pollfds_create()
873 fastlock_init(&(*pfds)->lock); in ofi_pollfds_create()
876 free((*pfds)->fds); in ofi_pollfds_create()
878 free(*pfds); in ofi_pollfds_create()
882 static int ofi_pollfds_ctl(struct ofi_pollfds *pfds, enum ofi_pollfds_ctl op, in ofi_pollfds_ctl() argument
895 fastlock_acquire(&pfds->lock); in ofi_pollfds_ctl()
896 slist_insert_tail(&item->entry, &pfds->work_item_list); in ofi_pollfds_ctl()
897 fd_signal_set(&pfds->signal); in ofi_pollfds_ctl()
898 fastlock_release(&pfds->lock); in ofi_pollfds_ctl()
902 int ofi_pollfds_add(struct ofi_pollfds *pfds, int fd, uint32_t events, in ofi_pollfds_add() argument
905 return ofi_pollfds_ctl(pfds, POLLFDS_CTL_ADD, fd, events, context); in ofi_pollfds_add()
908 int ofi_pollfds_mod(struct ofi_pollfds *pfds, int fd, uint32_t events, in ofi_pollfds_mod() argument
911 return ofi_pollfds_ctl(pfds, POLLFDS_CTL_MOD, fd, events, context); in ofi_pollfds_mod()
914 int ofi_pollfds_del(struct ofi_pollfds *pfds, int fd) in ofi_pollfds_del() argument
916 return ofi_pollfds_ctl(pfds, POLLFDS_CTL_DEL, fd, 0, NULL); in ofi_pollfds_del()
919 static int ofi_pollfds_array(struct ofi_pollfds *pfds) in ofi_pollfds_array() argument
924 fds = calloc(pfds->size + 64, in ofi_pollfds_array()
925 sizeof(*pfds->fds) + sizeof(*pfds->context)); in ofi_pollfds_array()
929 pfds->size += 64; in ofi_pollfds_array()
930 contexts = fds + pfds->size; in ofi_pollfds_array()
932 memcpy(fds, pfds->fds, pfds->nfds * sizeof(*pfds->fds)); in ofi_pollfds_array()
933 memcpy(contexts, pfds->context, pfds->nfds * sizeof(*pfds->context)); in ofi_pollfds_array()
934 free(pfds->fds); in ofi_pollfds_array()
935 pfds->fds = fds; in ofi_pollfds_array()
936 pfds->context = contexts; in ofi_pollfds_array()
940 static void ofi_pollfds_cleanup(struct ofi_pollfds *pfds) in ofi_pollfds_cleanup() argument
944 for (i = 0; i < pfds->nfds; i++) { in ofi_pollfds_cleanup()
945 while (pfds->fds[i].fd == INVALID_SOCKET) { in ofi_pollfds_cleanup()
946 pfds->fds[i].fd = pfds->fds[pfds->nfds-1].fd; in ofi_pollfds_cleanup()
947 pfds->fds[i].events = pfds->fds[pfds->nfds-1].events; in ofi_pollfds_cleanup()
948 pfds->fds[i].revents = pfds->fds[pfds->nfds-1].revents; in ofi_pollfds_cleanup()
949 pfds->context[i] = pfds->context[pfds->nfds-1]; in ofi_pollfds_cleanup()
950 pfds->nfds--; in ofi_pollfds_cleanup()
951 if (i == pfds->nfds) in ofi_pollfds_cleanup()
957 static void ofi_pollfds_process_work(struct ofi_pollfds *pfds) in ofi_pollfds_process_work() argument
963 while (!slist_empty(&pfds->work_item_list)) { in ofi_pollfds_process_work()
964 if ((pfds->nfds == pfds->size) && in ofi_pollfds_process_work()
965 ofi_pollfds_array(pfds)) in ofi_pollfds_process_work()
968 entry = slist_remove_head(&pfds->work_item_list); in ofi_pollfds_process_work()
973 pfds->fds[pfds->nfds].fd = item->fd; in ofi_pollfds_process_work()
974 pfds->fds[pfds->nfds].events = item->events; in ofi_pollfds_process_work()
975 pfds->fds[pfds->nfds].revents = 0; in ofi_pollfds_process_work()
976 pfds->context[pfds->nfds] = item->context; in ofi_pollfds_process_work()
977 pfds->nfds++; in ofi_pollfds_process_work()
980 for (i = 0; i < pfds->nfds; i++) { in ofi_pollfds_process_work()
981 if (pfds->fds[i].fd == item->fd) { in ofi_pollfds_process_work()
982 pfds->fds[i].fd = INVALID_SOCKET; in ofi_pollfds_process_work()
988 for (i = 0; i < pfds->nfds; i++) { in ofi_pollfds_process_work()
989 if (pfds->fds[i].fd == item->fd) { in ofi_pollfds_process_work()
990 pfds->fds[i].events = item->events; in ofi_pollfds_process_work()
991 pfds->fds[i].revents &= item->events; in ofi_pollfds_process_work()
992 pfds->context[i] = item->context; in ofi_pollfds_process_work()
1004 ofi_pollfds_cleanup(pfds); in ofi_pollfds_process_work()
1007 int ofi_pollfds_wait(struct ofi_pollfds *pfds, void **contexts, in ofi_pollfds_wait() argument
1015 ret = poll(pfds->fds, pfds->nfds, timeout); in ofi_pollfds_wait()
1021 if (pfds->fds[0].revents) in ofi_pollfds_wait()
1022 fd_signal_reset(&pfds->signal); in ofi_pollfds_wait()
1024 fastlock_acquire(&pfds->lock); in ofi_pollfds_wait()
1025 if (!slist_empty(&pfds->work_item_list)) in ofi_pollfds_wait()
1026 ofi_pollfds_process_work(pfds); in ofi_pollfds_wait()
1028 fastlock_release(&pfds->lock); in ofi_pollfds_wait()
1031 for (i = pfds->index; i < pfds->nfds && found < max_contexts; i++) { in ofi_pollfds_wait()
1032 if (pfds->fds[i].revents && i) { in ofi_pollfds_wait()
1033 contexts[found++] = pfds->context[i]; in ofi_pollfds_wait()
1034 pfds->index = i; in ofi_pollfds_wait()
1037 for (i = 0; i < pfds->index && found < max_contexts; i++) { in ofi_pollfds_wait()
1038 if (pfds->fds[i].revents && i) { in ofi_pollfds_wait()
1039 contexts[found++] = pfds->context[i]; in ofi_pollfds_wait()
1040 pfds->index = i; in ofi_pollfds_wait()
1052 void ofi_pollfds_close(struct ofi_pollfds *pfds) in ofi_pollfds_close() argument
1057 if (pfds) { in ofi_pollfds_close()
1058 while (!slist_empty(&pfds->work_item_list)) { in ofi_pollfds_close()
1059 entry = slist_remove_head(&pfds->work_item_list); in ofi_pollfds_close()
1065 fastlock_destroy(&pfds->lock); in ofi_pollfds_close()
1066 fd_signal_free(&pfds->signal); in ofi_pollfds_close()
1067 free(pfds->fds); in ofi_pollfds_close()
1068 free(pfds); in ofi_pollfds_close()