aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/iomgr/wakeup_fd_posix.c
diff options
context:
space:
mode:
authorGravatar Ken Payson <kpayson@google.com>2016-08-06 21:27:29 -0700
committerGravatar Ken Payson <kpayson@google.com>2016-09-14 14:25:46 -0700
commit31caabdead52000354c4fdd88b68bb3041ca8c4a (patch)
tree67ec849190f0211b15c506397fbc78201b44d29b /src/core/lib/iomgr/wakeup_fd_posix.c
parent93b09478f0264f62e577b215dea7bc908abc6b98 (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.c15
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);