Ejemplo n.º 1
0
void grpc_chttp2_cleanup_writing(
    grpc_chttp2_transport_global *transport_global,
    grpc_chttp2_transport_writing *transport_writing) {
    grpc_chttp2_stream_writing *stream_writing;
    grpc_chttp2_stream_global *stream_global;

    while (grpc_chttp2_list_pop_written_stream(
                transport_global, transport_writing, &stream_global, &stream_writing)) {
        GPR_ASSERT(stream_global->writing_now != 0);
        if (stream_writing->send_closed != GRPC_DONT_SEND_CLOSED) {
            stream_global->write_state = GRPC_WRITE_STATE_SENT_CLOSE;
            if (!transport_global->is_client) {
                stream_global->read_closed = 1;
            }
        }
        if (stream_global->writing_now & GRPC_CHTTP2_WRITING_DATA) {
            if (stream_global->outgoing_sopb != NULL &&
                    stream_global->outgoing_sopb->nops == 0) {
                GPR_ASSERT(stream_global->write_state != GRPC_WRITE_STATE_QUEUED_CLOSE);
                stream_global->outgoing_sopb = NULL;
                grpc_chttp2_schedule_closure(transport_global,
                                             stream_global->send_done_closure, 1);
            }
        }
        stream_global->writing_now = 0;
        grpc_chttp2_list_add_read_write_state_changed(transport_global,
                stream_global);
    }
    transport_writing->outbuf.count = 0;
    transport_writing->outbuf.length = 0;
}
Ejemplo n.º 2
0
Archivo: writing.c Proyecto: bjori/grpc
void grpc_chttp2_cleanup_writing(
    grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
    grpc_chttp2_transport_writing *transport_writing) {
  grpc_chttp2_stream_writing *stream_writing;
  grpc_chttp2_stream_global *stream_global;

  while (grpc_chttp2_list_pop_written_stream(
      transport_global, transport_writing, &stream_global, &stream_writing)) {
    GPR_ASSERT(stream_global->writing_now != 0);
    if (stream_writing->send_closed != GRPC_DONT_SEND_CLOSED) {
      stream_global->write_state = GRPC_WRITE_STATE_SENT_CLOSE;
      if (!transport_global->is_client) {
        stream_global->read_closed = 1;
      }
    }
    if (stream_global->writing_now & GRPC_CHTTP2_WRITING_DATA) {
      if (stream_global->outgoing_sopb != NULL &&
          stream_global->outgoing_sopb->nops == 0) {
        GPR_ASSERT(stream_global->write_state != GRPC_WRITE_STATE_QUEUED_CLOSE);
        stream_global->outgoing_sopb = NULL;
        grpc_exec_ctx_enqueue(exec_ctx, stream_global->send_done_closure, 1);
      }
    }
    stream_global->writing_now = 0;
    grpc_chttp2_list_add_read_write_state_changed(transport_global,
                                                  stream_global);
  }
  gpr_slice_buffer_reset_and_unref(&transport_writing->outbuf);
}