/* Read a bunch of bytes into the current decode stream. */ static MVMint32 read_to_buffer(MVMThreadContext *tc, MVMIOFileData *data, MVMint32 bytes) { char *buf = MVM_malloc(bytes); uv_buf_t read_buf = uv_buf_init(buf, bytes); uv_fs_t req; MVMint32 read; if ((read = uv_fs_read(tc->loop, &req, data->fd, &read_buf, 1, -1, NULL)) < 0) { MVM_free(buf); MVM_exception_throw_adhoc(tc, "Reading from filehandle failed: %s", uv_strerror(req.result)); } MVM_string_decodestream_add_bytes(tc, data->ds, buf, read); return read; }
static void on_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)handle->data; if (nread > 0) { MVM_string_decodestream_add_bytes(data->cur_tc, data->ds, buf->base, nread); } else if (nread == UV_EOF) { data->eof = 1; if (buf->base) free(buf->base); } uv_read_stop(handle); uv_unref((uv_handle_t*)handle); }
/* Read handler. */ static void on_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { ReadInfo *ri = (ReadInfo *)handle->data; MVMThreadContext *tc = ri->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, ri->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (nread > 0) { MVMROOT(tc, t, { MVMROOT(tc, arr, { /* Push the sequence number. */ MVMObject *seq_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number++); MVM_repr_push_o(tc, arr, seq_boxed); /* Either need to produce a buffer or decode characters. */ if (ri->ds) { MVMString *str; MVMObject *boxed_str; MVM_string_decodestream_add_bytes(tc, ri->ds, buf->base, nread); str = MVM_string_decodestream_get_all(tc, ri->ds); boxed_str = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, str); MVM_repr_push_o(tc, arr, boxed_str); } else { MVMArray *res_buf = (MVMArray *)MVM_repr_alloc_init(tc, ri->buf_type); res_buf->body.slots.i8 = buf->base; res_buf->body.start = 0; res_buf->body.ssize = nread; res_buf->body.elems = nread; MVM_repr_push_o(tc, arr, (MVMObject *)res_buf); } /* Finally, no error. */ MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); });