Skip to content

Commit 09b8342

Browse files
authored
Merge pull request grpc#9746 from yang-g/handshake_mgr
Contain the links for the pending handshake managers inside handshake…
2 parents 1096672 + 6da1e85 commit 09b8342

File tree

3 files changed

+61
-49
lines changed

3 files changed

+61
-49
lines changed

src/core/ext/transport/chttp2/server/chttp2_server.c

+8-49
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,6 @@
5555
#include "src/core/lib/surface/api_trace.h"
5656
#include "src/core/lib/surface/server.h"
5757

58-
typedef struct pending_handshake_manager_node {
59-
grpc_handshake_manager *handshake_mgr;
60-
struct pending_handshake_manager_node *next;
61-
} pending_handshake_manager_node;
62-
6358
typedef struct {
6459
grpc_server *server;
6560
grpc_tcp_server *tcp_server;
@@ -68,7 +63,7 @@ typedef struct {
6863
bool shutdown;
6964
grpc_closure tcp_server_shutdown_complete;
7065
grpc_closure *server_destroy_listener_done;
71-
pending_handshake_manager_node *pending_handshake_mgrs;
66+
grpc_handshake_manager *pending_handshake_mgrs;
7267
} server_state;
7368

7469
typedef struct {
@@ -78,44 +73,6 @@ typedef struct {
7873
grpc_handshake_manager *handshake_mgr;
7974
} server_connection_state;
8075

81-
static void pending_handshake_manager_add_locked(
82-
server_state *state, grpc_handshake_manager *handshake_mgr) {
83-
pending_handshake_manager_node *node = gpr_malloc(sizeof(*node));
84-
node->handshake_mgr = handshake_mgr;
85-
node->next = state->pending_handshake_mgrs;
86-
state->pending_handshake_mgrs = node;
87-
}
88-
89-
static void pending_handshake_manager_remove_locked(
90-
server_state *state, grpc_handshake_manager *handshake_mgr) {
91-
pending_handshake_manager_node **prev_node = &state->pending_handshake_mgrs;
92-
for (pending_handshake_manager_node *node = state->pending_handshake_mgrs;
93-
node != NULL; node = node->next) {
94-
if (node->handshake_mgr == handshake_mgr) {
95-
*prev_node = node->next;
96-
gpr_free(node);
97-
break;
98-
}
99-
prev_node = &node->next;
100-
}
101-
}
102-
103-
static void pending_handshake_manager_shutdown_locked(grpc_exec_ctx *exec_ctx,
104-
server_state *state,
105-
grpc_error *why) {
106-
pending_handshake_manager_node *prev_node = NULL;
107-
for (pending_handshake_manager_node *node = state->pending_handshake_mgrs;
108-
node != NULL; node = node->next) {
109-
grpc_handshake_manager_shutdown(exec_ctx, node->handshake_mgr,
110-
GRPC_ERROR_REF(why));
111-
gpr_free(prev_node);
112-
prev_node = node;
113-
}
114-
gpr_free(prev_node);
115-
state->pending_handshake_mgrs = NULL;
116-
GRPC_ERROR_UNREF(why);
117-
}
118-
11976
static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
12077
grpc_error *error) {
12178
grpc_handshaker_args *args = arg;
@@ -153,8 +110,9 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
153110
grpc_channel_args_destroy(exec_ctx, args->args);
154111
}
155112
}
156-
pending_handshake_manager_remove_locked(connection_state->server_state,
157-
connection_state->handshake_mgr);
113+
grpc_handshake_manager_pending_list_remove(
114+
&connection_state->server_state->pending_handshake_mgrs,
115+
connection_state->handshake_mgr);
158116
gpr_mu_unlock(&connection_state->server_state->mu);
159117
grpc_handshake_manager_destroy(exec_ctx, connection_state->handshake_mgr);
160118
grpc_tcp_server_unref(exec_ctx, connection_state->server_state->tcp_server);
@@ -174,7 +132,8 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
174132
return;
175133
}
176134
grpc_handshake_manager *handshake_mgr = grpc_handshake_manager_create();
177-
pending_handshake_manager_add_locked(state, handshake_mgr);
135+
grpc_handshake_manager_pending_list_add(&state->pending_handshake_mgrs,
136+
handshake_mgr);
178137
gpr_mu_unlock(&state->mu);
179138
grpc_tcp_server_ref(state->tcp_server);
180139
server_connection_state *connection_state =
@@ -213,8 +172,8 @@ static void tcp_server_shutdown_complete(grpc_exec_ctx *exec_ctx, void *arg,
213172
gpr_mu_lock(&state->mu);
214173
grpc_closure *destroy_done = state->server_destroy_listener_done;
215174
GPR_ASSERT(state->shutdown);
216-
pending_handshake_manager_shutdown_locked(exec_ctx, state,
217-
GRPC_ERROR_REF(error));
175+
grpc_handshake_manager_pending_list_shutdown_all(
176+
exec_ctx, state->pending_handshake_mgrs, GRPC_ERROR_REF(error));
218177
gpr_mu_unlock(&state->mu);
219178
// Flush queued work before destroying handshaker factory, since that
220179
// may do a synchronous unref.

src/core/lib/channel/handshaker.c

+37
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ struct grpc_handshake_manager {
9292
void* user_data;
9393
// Handshaker args.
9494
grpc_handshaker_args args;
95+
// Links to the previous and next managers in a list of all pending handshakes
96+
// Used at server side only.
97+
grpc_handshake_manager* prev;
98+
grpc_handshake_manager* next;
9599
};
96100

97101
grpc_handshake_manager* grpc_handshake_manager_create() {
@@ -102,6 +106,39 @@ grpc_handshake_manager* grpc_handshake_manager_create() {
102106
return mgr;
103107
}
104108

109+
void grpc_handshake_manager_pending_list_add(grpc_handshake_manager** head,
110+
grpc_handshake_manager* mgr) {
111+
GPR_ASSERT(mgr->prev == NULL);
112+
GPR_ASSERT(mgr->next == NULL);
113+
mgr->next = *head;
114+
if (*head) {
115+
(*head)->prev = mgr;
116+
}
117+
*head = mgr;
118+
}
119+
120+
void grpc_handshake_manager_pending_list_remove(grpc_handshake_manager** head,
121+
grpc_handshake_manager* mgr) {
122+
if (mgr->next != NULL) {
123+
mgr->next->prev = mgr->prev;
124+
}
125+
if (mgr->prev != NULL) {
126+
mgr->prev->next = mgr->next;
127+
} else {
128+
GPR_ASSERT(*head == mgr);
129+
*head = mgr->next;
130+
}
131+
}
132+
133+
void grpc_handshake_manager_pending_list_shutdown_all(
134+
grpc_exec_ctx* exec_ctx, grpc_handshake_manager* head, grpc_error* why) {
135+
while (head != NULL) {
136+
grpc_handshake_manager_shutdown(exec_ctx, head, GRPC_ERROR_REF(why));
137+
head = head->next;
138+
}
139+
GRPC_ERROR_UNREF(why);
140+
}
141+
105142
static bool is_power_of_2(size_t n) { return (n & (n - 1)) == 0; }
106143

107144
void grpc_handshake_manager_add(grpc_handshake_manager* mgr,

src/core/lib/channel/handshaker.h

+16
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,20 @@ void grpc_handshake_manager_do_handshake(
163163
gpr_timespec deadline, grpc_tcp_server_acceptor* acceptor,
164164
grpc_iomgr_cb_func on_handshake_done, void* user_data);
165165

166+
/// Add \a mgr to the server side list of all pending handshake managers, the
167+
/// list starts with \a *head.
168+
// Not thread-safe. Caller needs to synchronize.
169+
void grpc_handshake_manager_pending_list_add(grpc_handshake_manager** head,
170+
grpc_handshake_manager* mgr);
171+
172+
/// Remove \a mgr from the server side list of all pending handshake managers.
173+
// Not thread-safe. Caller needs to synchronize.
174+
void grpc_handshake_manager_pending_list_remove(grpc_handshake_manager** head,
175+
grpc_handshake_manager* mgr);
176+
177+
/// Shutdown all pending handshake managers on the server side.
178+
// Not thread-safe. Caller needs to synchronize.
179+
void grpc_handshake_manager_pending_list_shutdown_all(
180+
grpc_exec_ctx* exec_ctx, grpc_handshake_manager* head, grpc_error* why);
181+
166182
#endif /* GRPC_CORE_LIB_CHANNEL_HANDSHAKER_H */

0 commit comments

Comments
 (0)