@ -118,12 +118,14 @@ static void on_read(void *tcpp, int from_iocp) {
gpr_slice * slice = NULL ;
size_t nslices = 0 ;
grpc_endpoint_cb_status status ;
grpc_endpoint_read_cb cb = tcp - > read_cb ;
grpc_endpoint_read_cb cb ;
grpc_winsocket_callback_info * info = & socket - > read_info ;
void * opaque = tcp - > read_user_data ;
int do_abort = 0 ;
gpr_mu_lock ( & tcp - > mu ) ;
cb = tcp - > read_cb ;
tcp - > read_cb = NULL ;
if ( ! from_iocp | | tcp - > shutting_down ) {
/* If we are here with from_iocp set to true, it means we got raced to
shutting down the endpoint . No actual abort callback will happen
@ -133,9 +135,12 @@ static void on_read(void *tcpp, int from_iocp) {
gpr_mu_unlock ( & tcp - > mu ) ;
if ( do_abort ) {
if ( from_iocp ) gpr_slice_unref ( tcp - > read_slice ) ;
if ( from_iocp ) {
tcp - > socket - > read_info . outstanding = 0 ;
gpr_slice_unref ( tcp - > read_slice ) ;
}
tcp_unref ( tcp ) ;
cb ( opaque , NULL , 0 , GRPC_ENDPOINT_CB_SHUTDOWN ) ;
if ( cb ) cb ( opaque , NULL , 0 , GRPC_ENDPOINT_CB_SHUTDOWN ) ;
return ;
}
@ -225,11 +230,13 @@ static void on_write(void *tcpp, int from_iocp) {
grpc_winsocket * handle = tcp - > socket ;
grpc_winsocket_callback_info * info = & handle - > write_info ;
grpc_endpoint_cb_status status = GRPC_ENDPOINT_CB_OK ;
grpc_endpoint_write_cb cb = tcp - > write_cb ;
grpc_endpoint_write_cb cb ;
void * opaque = tcp - > write_user_data ;
int do_abort = 0 ;
gpr_mu_lock ( & tcp - > mu ) ;
cb = tcp - > write_cb ;
tcp - > write_cb = NULL ;
if ( ! from_iocp | | tcp - > shutting_down ) {
/* If we are here with from_iocp set to true, it means we got raced to
shutting down the endpoint . No actual abort callback will happen
@ -238,15 +245,18 @@ static void on_write(void *tcpp, int from_iocp) {
}
gpr_mu_unlock ( & tcp - > mu ) ;
GPR_ASSERT ( tcp - > socket - > write_info . outstanding ) ;
if ( do_abort ) {
if ( from_iocp ) gpr_slice_buffer_reset_and_unref ( & tcp - > write_slices ) ;
if ( from_iocp ) {
tcp - > socket - > write_info . outstanding = 0 ;
gpr_slice_buffer_reset_and_unref ( & tcp - > write_slices ) ;
}
tcp_unref ( tcp ) ;
cb ( opaque , GRPC_ENDPOINT_CB_SHUTDOWN ) ;
if ( cb ) cb ( opaque , GRPC_ENDPOINT_CB_SHUTDOWN ) ;
return ;
}
GPR_ASSERT ( tcp - > socket - > write_info . outstanding ) ;
if ( info - > wsa_error ! = 0 ) {
char * utf8_message = gpr_format_message ( info - > wsa_error ) ;
gpr_log ( GPR_ERROR , " WSASend overlapped error: %s " , utf8_message ) ;
@ -361,11 +371,13 @@ static void win_add_to_pollset(grpc_endpoint *ep, grpc_pollset *pollset) {
concurrent access of the data structure in that regard . */
static void win_shutdown ( grpc_endpoint * ep ) {
grpc_tcp * tcp = ( grpc_tcp * ) ep ;
int extra_refs = 0 ;
gpr_mu_lock ( & tcp - > mu ) ;
/* At that point, what may happen is that we're already inside the IOCP
callback . See the comments in on_read and on_write . */
tcp - > shutting_down = 1 ;
grpc_winsocket_shutdown ( tcp - > socket ) ;
extra_refs = grpc_winsocket_shutdown ( tcp - > socket ) ;
while ( extra_refs - - ) tcp_ref ( tcp ) ;
gpr_mu_unlock ( & tcp - > mu ) ;
}