Not clear that GPollableInputStream methods are undefined if can_poll() returns FALSE
I noticed this while reading code, so I could be missing something.
The GPollableInputStream
interface's is_readable
method looks like this:
gboolean
g_pollable_input_stream_is_readable (GPollableInputStream *stream)
{
g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (stream), FALSE);
return G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)->is_readable (stream);
}
The actual implementation of it inside GConverterInputStream
looks like this:
static gboolean
g_converter_input_stream_is_readable (GPollableInputStream *stream)
{
GInputStream *base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream;
GConverterInputStream *cstream = G_CONVERTER_INPUT_STREAM (stream);
if (buffer_data_size (&cstream->priv->converted_buffer))
return TRUE;
else if (buffer_data_size (&cstream->priv->input_buffer) &&
!cstream->priv->need_input)
return TRUE;
else
return g_pollable_input_stream_is_readable (G_POLLABLE_INPUT_STREAM (base_stream));
}
That final else
branch assumes that base_stream
implements GPollableInputStream
, but I don't see anything that enforces that. The base_stream
is only a GInputStream
and may or may not be pollable. For example:
GInputStream *
g_converter_input_stream_new (GInputStream *base_stream,
GConverter *converter)
{
GInputStream *stream;
g_return_val_if_fail (G_IS_INPUT_STREAM (base_stream), NULL);
stream = g_object_new (G_TYPE_CONVERTER_INPUT_STREAM,
"base-stream", base_stream,
"converter", converter,
NULL);
return stream;
}
So there's a chance of hitting this runtime assertion:
g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (stream), FALSE);
For what it's worth, this code comes from the initial implementation of GPollableInputStream
in GConverterInputStream
in commit 82ec4dcaed8107d4.