From 95f750a87d82ad6b996ceae27e68737472ff4809 Mon Sep 17 00:00:00 2001 From: Omar Awile Date: Tue, 11 Jun 2019 22:11:38 +0200 Subject: [PATCH] Add optional buffer size to pythonbuf::d_buffer constructor (#1687) In some cases the user of pythonbuf needs to allocate the internal buffer to a specific size e.g. for performance or to enable synchronous writes to the buffer. By changing `pythonbuf::d_buffer` to be dynamically allocated we can now enable these use-cases while still providing the default behavior of allocating a 1024 byte internal buffer (through a default parameter). --- include/pybind11/iostream.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/pybind11/iostream.h b/include/pybind11/iostream.h index 182e8eef..9119270e 100644 --- a/include/pybind11/iostream.h +++ b/include/pybind11/iostream.h @@ -25,7 +25,8 @@ class pythonbuf : public std::streambuf { private: using traits_type = std::streambuf::traits_type; - char d_buffer[1024]; + const size_t buf_size; + std::unique_ptr d_buffer; object pywrite; object pyflush; @@ -51,10 +52,13 @@ private: } 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); } /// Sync before destroy