iomgr_posix_cfstream.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
32 
34 
36 
37 #ifdef GRPC_CFSTREAM_IOMGR
38 
49 
50 static const char* grpc_cfstream_env_var = "grpc_cfstream";
51 static const char* grpc_cfstream_run_loop_env_var = "GRPC_CFSTREAM_RUN_LOOP";
52 
53 extern grpc_tcp_server_vtable grpc_posix_tcp_server_vtable;
54 extern grpc_tcp_client_vtable grpc_posix_tcp_client_vtable;
55 extern grpc_tcp_client_vtable grpc_cfstream_client_vtable;
57 extern grpc_pollset_vtable grpc_posix_pollset_vtable;
58 extern grpc_pollset_set_vtable grpc_posix_pollset_set_vtable;
59 
60 static void apple_iomgr_platform_init(void) { grpc_pollset_global_init(); }
61 
62 static void apple_iomgr_platform_flush(void) {}
63 
64 static void apple_iomgr_platform_shutdown(void) {
66 }
67 
68 static void apple_iomgr_platform_shutdown_background_closure(void) {}
69 
70 static bool apple_iomgr_platform_is_any_background_poller_thread(void) {
71  return false;
72 }
73 
74 static bool apple_iomgr_platform_add_closure_to_background_poller(
76  return false;
77 }
78 
79 static grpc_iomgr_platform_vtable apple_vtable = {
80  apple_iomgr_platform_init,
81  apple_iomgr_platform_flush,
82  apple_iomgr_platform_shutdown,
83  apple_iomgr_platform_shutdown_background_closure,
84  apple_iomgr_platform_is_any_background_poller_thread,
85  apple_iomgr_platform_add_closure_to_background_poller};
86 
87 namespace {
88 struct CFStreamEnv {
89  bool enable_cfstream;
90  bool enable_cfstream_run_loop;
91 };
92 
93 // Parses environment variables for CFStream specific settings
94 CFStreamEnv ParseEnvForCFStream() {
95  CFStreamEnv env;
96  char* enable_cfstream_str = getenv(grpc_cfstream_env_var);
97  env.enable_cfstream =
98  enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0';
99  char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var);
100  // CFStream run-loop is disabled by default. The user has to enable it
101  // explicitly with environment variable.
102  env.enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr &&
103  enable_cfstream_run_loop_str[0] == '1';
104  return env;
105 }
106 
107 void MaybeInitializeTcpPosix(void) {
108  CFStreamEnv env = ParseEnvForCFStream();
109  if (!env.enable_cfstream || !env.enable_cfstream_run_loop) {
110  grpc_tcp_posix_init();
111  }
112 }
113 
114 void MaybeShutdownTcpPosix(void) {
115  CFStreamEnv env = ParseEnvForCFStream();
116  if (!env.enable_cfstream || !env.enable_cfstream_run_loop) {
117  grpc_tcp_posix_shutdown();
118  }
119 }
120 } // namespace
121 
122 static void iomgr_platform_init(void) {
123  MaybeInitializeTcpPosix();
126 }
127 
128 static void iomgr_platform_flush(void) {}
129 
130 static void iomgr_platform_shutdown(void) {
133  MaybeShutdownTcpPosix();
134 }
135 
136 static void iomgr_platform_shutdown_background_closure(void) {
138 }
139 
140 static bool iomgr_platform_is_any_background_poller_thread(void) {
142 }
143 
144 static bool iomgr_platform_add_closure_to_background_poller(
147 }
148 
150  iomgr_platform_init,
151  iomgr_platform_flush,
152  iomgr_platform_shutdown,
153  iomgr_platform_shutdown_background_closure,
154  iomgr_platform_is_any_background_poller_thread,
155  iomgr_platform_add_closure_to_background_poller};
156 
158  CFStreamEnv env = ParseEnvForCFStream();
159  if (!env.enable_cfstream) {
160  // Use POSIX sockets for both client and server
161  grpc_set_tcp_client_impl(&grpc_posix_tcp_client_vtable);
162  grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable);
163  grpc_set_pollset_vtable(&grpc_posix_pollset_vtable);
164  grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable);
166  } else if (env.enable_cfstream && !env.enable_cfstream_run_loop) {
167  // Use CFStream with dispatch queue for client; use POSIX sockets for server
168  grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable);
169  grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable);
170  grpc_set_pollset_vtable(&grpc_posix_pollset_vtable);
171  grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable);
173  } else {
174  // Use CFStream with CFRunLoop for client; server not supported
175  grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable);
176  grpc_set_pollset_vtable(&grpc_apple_pollset_vtable);
177  grpc_set_pollset_set_vtable(&grpc_apple_pollset_set_vtable);
178  grpc_set_iomgr_platform_vtable(&apple_vtable);
179  }
183 }
184 
186  char* enable_cfstream_str = getenv(grpc_cfstream_env_var);
187  bool enable_cfstream =
188  enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0';
189  char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var);
190  // CFStream run-loop is disabled by default. The user has to enable it
191  // explicitly with environment variable.
192  bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr &&
193  enable_cfstream_run_loop_str[0] == '1';
194  if (enable_cfstream && enable_cfstream_run_loop) {
195  return false;
196  } else {
198  }
199 }
200 
201 #endif /* GRPC_CFSTREAM_IOMGR */
trace.h
grpc_pollset_vtable
Definition: pollset.h:41
vtable
static const grpc_transport_vtable vtable
Definition: binder_transport.cc:680
generate.env
env
Definition: generate.py:37
iomgr_internal.h
grpc_timer_vtable
Definition: iomgr/timer.h:61
resolve_address.h
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_event_engine_shutdown
void grpc_event_engine_shutdown(void)
grpc_pollset_set_vtable
Definition: pollset_set.h:32
grpc_set_default_iomgr_platform
void grpc_set_default_iomgr_platform()
Definition: memory_quota_test.cc:167
grpc_pollset_global_shutdown
void grpc_pollset_global_shutdown()
Definition: pollset.cc:31
grpc_set_timer_impl
void grpc_set_timer_impl(grpc_timer_vtable *vtable)
Definition: iomgr/timer.cc:27
grpc_set_iomgr_platform_vtable
void grpc_set_iomgr_platform_vtable(grpc_iomgr_platform_vtable *vtable)
Definition: iomgr_internal.cc:31
grpc_iomgr_run_in_background
bool grpc_iomgr_run_in_background()
grpc_pollset_global_init
void grpc_pollset_global_init()
Definition: pollset.cc:29
grpc_add_closure_to_background_poller
bool grpc_add_closure_to_background_poller(grpc_closure *closure, grpc_error_handle error)
ev_posix.h
grpc_set_tcp_client_impl
void grpc_set_tcp_client_impl(grpc_tcp_client_vtable *impl)
Definition: tcp_client.cc:39
resolve_address_posix.h
tcp_posix.h
grpc_set_pollset_vtable
void grpc_set_pollset_vtable(grpc_pollset_vtable *vtable)
Definition: pollset.cc:25
tcp_client.h
grpc_event_engine_run_in_background
bool grpc_event_engine_run_in_background()
grpc_wakeup_fd_global_init
void grpc_wakeup_fd_global_init(void)
grpc_event_engine_init
void grpc_event_engine_init(void)
grpc_set_pollset_set_vtable
void grpc_set_pollset_set_vtable(grpc_pollset_set_vtable *vtable)
Definition: pollset_set.cc:25
grpc_shutdown_background_closure
void grpc_shutdown_background_closure()
port.h
env
Definition: env.py:1
grpc_core::SetDNSResolver
void SetDNSResolver(DNSResolver *resolver)
Definition: resolve_address.cc:36
grpc_generic_timer_vtable
grpc_timer_vtable grpc_generic_timer_vtable
Definition: timer_generic.cc:735
closure
Definition: proxy.cc:59
grpc_wakeup_fd_global_destroy
void grpc_wakeup_fd_global_destroy(void)
timer.h
grpc_tcp_client_global_init
void grpc_tcp_client_global_init()
grpc_tcp_client_vtable
Definition: tcp_client.h:32
grpc_is_any_background_poller_thread
bool grpc_is_any_background_poller_thread()
grpc_error
Definition: error_internal.h:42
tcp_server.h
getenv
#define getenv(ptr)
Definition: ares_private.h:106
grpc_closure
Definition: closure.h:56
grpc_set_tcp_server_impl
void grpc_set_tcp_server_impl(grpc_tcp_server_vtable *impl)
Definition: tcp_server.cc:75
grpc_tcp_server_vtable
Definition: tcp_server.h:65
ev_apple.h
grpc_core::NativeDNSResolver::GetOrCreate
static NativeDNSResolver * GetOrCreate()
grpc_iomgr_platform_vtable
Definition: iomgr_internal.h:35
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:08