static VALUE rg_fill_finish(VALUE self, VALUE result) { GError *error = NULL; gsize bytes_read; bytes_read = g_buffered_input_stream_fill_finish(_SELF(self), RVAL2GASYNCRESULT(result), &error); if (error != NULL) rbgio_raise_error(error); return GSSIZE2RVAL(bytes_read); }
static void client_fill_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { BroadwayClient *client = user_data; gssize res; res = g_buffered_input_stream_fill_finish (client->in, result, NULL); if (res > 0) { guint32 size; gsize count, remaining; guint8 *buffer; buffer = (guint8 *)g_buffered_input_stream_peek_buffer (client->in, &count); remaining = count; while (remaining >= sizeof (guint32)) { memcpy (&size, buffer, sizeof (guint32)); if (size <= remaining) { client_handle_request (client, (BroadwayRequest *)buffer); remaining -= size; buffer += size; } } /* This is guaranteed not to block */ g_input_stream_skip (G_INPUT_STREAM (client->in), count - remaining, NULL, NULL); g_buffered_input_stream_fill_async (client->in, 4*1024, 0, NULL, client_fill_cb, client); } else { client_disconnected (client); } }
static void done_async_read(GObject *obj, GAsyncResult *res, gpointer user_data) { struct ekg_connection *c = user_data; GError *err = NULL; gssize rsize; GBufferedInputStream *instr = G_BUFFERED_INPUT_STREAM(obj); rsize = g_buffered_input_stream_fill_finish(instr, res, &err); if (rsize <= 0) { if (rsize == -1) /* error */ debug_error("done_async_read(), read failed: %s\n", err ? err->message : NULL); else { /* EOF */ #if NEED_SLAVERY if (c->master) /* let the master handle it */ return; #endif debug_function("done_async_read(), EOF\n"); if (g_buffered_input_stream_get_available(instr) > 0) c->callback(c->instream, c->priv_data); err = g_error_new_literal( EKG_CONNECTION_ERROR, EKG_CONNECTION_ERROR_EOF, "Connection terminated"); } c->failure_callback(c->instream, err, c->priv_data); ekg_connection_remove(c); g_error_free(err); return; } debug_function("done_async_read(): read %d bytes\n", rsize); c->callback(c->instream, c->priv_data); setup_async_read(c); }