|
|
|
@ -582,6 +582,23 @@ static void finish_ioreq_op(grpc_call *call, grpc_ioreq_op op, int success) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void early_out_write_ops(grpc_call *call) { |
|
|
|
|
switch (call->write_state) { |
|
|
|
|
case WRITE_STATE_WRITE_CLOSED: |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_MESSAGE, 0); |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_STATUS, 0); |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_TRAILING_METADATA, 0); |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_CLOSE, 1); |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case WRITE_STATE_STARTED: |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_INITIAL_METADATA, 0); |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case WRITE_STATE_INITIAL: |
|
|
|
|
/* do nothing */ |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void call_on_done_send(void *pc, int success) { |
|
|
|
|
grpc_call *call = pc; |
|
|
|
|
lock(call); |
|
|
|
@ -600,6 +617,7 @@ static void call_on_done_send(void *pc, int success) { |
|
|
|
|
} |
|
|
|
|
if (!success) { |
|
|
|
|
call->write_state = WRITE_STATE_WRITE_CLOSED; |
|
|
|
|
early_out_write_ops(call); |
|
|
|
|
} |
|
|
|
|
call->send_ops.nops = 0; |
|
|
|
|
call->last_send_contains = 0; |
|
|
|
@ -921,23 +939,6 @@ static void finish_read_ops(grpc_call *call) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void early_out_write_ops(grpc_call *call) { |
|
|
|
|
switch (call->write_state) { |
|
|
|
|
case WRITE_STATE_WRITE_CLOSED: |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_MESSAGE, 0); |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_STATUS, 0); |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_TRAILING_METADATA, 0); |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_CLOSE, 1); |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case WRITE_STATE_STARTED: |
|
|
|
|
finish_ioreq_op(call, GRPC_IOREQ_SEND_INITIAL_METADATA, 0); |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case WRITE_STATE_INITIAL: |
|
|
|
|
/* do nothing */ |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_call_error start_ioreq(grpc_call *call, const grpc_ioreq *reqs, |
|
|
|
|
size_t nreqs, |
|
|
|
|
grpc_ioreq_completion_func completion, |
|
|
|
|