private:
using traits_type = std::streambuf::traits_type;
- char d_buffer[1024];
+ const size_t buf_size;
+ std::unique_ptr<char[]> d_buffer;
object pywrite;
object pyflush;
// This subtraction cannot be negative, so dropping the sign
str line(pbase(), static_cast<size_t>(pptr() - pbase()));
- pywrite(line);
- pyflush();
+ {
+ gil_scoped_acquire tmp;
+ pywrite(line);
+ pyflush();
+ }
setp(pbase(), epptr());
}
}
public:
- pythonbuf(object pyostream)
- : pywrite(pyostream.attr("write")),
+
+ pythonbuf(object pyostream, size_t buffer_size = 1024)
+ : buf_size(buffer_size),
+ d_buffer(new char[buf_size]),
+ pywrite(pyostream.attr("write")),
pyflush(pyostream.attr("flush")) {
- setp(d_buffer, d_buffer + sizeof(d_buffer) - 1);
+ setp(d_buffer.get(), d_buffer.get() + buf_size - 1);
}
+ pythonbuf(pythonbuf&&) = default;
+
/// Sync before destroy
~pythonbuf() {
sync();
return class_<detail::OstreamRedirect>(m, name.c_str(), module_local())
.def(init<bool,bool>(), arg("stdout")=true, arg("stderr")=true)
.def("__enter__", &detail::OstreamRedirect::enter)
- .def("__exit__", [](detail::OstreamRedirect &self, args) { self.exit(); });
+ .def("__exit__", [](detail::OstreamRedirect &self_, args) { self_.exit(); });
}
NAMESPACE_END(PYBIND11_NAMESPACE)