int refcount;
char *name;
char *error;
+ struct ioloop *ioloop;
void (*close)(struct iostream_private *streami, bool close_parent);
void (*destroy)(struct iostream_private *stream);
void io_stream_set_verror(struct iostream_private *stream,
const char *fmt, va_list args) ATTR_FORMAT(2, 0);
+void io_stream_switch_ioloop_to(struct iostream_private *stream,
+ struct ioloop *ioloop);
+struct ioloop *io_stream_get_ioloop(struct iostream_private *stream);
+
#endif
stream->close = io_stream_default_close;
if (stream->destroy == NULL)
stream->destroy = io_stream_default_destroy;
+ stream->ioloop = current_ioloop;
stream->refcount = 1;
}
else
return t_strdup_printf("Connection closed: %s", errstr);
}
+
+void io_stream_switch_ioloop_to(struct iostream_private *stream,
+ struct ioloop *ioloop)
+{
+ stream->ioloop = ioloop;
+}
+
+struct ioloop *io_stream_get_ioloop(struct iostream_private *stream)
+{
+ return (stream->ioloop == NULL ? current_ioloop : stream->ioloop);
+}
void i_stream_switch_ioloop(struct istream *stream)
{
+ io_stream_switch_ioloop_to(&stream->real_stream->iostream,
+ current_ioloop);
+
do {
if (stream->real_stream->switch_ioloop != NULL)
stream->real_stream->switch_ioloop(stream->real_stream);
{
struct ostream_private *_stream = stream->real_stream;
+ io_stream_switch_ioloop_to(&_stream->iostream, current_ioloop);
+
_stream->switch_ioloop(_stream);
}