i_assert(!_stream->finished);
ret = _stream->sendv(_stream, iov, iov_count);
+ if (ret > 0)
+ stream->real_stream->last_write_timeval = ioloop_timeval;
if (unlikely(ret != (ssize_t)total_size)) {
if (ret < 0) {
i_assert(stream->stream_errno != 0);
/* non-failure - make sure stream offsets match */
i_assert((outstream->offset - old_outstream_offset) ==
(instream->v_offset - old_instream_offset));
+
+ if (outstream->offset != old_outstream_offset)
+ outstream->real_stream->last_write_timeval = ioloop_timeval;
return res;
}
i_assert(!stream->real_stream->finished);
ret = stream->real_stream->write_at(stream->real_stream,
data, size, offset);
- if (unlikely(ret < 0)) {
+ if (ret > 0)
+ stream->real_stream->last_write_timeval = ioloop_timeval;
+ else if (unlikely(ret < 0)) {
i_assert(stream->stream_errno != 0);
errno = stream->stream_errno;
}
+
return ret;
}
+void o_stream_get_last_write_time(struct ostream *stream, struct timeval *tv_r)
+{
+ *tv_r = stream->real_stream->last_write_timeval;
+}
+
enum ostream_send_istream_result
io_stream_copy(struct ostream *outstream, struct istream *instream)
{
int o_stream_pwrite(struct ostream *stream, const void *data, size_t size,
uoff_t offset);
+/* Return the last timestamp when something was successfully sent to the
+ ostream's internal buffers (no guarantees that anything was sent further).
+ The timestamp is 0 if nothing has ever been written. */
+void o_stream_get_last_write_time(struct ostream *stream, struct timeval *tv_r);
+
/* If there are any I/O loop items associated with the stream, move all of
them to current_ioloop. */
void o_stream_switch_ioloop(struct ostream *stream);