Introducing grpc_executor, for all your threading needs

pull/3726/head
David Garcia Quintas 10 years ago
parent 1485683fcd
commit 4bc3463108
  1. 6
      BUILD
  2. 2
      Makefile
  3. 2
      build.yaml
  4. 3
      gRPC.podspec
  5. 2
      grpc.gyp
  6. 10
      src/core/iomgr/closure.c
  7. 9
      src/core/iomgr/closure.h
  8. 149
      src/core/iomgr/executor.c
  9. 49
      src/core/iomgr/executor.h
  10. 22
      src/core/iomgr/resolve_address_posix.c
  11. 3
      src/core/surface/init.c
  12. 6
      test/core/iomgr/resolve_address_test.c
  13. 2
      tools/doxygen/Doxyfile.core.internal
  14. 6
      tools/run_tests/sources_and_headers.json
  15. 3
      vsprojects/vcxproj/grpc/grpc.vcxproj
  16. 6
      vsprojects/vcxproj/grpc/grpc.vcxproj.filters
  17. 3
      vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
  18. 6
      vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters

@ -184,6 +184,7 @@ cc_library(
"src/core/iomgr/endpoint.h",
"src/core/iomgr/endpoint_pair.h",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.h",
"src/core/iomgr/iomgr.h",
@ -319,6 +320,7 @@ cc_library(
"src/core/iomgr/endpoint_pair_posix.c",
"src/core/iomgr/endpoint_pair_windows.c",
"src/core/iomgr/exec_ctx.c",
"src/core/iomgr/executor.c",
"src/core/iomgr/fd_posix.c",
"src/core/iomgr/iocp_windows.c",
"src/core/iomgr/iomgr.c",
@ -470,6 +472,7 @@ cc_library(
"src/core/iomgr/endpoint.h",
"src/core/iomgr/endpoint_pair.h",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.h",
"src/core/iomgr/iomgr.h",
@ -585,6 +588,7 @@ cc_library(
"src/core/iomgr/endpoint_pair_posix.c",
"src/core/iomgr/endpoint_pair_windows.c",
"src/core/iomgr/exec_ctx.c",
"src/core/iomgr/executor.c",
"src/core/iomgr/fd_posix.c",
"src/core/iomgr/iocp_windows.c",
"src/core/iomgr/iomgr.c",
@ -1109,6 +1113,7 @@ objc_library(
"src/core/iomgr/endpoint_pair_posix.c",
"src/core/iomgr/endpoint_pair_windows.c",
"src/core/iomgr/exec_ctx.c",
"src/core/iomgr/executor.c",
"src/core/iomgr/fd_posix.c",
"src/core/iomgr/iocp_windows.c",
"src/core/iomgr/iomgr.c",
@ -1257,6 +1262,7 @@ objc_library(
"src/core/iomgr/endpoint.h",
"src/core/iomgr/endpoint_pair.h",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.h",
"src/core/iomgr/iomgr.h",

@ -4081,6 +4081,7 @@ LIBGRPC_SRC = \
src/core/iomgr/endpoint_pair_posix.c \
src/core/iomgr/endpoint_pair_windows.c \
src/core/iomgr/exec_ctx.c \
src/core/iomgr/executor.c \
src/core/iomgr/fd_posix.c \
src/core/iomgr/iocp_windows.c \
src/core/iomgr/iomgr.c \
@ -4363,6 +4364,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/iomgr/endpoint_pair_posix.c \
src/core/iomgr/endpoint_pair_windows.c \
src/core/iomgr/exec_ctx.c \
src/core/iomgr/executor.c \
src/core/iomgr/fd_posix.c \
src/core/iomgr/iocp_windows.c \
src/core/iomgr/iomgr.c \

@ -144,6 +144,7 @@ filegroups:
- src/core/iomgr/endpoint.h
- src/core/iomgr/endpoint_pair.h
- src/core/iomgr/exec_ctx.h
- src/core/iomgr/executor.h
- src/core/iomgr/fd_posix.h
- src/core/iomgr/iocp_windows.h
- src/core/iomgr/iomgr.h
@ -256,6 +257,7 @@ filegroups:
- src/core/iomgr/endpoint_pair_posix.c
- src/core/iomgr/endpoint_pair_windows.c
- src/core/iomgr/exec_ctx.c
- src/core/iomgr/executor.c
- src/core/iomgr/fd_posix.c
- src/core/iomgr/iocp_windows.c
- src/core/iomgr/iomgr.c

@ -188,6 +188,7 @@ Pod::Spec.new do |s|
'src/core/iomgr/endpoint.h',
'src/core/iomgr/endpoint_pair.h',
'src/core/iomgr/exec_ctx.h',
'src/core/iomgr/executor.h',
'src/core/iomgr/fd_posix.h',
'src/core/iomgr/iocp_windows.h',
'src/core/iomgr/iomgr.h',
@ -330,6 +331,7 @@ Pod::Spec.new do |s|
'src/core/iomgr/endpoint_pair_posix.c',
'src/core/iomgr/endpoint_pair_windows.c',
'src/core/iomgr/exec_ctx.c',
'src/core/iomgr/executor.c',
'src/core/iomgr/fd_posix.c',
'src/core/iomgr/iocp_windows.c',
'src/core/iomgr/iomgr.c',
@ -479,6 +481,7 @@ Pod::Spec.new do |s|
'src/core/iomgr/endpoint.h',
'src/core/iomgr/endpoint_pair.h',
'src/core/iomgr/exec_ctx.h',
'src/core/iomgr/executor.h',
'src/core/iomgr/fd_posix.h',
'src/core/iomgr/iocp_windows.h',
'src/core/iomgr/iomgr.h',

@ -210,6 +210,7 @@
'src/core/iomgr/endpoint_pair_posix.c',
'src/core/iomgr/endpoint_pair_windows.c',
'src/core/iomgr/exec_ctx.c',
'src/core/iomgr/executor.c',
'src/core/iomgr/fd_posix.c',
'src/core/iomgr/iocp_windows.c',
'src/core/iomgr/iomgr.c',
@ -396,6 +397,7 @@
'src/core/iomgr/endpoint_pair_posix.c',
'src/core/iomgr/endpoint_pair_windows.c',
'src/core/iomgr/exec_ctx.c',
'src/core/iomgr/executor.c',
'src/core/iomgr/fd_posix.c',
'src/core/iomgr/iocp_windows.c',
'src/core/iomgr/iomgr.c',

@ -69,3 +69,13 @@ void grpc_closure_list_move(grpc_closure_list *src, grpc_closure_list *dst) {
}
src->head = src->tail = NULL;
}
grpc_closure *grpc_closure_list_pop(grpc_closure_list *list) {
grpc_closure *head;
if (list->head == NULL) {
return NULL;
}
head = list->head;
list->head = list->head->next;
return head;
}

@ -80,9 +80,18 @@ void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
#define GRPC_CLOSURE_LIST_INIT \
{ NULL, NULL }
/** add \a closure to the end of \a list and set \a closure's success to \a
* success */
void grpc_closure_list_add(grpc_closure_list *list, grpc_closure *closure,
int success);
/** append all closures from \a src to \a dst and empty \a src. */
void grpc_closure_list_move(grpc_closure_list *src, grpc_closure_list *dst);
/** pop (return and remove) the head closure from \a list. */
grpc_closure *grpc_closure_list_pop(grpc_closure_list *list);
/** return whether \a list is empty. */
int grpc_closure_list_empty(grpc_closure_list list);
#endif /* GRPC_INTERNAL_CORE_IOMGR_CLOSURE_H */

@ -0,0 +1,149 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "src/core/iomgr/executor.h"
#include <string.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include <grpc/support/thd.h>
#include "src/core/iomgr/exec_ctx.h"
typedef struct grpc_executor_data {
int busy; /**< is the thread currently running? */
int shutting_down; /**< has \a grpc_shutdown() been invoked? */
int pending_join; /**< has the thread finished but not been joined? */
grpc_closure_list closures; /**< collection of pending work */
gpr_thd_id tid; /**< thread id of the thread, only valid if \a busy or \a
pending_join are true */
gpr_thd_options options;
gpr_mu mu;
} grpc_executor;
static grpc_executor g_executor;
void grpc_executor_init() {
memset(&g_executor, 0, sizeof(grpc_executor));
gpr_mu_init(&g_executor.mu);
g_executor.options = gpr_thd_options_default();
gpr_thd_options_set_joinable(&g_executor.options);
}
/* thread body */
static void closure_exec_thread_func(void *ignored) {
grpc_closure *closure;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
while (1) {
gpr_mu_lock(&g_executor.mu);
if (g_executor.shutting_down != 0) {
gpr_mu_unlock(&g_executor.mu);
break;
}
closure = grpc_closure_list_pop(&g_executor.closures);
if (closure == NULL) {
/* no more work, time to die */
GPR_ASSERT(g_executor.busy == 1);
g_executor.busy = 0;
gpr_mu_unlock(&g_executor.mu);
break;
}
gpr_mu_unlock(&g_executor.mu);
closure->cb(&exec_ctx, closure->cb_arg, closure->success);
}
grpc_exec_ctx_finish(&exec_ctx);
}
/* Spawn the thread if new work has arrived a no thread is up */
static void maybe_spawn_locked() {
if (grpc_closure_list_empty(g_executor.closures) == 1) {
return;
}
if (g_executor.shutting_down == 1) {
return;
}
if (g_executor.busy != 0) {
/* Thread still working. New work will be picked up by already running
* thread. Not spawning anything. */
return;
} else if (g_executor.pending_join != 0) {
/* Pickup the remains of the previous incarnations of the thread. */
gpr_thd_join(g_executor.tid);
g_executor.pending_join = 0;
}
/* All previous instances of the thread should have been joined at this point.
* Spawn time! */
g_executor.busy = 1;
gpr_thd_new(&g_executor.tid, closure_exec_thread_func, NULL,
&g_executor.options);
g_executor.pending_join = 1;
}
void grpc_executor_enqueue(grpc_closure *closure, int success) {
gpr_mu_lock(&g_executor.mu);
if (g_executor.shutting_down == 0) {
grpc_closure_list_add(&g_executor.closures, closure, success);
maybe_spawn_locked();
}
gpr_mu_unlock(&g_executor.mu);
}
void grpc_executor_shutdown() {
gpr_thd_id tid;
int pending_join;
grpc_closure *closure;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
gpr_mu_lock(&g_executor.mu);
pending_join = g_executor.pending_join;
tid = g_executor.tid;
g_executor.shutting_down = 1;
gpr_mu_unlock(&g_executor.mu);
/* we can release the lock at this point despite the access to the closure
* list below because we aren't accepting new work */
/* Execute pending callbacks, some may be performing cleanups */
while ((closure = grpc_closure_list_pop(&g_executor.closures)) != NULL) {
closure->cb(&exec_ctx, closure->cb_arg, closure->success);
}
grpc_exec_ctx_finish(&exec_ctx);
GPR_ASSERT(grpc_closure_list_empty(g_executor.closures));
if (pending_join) {
gpr_thd_join(g_executor.tid);
}
gpr_mu_destroy(&g_executor.mu);
}

@ -0,0 +1,49 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef GRPC_INTERNAL_CORE_IOMGR_EXECUTOR_H
#define GRPC_INTERNAL_CORE_IOMGR_EXECUTOR_H
#include "src/core/iomgr/closure.h"
/** initialize the global executor */
void grpc_executor_init();
/** enqueue \a closure for its eventual execution of \a f(arg) on a separate
* thread */
void grpc_executor_enqueue(grpc_closure *closure, int success);
/** shutdown the executor, running all pending work as part of the call */
void grpc_executor_shutdown();
#endif /* GRPC_INTERNAL_CORE_IOMGR_EXECUTOR_H */

@ -41,6 +41,7 @@
#include <sys/un.h>
#include <string.h>
#include "src/core/iomgr/executor.h"
#include "src/core/iomgr/iomgr_internal.h"
#include "src/core/iomgr/sockaddr_utils.h"
#include "src/core/support/block_annotate.h"
@ -57,8 +58,8 @@ typedef struct {
char *name;
char *default_port;
grpc_resolve_cb cb;
grpc_closure request_closure;
void *arg;
grpc_iomgr_object iomgr_object;
} request;
grpc_resolved_addresses *grpc_blocking_resolve_address(
@ -149,20 +150,18 @@ done:
return addrs;
}
/* Thread function to asynch-ify grpc_blocking_resolve_address */
static void do_request_thread(void *rp) {
/* Callback to be passed to grpc_executor to asynch-ify
* grpc_blocking_resolve_address */
static void do_request_thread(grpc_exec_ctx *exec_ctx, void *rp, int success) {
request *r = rp;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_resolved_addresses *resolved =
grpc_blocking_resolve_address(r->name, r->default_port);
void *arg = r->arg;
grpc_resolve_cb cb = r->cb;
gpr_free(r->name);
gpr_free(r->default_port);
cb(&exec_ctx, arg, resolved);
grpc_iomgr_unregister_object(&r->iomgr_object);
cb(exec_ctx, arg, resolved);
gpr_free(r);
grpc_exec_ctx_finish(&exec_ctx);
}
void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) {
@ -173,17 +172,12 @@ void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) {
void grpc_resolve_address(const char *name, const char *default_port,
grpc_resolve_cb cb, void *arg) {
request *r = gpr_malloc(sizeof(request));
gpr_thd_id id;
char *tmp;
gpr_asprintf(&tmp, "resolve_address:name='%s':default_port='%s'", name,
default_port);
grpc_iomgr_register_object(&r->iomgr_object, tmp);
gpr_free(tmp);
grpc_closure_init(&r->request_closure, do_request_thread, r);
r->name = gpr_strdup(name);
r->default_port = gpr_strdup(default_port);
r->cb = cb;
r->arg = arg;
gpr_thd_new(&id, do_request_thread, r, NULL);
grpc_executor_enqueue(&r->request_closure, 1);
}
#endif

@ -47,6 +47,7 @@
#include "src/core/client_config/resolvers/dns_resolver.h"
#include "src/core/client_config/resolvers/sockaddr_resolver.h"
#include "src/core/debug/trace.h"
#include "src/core/iomgr/executor.h"
#include "src/core/iomgr/iomgr.h"
#include "src/core/profiling/timers.h"
#include "src/core/surface/api_trace.h"
@ -108,6 +109,7 @@ void grpc_init(void) {
grpc_register_tracer("connectivity_state", &grpc_connectivity_state_trace);
grpc_security_pre_init();
grpc_iomgr_init();
grpc_executor_init();
grpc_tracer_init("GRPC_TRACE");
/* Only initialize census if noone else has. */
if (census_enabled() == CENSUS_FEATURE_NONE) {
@ -132,6 +134,7 @@ void grpc_shutdown(void) {
gpr_mu_lock(&g_init_mu);
if (--g_initializations == 0) {
grpc_iomgr_shutdown();
grpc_executor_shutdown();
census_shutdown();
grpc_timers_global_destroy();
grpc_tracer_shutdown();

@ -32,7 +32,7 @@
*/
#include "src/core/iomgr/resolve_address.h"
#include "src/core/iomgr/iomgr.h"
#include "src/core/iomgr/executor.h"
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
@ -125,7 +125,7 @@ static void test_unparseable_hostports(void) {
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
grpc_iomgr_init();
grpc_executor_init();
test_localhost();
test_default_port();
test_missing_default_port();
@ -133,6 +133,6 @@ int main(int argc, char **argv) {
test_ipv6_without_port();
test_invalid_ip_addresses();
test_unparseable_hostports();
grpc_iomgr_shutdown();
grpc_executor_shutdown();
return 0;
}

@ -819,6 +819,7 @@ src/core/iomgr/closure.h \
src/core/iomgr/endpoint.h \
src/core/iomgr/endpoint_pair.h \
src/core/iomgr/exec_ctx.h \
src/core/iomgr/executor.h \
src/core/iomgr/fd_posix.h \
src/core/iomgr/iocp_windows.h \
src/core/iomgr/iomgr.h \
@ -954,6 +955,7 @@ src/core/iomgr/endpoint.c \
src/core/iomgr/endpoint_pair_posix.c \
src/core/iomgr/endpoint_pair_windows.c \
src/core/iomgr/exec_ctx.c \
src/core/iomgr/executor.c \
src/core/iomgr/fd_posix.c \
src/core/iomgr/iocp_windows.c \
src/core/iomgr/iomgr.c \

@ -12317,6 +12317,7 @@
"src/core/iomgr/endpoint.h",
"src/core/iomgr/endpoint_pair.h",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.h",
"src/core/iomgr/iomgr.h",
@ -12499,6 +12500,8 @@
"src/core/iomgr/endpoint_pair_windows.c",
"src/core/iomgr/exec_ctx.c",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.c",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.c",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.c",
@ -12822,6 +12825,7 @@
"src/core/iomgr/endpoint.h",
"src/core/iomgr/endpoint_pair.h",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.h",
"src/core/iomgr/iomgr.h",
@ -12989,6 +12993,8 @@
"src/core/iomgr/endpoint_pair_windows.c",
"src/core/iomgr/exec_ctx.c",
"src/core/iomgr/exec_ctx.h",
"src/core/iomgr/executor.c",
"src/core/iomgr/executor.h",
"src/core/iomgr/fd_posix.c",
"src/core/iomgr/fd_posix.h",
"src/core/iomgr/iocp_windows.c",

@ -305,6 +305,7 @@
<ClInclude Include="..\..\..\src\core\iomgr\endpoint.h" />
<ClInclude Include="..\..\..\src\core\iomgr\endpoint_pair.h" />
<ClInclude Include="..\..\..\src\core\iomgr\exec_ctx.h" />
<ClInclude Include="..\..\..\src\core\iomgr\executor.h" />
<ClInclude Include="..\..\..\src\core\iomgr\fd_posix.h" />
<ClInclude Include="..\..\..\src\core\iomgr\iocp_windows.h" />
<ClInclude Include="..\..\..\src\core\iomgr\iomgr.h" />
@ -503,6 +504,8 @@
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\exec_ctx.c">
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\executor.c">
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\fd_posix.c">
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\iocp_windows.c">

@ -184,6 +184,9 @@
<ClCompile Include="..\..\..\src\core\iomgr\exec_ctx.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\executor.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\fd_posix.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
@ -626,6 +629,9 @@
<ClInclude Include="..\..\..\src\core\iomgr\exec_ctx.h">
<Filter>src\core\iomgr</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\core\iomgr\executor.h">
<Filter>src\core\iomgr</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\core\iomgr\fd_posix.h">
<Filter>src\core\iomgr</Filter>
</ClInclude>

@ -284,6 +284,7 @@
<ClInclude Include="..\..\..\src\core\iomgr\endpoint.h" />
<ClInclude Include="..\..\..\src\core\iomgr\endpoint_pair.h" />
<ClInclude Include="..\..\..\src\core\iomgr\exec_ctx.h" />
<ClInclude Include="..\..\..\src\core\iomgr\executor.h" />
<ClInclude Include="..\..\..\src\core\iomgr\fd_posix.h" />
<ClInclude Include="..\..\..\src\core\iomgr\iocp_windows.h" />
<ClInclude Include="..\..\..\src\core\iomgr\iomgr.h" />
@ -442,6 +443,8 @@
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\exec_ctx.c">
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\executor.c">
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\fd_posix.c">
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\iocp_windows.c">

@ -124,6 +124,9 @@
<ClCompile Include="..\..\..\src\core\iomgr\exec_ctx.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\executor.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\core\iomgr\fd_posix.c">
<Filter>src\core\iomgr</Filter>
</ClCompile>
@ -524,6 +527,9 @@
<ClInclude Include="..\..\..\src\core\iomgr\exec_ctx.h">
<Filter>src\core\iomgr</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\core\iomgr\executor.h">
<Filter>src\core\iomgr</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\core\iomgr\fd_posix.h">
<Filter>src\core\iomgr</Filter>
</ClInclude>

Loading…
Cancel
Save