static int s_aws_input_stream_file_read()

in source/s3_meta_request.c [334:372]


static int s_aws_input_stream_file_read(struct aws_input_stream *stream, struct aws_byte_buf *dest) {
    struct aws_input_py_stream_file_impl *impl = stream->impl;
    size_t pre_len = dest->len;

    if (aws_input_stream_read(impl->actual_stream, dest)) {
        return AWS_OP_ERR;
    }

    size_t actually_read = 0;
    if (aws_sub_size_checked(dest->len, pre_len, &actually_read)) {
        return AWS_OP_ERR;
    }

    bool report_progress;
    struct s3_meta_request_binding *request_binding = impl->binding;
    if (s_record_progress(request_binding, (uint64_t)actually_read, &report_progress)) {
        return AWS_OP_ERR;
    }

    if (report_progress) {
        /*************** GIL ACQUIRE ***************/
        PyGILState_STATE state;
        if (aws_py_gilstate_ensure(&state)) {
            return AWS_OP_ERR; /* Python has shut down. Nothing matters anymore, but don't crash */
        }
        PyObject *result =
            PyObject_CallMethod(request_binding->py_core, "_on_progress", "(K)", request_binding->size_transferred);
        if (result) {
            Py_DECREF(result);
        }
        request_binding->size_transferred = 0;
        PyGILState_Release(state);
        /*************** GIL RELEASE ***************/
        if (!result) {
            return aws_py_raise_error();
        }
    }
    return AWS_OP_SUCCESS;
}