diff options
author | Ken Payson <kpayson@google.com> | 2016-08-06 21:27:29 -0700 |
---|---|---|
committer | Ken Payson <kpayson@google.com> | 2016-09-14 14:25:46 -0700 |
commit | 31caabdead52000354c4fdd88b68bb3041ca8c4a (patch) | |
tree | 67ec849190f0211b15c506397fbc78201b44d29b /src/core/lib/iomgr/wakeup_fd_posix.c | |
parent | 93b09478f0264f62e577b215dea7bc908abc6b98 (diff) |
Add shim to support condition variable wakeup fds where pipe/eventfd is not available
Diffstat (limited to 'src/core/lib/iomgr/wakeup_fd_posix.c')
-rw-r--r-- | src/core/lib/iomgr/wakeup_fd_posix.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/core/lib/iomgr/wakeup_fd_posix.c b/src/core/lib/iomgr/wakeup_fd_posix.c index 046208abc8..564b836154 100644 --- a/src/core/lib/iomgr/wakeup_fd_posix.c +++ b/src/core/lib/iomgr/wakeup_fd_posix.c @@ -36,22 +36,33 @@ #ifdef GPR_POSIX_WAKEUP_FD #include <stddef.h> +#include "src/core/lib/iomgr/wakeup_fd_cv.h" #include "src/core/lib/iomgr/wakeup_fd_pipe.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" static const grpc_wakeup_fd_vtable *wakeup_fd_vtable = NULL; int grpc_allow_specialized_wakeup_fd = 1; +int grpc_allow_pipe_wakeup_fd = 1; void grpc_wakeup_fd_global_init(void) { if (grpc_allow_specialized_wakeup_fd && grpc_specialized_wakeup_fd_vtable.check_availability()) { wakeup_fd_vtable = &grpc_specialized_wakeup_fd_vtable; - } else { + } else if (grpc_allow_pipe_wakeup_fd && + grpc_pipe_wakeup_fd_vtable.check_availability()) { wakeup_fd_vtable = &grpc_pipe_wakeup_fd_vtable; + } else { + wakeup_fd_vtable = &grpc_cv_wakeup_fd_vtable; + grpc_global_cv_fd_table_init(); } } -void grpc_wakeup_fd_global_destroy(void) { wakeup_fd_vtable = NULL; } +void grpc_wakeup_fd_global_destroy(void) { + if (wakeup_fd_vtable == &grpc_cv_wakeup_fd_vtable) { + grpc_global_cv_fd_table_shutdown(); + } + wakeup_fd_vtable = NULL; +} grpc_error *grpc_wakeup_fd_init(grpc_wakeup_fd *fd_info) { return wakeup_fd_vtable->init(fd_info); |