fix(streambuf): Buffer size
This commit is contained in:
parent
dceb3606b1
commit
6250a2b746
@ -56,7 +56,7 @@ class fd_streambuf : public std::streambuf {
|
||||
template <typename... Args>
|
||||
explicit fd_streambuf(Args&&... args) : m_fd(forward<Args>(args)...) {
|
||||
setg(m_in, m_in, m_in);
|
||||
setp(m_out, m_out + sizeof(m_in));
|
||||
setp(m_out, m_out + bufsize - 1);
|
||||
}
|
||||
~fd_streambuf();
|
||||
|
||||
@ -73,8 +73,9 @@ class fd_streambuf : public std::streambuf {
|
||||
|
||||
private:
|
||||
file_descriptor m_fd;
|
||||
char m_out[BUFSIZ]{};
|
||||
char m_in[BUFSIZ - 1]{};
|
||||
enum { bufsize = 1024 };
|
||||
char m_out[bufsize];
|
||||
char m_in[bufsize - 1];
|
||||
};
|
||||
|
||||
template <typename StreamType>
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <glob.h>
|
||||
#include <sys/stat.h>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
#include <streambuf>
|
||||
|
||||
@ -118,7 +119,7 @@ void fd_streambuf::open(int fd) {
|
||||
}
|
||||
m_fd = fd;
|
||||
setg(m_in, m_in, m_in);
|
||||
setp(m_out, m_out + sizeof(m_in));
|
||||
setp(m_out, m_out + bufsize - 1);
|
||||
}
|
||||
|
||||
void fd_streambuf::close() {
|
||||
@ -131,7 +132,7 @@ void fd_streambuf::close() {
|
||||
int fd_streambuf::sync() {
|
||||
if (pbase() != pptr()) {
|
||||
auto size = pptr() - pbase();
|
||||
auto bytes = ::write(m_fd, m_out, size);
|
||||
auto bytes = write(m_fd, m_out, size);
|
||||
if (bytes > 0) {
|
||||
std::copy(pbase() + bytes, pptr(), pbase());
|
||||
setp(pbase(), epptr());
|
||||
@ -151,9 +152,9 @@ int fd_streambuf::overflow(int c) {
|
||||
|
||||
int fd_streambuf::underflow() {
|
||||
if (gptr() == egptr()) {
|
||||
std::streamsize pback(std::min(gptr() - eback(), std::ptrdiff_t(m_in)));
|
||||
std::streamsize pback(std::min(gptr() - eback(), std::ptrdiff_t(16 - sizeof(int))));
|
||||
std::copy(egptr() - pback, egptr(), eback());
|
||||
int bytes(::read(m_fd, eback() + pback, BUFSIZ));
|
||||
int bytes(read(m_fd, eback() + pback, bufsize));
|
||||
setg(eback(), eback() + pback, eback() + pback + std::max(0, bytes));
|
||||
}
|
||||
return gptr() == egptr() ? traits_type::eof() : traits_type::to_int_type(*gptr());
|
||||
|
Loading…
Reference in New Issue
Block a user