@ -140,6 +140,8 @@ struct grpc_call {
gpr_uint8 have_alarm ;
/* are we currently performing a send operation */
gpr_uint8 sending ;
/* are we currently completing requests */
gpr_uint8 completing ;
/* pairs with completed_requests */
gpr_uint8 num_completed_requests ;
/* flag that we need to request more data */
@ -357,7 +359,7 @@ static void lock(grpc_call *call) { gpr_mu_lock(&call->mu); }
static void unlock ( grpc_call * call ) {
send_action sa = SEND_NOTHING ;
completed_request completed_requests [ GRPC_IOREQ_OP_COUNT ] ;
int num_completed_requests = call - > num_completed_requests ;
int completing_requests = 0 ;
int need_more_data =
call - > need_more_data & &
( call - > write_state > = WRITE_STATE_STARTED | | ! call - > is_client ) ;
@ -367,10 +369,12 @@ static void unlock(grpc_call *call) {
call - > need_more_data = 0 ;
}
if ( num_completed_requests ! = 0 ) {
if ( ! call - > completing & & call - > num_completed_requests ! = 0 ) {
completing_requests = call - > num_completed_requests ;
memcpy ( completed_requests , call - > completed_requests ,
sizeof ( completed_requests ) ) ;
call - > num_completed_requests = 0 ;
call - > completing = 1 ;
}
if ( ! call - > sending ) {
@ -391,9 +395,14 @@ static void unlock(grpc_call *call) {
enact_send_action ( call , sa ) ;
}
for ( i = 0 ; i < num_completed_requests ; i + + ) {
completed_requests [ i ] . on_complete ( call , completed_requests [ i ] . status ,
completed_requests [ i ] . user_data ) ;
if ( completing_requests > 0 ) {
for ( i = 0 ; i < completing_requests ; i + + ) {
completed_requests [ i ] . on_complete ( call , completed_requests [ i ] . status ,
completed_requests [ i ] . user_data ) ;
}
lock ( call ) ;
call - > completing = 0 ;
unlock ( call ) ;
}
}