aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/iomgr
diff options
context:
space:
mode:
authorGravatar Mark D. Roth <roth@google.com>2016-07-12 14:10:47 -0700
committerGravatar Mark D. Roth <roth@google.com>2016-07-12 14:10:47 -0700
commit6f6f59ae4b480d809d3e7f8af2b1a0cc3801117b (patch)
treee85462ef455c9d1db6e55f126f2097ddba04c6db /src/core/lib/iomgr
parent3c945ee2b3c3bf0fd01cc995332e252d1e10e51e (diff)
parent6b8a8e4a74fc83153a6fd3fbb7ec1ed2b288b4b4 (diff)
Merge remote-tracking branch 'upstream/master' into filter_call_init_failure
Diffstat (limited to 'src/core/lib/iomgr')
-rw-r--r--src/core/lib/iomgr/network_status_tracker.c27
-rw-r--r--src/core/lib/iomgr/tcp_server_posix.c7
2 files changed, 16 insertions, 18 deletions
diff --git a/src/core/lib/iomgr/network_status_tracker.c b/src/core/lib/iomgr/network_status_tracker.c
index 38a1c9b7d4..ccbe136db9 100644
--- a/src/core/lib/iomgr/network_status_tracker.c
+++ b/src/core/lib/iomgr/network_status_tracker.c
@@ -42,27 +42,24 @@ typedef struct endpoint_ll_node {
static endpoint_ll_node *head = NULL;
static gpr_mu g_endpoint_mutex;
-static bool g_init_done = false;
+static gpr_once g_once_init = GPR_ONCE_INIT;
-void grpc_initialize_network_status_monitor() {
- g_init_done = true;
- gpr_mu_init(&g_endpoint_mutex);
- // TODO(makarandd): Install callback with OS to monitor network status.
-}
-
-void grpc_destroy_network_status_monitor() {
- for (endpoint_ll_node *curr = head; curr != NULL;) {
- endpoint_ll_node *next = curr->next;
- gpr_free(curr);
- curr = next;
+static void destroy_network_status_monitor(void) {
+ if (head != NULL) {
+ gpr_log(GPR_ERROR,
+ "Memory leaked as all network endpoints were not shut down");
}
gpr_mu_destroy(&g_endpoint_mutex);
}
+static void initialize_network_status_monitor(void) {
+ gpr_mu_init(&g_endpoint_mutex);
+ atexit(destroy_network_status_monitor);
+ // TODO(makarandd): Install callback with OS to monitor network status.
+}
+
void grpc_network_status_register_endpoint(grpc_endpoint *ep) {
- if (!g_init_done) {
- grpc_initialize_network_status_monitor();
- }
+ gpr_once_init(&g_once_init, initialize_network_status_monitor);
gpr_mu_lock(&g_endpoint_mutex);
if (head == NULL) {
head = (endpoint_ll_node *)gpr_malloc(sizeof(endpoint_ll_node));
diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c
index a1a463550a..d3803c3bd0 100644
--- a/src/core/lib/iomgr/tcp_server_posix.c
+++ b/src/core/lib/iomgr/tcp_server_posix.c
@@ -134,7 +134,7 @@ struct grpc_tcp_server {
size_t pollset_count;
/* next pollset to assign a channel to */
- size_t next_pollset_to_assign;
+ gpr_atm next_pollset_to_assign;
};
static gpr_once check_init = GPR_ONCE_INIT;
@@ -181,7 +181,7 @@ grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
s->head = NULL;
s->tail = NULL;
s->nports = 0;
- s->next_pollset_to_assign = 0;
+ gpr_atm_no_barrier_store(&s->next_pollset_to_assign, 0);
*server = s;
return GRPC_ERROR_NONE;
}
@@ -369,7 +369,8 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) {
}
read_notifier_pollset =
- sp->server->pollsets[(sp->server->next_pollset_to_assign++) %
+ sp->server->pollsets[(size_t)gpr_atm_no_barrier_fetch_add(
+ &sp->server->next_pollset_to_assign, 1) %
sp->server->pollset_count];
/* loop until accept4 returns EAGAIN, and then re-arm notification */