blob: 85526402bd97b32c85239f3d5a4d00749605a904 [file] [log] [blame]
David Klempner7f3ed1e2015-01-16 15:35:56 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
David Klempner7f3ed1e2015-01-16 15:35:56 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
murgatroid9954070892016-08-08 17:01:18 -070034#include "src/core/lib/iomgr/port.h"
Nicolas "Pixel" Noblec8fd2d12015-01-30 20:23:27 +010035
murgatroid99623dd4f2016-08-08 17:31:27 -070036#ifdef GRPC_POSIX_WAKEUP_FD
Nicolas "Pixel" Noblec8fd2d12015-01-30 20:23:27 +010037
David Klempner78dc6cd2015-01-26 15:02:51 -080038#include <stddef.h>
Ken Payson31caabd2016-08-06 21:27:29 -070039#include "src/core/lib/iomgr/wakeup_fd_cv.h"
Craig Tiller9533d042016-03-25 17:11:06 -070040#include "src/core/lib/iomgr/wakeup_fd_pipe.h"
41#include "src/core/lib/iomgr/wakeup_fd_posix.h"
David Klempner7f3ed1e2015-01-16 15:35:56 -080042
Ken Payson82e4ec72016-10-13 12:26:01 -070043extern grpc_wakeup_fd_vtable grpc_cv_wakeup_fd_vtable;
David Klempner78dc6cd2015-01-26 15:02:51 -080044static const grpc_wakeup_fd_vtable *wakeup_fd_vtable = NULL;
Ken Paysoncd7d0472016-10-11 12:24:20 -070045
Craig Tillerf218c8b2015-12-10 14:57:56 -080046int grpc_allow_specialized_wakeup_fd = 1;
Ken Payson31caabd2016-08-06 21:27:29 -070047int grpc_allow_pipe_wakeup_fd = 1;
Ken Payson82e4ec72016-10-13 12:26:01 -070048
49int has_real_wakeup_fd = 1;
50int cv_wakeup_fds_enabled = 0;
David Klempner7f3ed1e2015-01-16 15:35:56 -080051
David Klempner78dc6cd2015-01-26 15:02:51 -080052void grpc_wakeup_fd_global_init(void) {
Craig Tillerf218c8b2015-12-10 14:57:56 -080053 if (grpc_allow_specialized_wakeup_fd &&
54 grpc_specialized_wakeup_fd_vtable.check_availability()) {
Craig Tillere1a03a62015-02-02 07:46:55 -080055 wakeup_fd_vtable = &grpc_specialized_wakeup_fd_vtable;
Ken Payson31caabd2016-08-06 21:27:29 -070056 } else if (grpc_allow_pipe_wakeup_fd &&
57 grpc_pipe_wakeup_fd_vtable.check_availability()) {
Craig Tillere1a03a62015-02-02 07:46:55 -080058 wakeup_fd_vtable = &grpc_pipe_wakeup_fd_vtable;
Ken Payson31caabd2016-08-06 21:27:29 -070059 } else {
Ken Payson82e4ec72016-10-13 12:26:01 -070060 has_real_wakeup_fd = 0;
David Klempner78dc6cd2015-01-26 15:02:51 -080061 }
62}
David Klempnerdbb4f942015-01-21 17:45:18 -080063
Craig Tillerd6c98df2015-08-18 09:33:44 -070064void grpc_wakeup_fd_global_destroy(void) { wakeup_fd_vtable = NULL; }
David Klempner7f3ed1e2015-01-16 15:35:56 -080065
Ken Payson82e4ec72016-10-13 12:26:01 -070066int grpc_has_wakeup_fd(void) { return has_real_wakeup_fd; }
Ken Paysoncd7d0472016-10-11 12:24:20 -070067
Ken Payson82e4ec72016-10-13 12:26:01 -070068int grpc_cv_wakeup_fds_enabled(void) { return cv_wakeup_fds_enabled; }
69
70void grpc_enable_cv_wakeup_fds(int enable) { cv_wakeup_fds_enabled = enable; }
Ken Paysoncd7d0472016-10-11 12:24:20 -070071
Craig Tiller4f1d0f32016-05-06 17:12:37 -070072grpc_error *grpc_wakeup_fd_init(grpc_wakeup_fd *fd_info) {
Ken Payson82e4ec72016-10-13 12:26:01 -070073 if (cv_wakeup_fds_enabled) {
Ken Paysoncd7d0472016-10-11 12:24:20 -070074 return grpc_cv_wakeup_fd_vtable.init(fd_info);
75 }
Craig Tiller4f1d0f32016-05-06 17:12:37 -070076 return wakeup_fd_vtable->init(fd_info);
David Klempner78dc6cd2015-01-26 15:02:51 -080077}
78
Craig Tiller4f1d0f32016-05-06 17:12:37 -070079grpc_error *grpc_wakeup_fd_consume_wakeup(grpc_wakeup_fd *fd_info) {
Ken Payson82e4ec72016-10-13 12:26:01 -070080 if (cv_wakeup_fds_enabled) {
Ken Paysoncd7d0472016-10-11 12:24:20 -070081 return grpc_cv_wakeup_fd_vtable.consume(fd_info);
82 }
Craig Tiller4f1d0f32016-05-06 17:12:37 -070083 return wakeup_fd_vtable->consume(fd_info);
David Klempner78dc6cd2015-01-26 15:02:51 -080084}
85
Craig Tiller4f1d0f32016-05-06 17:12:37 -070086grpc_error *grpc_wakeup_fd_wakeup(grpc_wakeup_fd *fd_info) {
Ken Payson82e4ec72016-10-13 12:26:01 -070087 if (cv_wakeup_fds_enabled) {
Ken Paysoncd7d0472016-10-11 12:24:20 -070088 return grpc_cv_wakeup_fd_vtable.wakeup(fd_info);
89 }
Craig Tiller4f1d0f32016-05-06 17:12:37 -070090 return wakeup_fd_vtable->wakeup(fd_info);
David Klempner78dc6cd2015-01-26 15:02:51 -080091}
92
Craig Tiller5ddbb9d2015-07-29 15:58:11 -070093void grpc_wakeup_fd_destroy(grpc_wakeup_fd *fd_info) {
Ken Payson82e4ec72016-10-13 12:26:01 -070094 if (cv_wakeup_fds_enabled) {
Ken Paysoncd7d0472016-10-11 12:24:20 -070095 grpc_cv_wakeup_fd_vtable.destroy(fd_info);
96 } else {
97 wakeup_fd_vtable->destroy(fd_info);
98 }
David Klempner78dc6cd2015-01-26 15:02:51 -080099}
Nicolas "Pixel" Noblec8fd2d12015-01-30 20:23:27 +0100100
murgatroid99623dd4f2016-08-08 17:31:27 -0700101#endif /* GRPC_POSIX_WAKEUP_FD */