25 Stream(std::unique_ptr<XrdSfsFile> fh,
size_t max_blocks,
size_t buffer_size,
XrdSysError &log)
26 : m_open_for_write(false),
27 m_avail_count(max_blocks),
32 m_buffers.reserve(max_blocks);
33 for (
size_t idx=0; idx < max_blocks; idx++) {
34 m_buffers.push_back(std::make_unique<Entry>(buffer_size));
36 m_open_for_write =
true;
43 int Read(off_t offset,
char *buffer,
size_t size);
55 ssize_t
Write(off_t offset,
const char *buffer,
size_t size,
bool force);
69 ssize_t
Flush() {
return Write(m_offset,
nullptr, 0,
true);}
90 Entry(
size_t capacity) :
96 bool Available()
const {
return m_offset == -1;}
102 ssize_t Write(
Stream &stream,
bool force) {
103 if (Available() || !CanWrite(stream)) {
return 0;}
109 if (!force && (m_size != m_capacity)) {
112 ssize_t retval = stream.WriteImpl(m_offset, &m_buffer[0], m_size);
115 if ((retval < 0) || (
static_cast<size_t>(retval) != m_size)) {
124 size_t Accept(off_t offset,
const char *buf,
size_t size) {
126 if ((m_offset != -1) && (offset != m_offset +
static_cast<ssize_t
>(m_size))) {
129 size_t to_accept = m_capacity - m_size;
130 if (to_accept == 0) {
return 0;}
131 if (size > to_accept) {
136 ssize_t new_bytes_needed = (m_size + size) - m_buffer.size();
137 if (new_bytes_needed > 0) {
138 m_buffer.resize(m_capacity);
142 memcpy(&m_buffer[0] + m_size, buf, size);
144 if (m_offset == -1) {
150 void ShrinkIfUnused() {
151 if (!Available()) {
return;}
152 m_buffer.shrink_to_fit();
155 off_t GetOffset()
const {
return m_offset;}
156 size_t GetCapacity()
const {
return m_capacity;}
157 size_t GetSize()
const {
return m_size;}
161 Entry(
const Entry&) =
delete;
163 bool CanWrite(
Stream &stream)
const {
164 return (m_size > 0) && (m_offset == stream.m_offset);
170 std::vector<char> m_buffer;
173 ssize_t WriteImpl(off_t offset,
const char *buffer,
size_t size);
180 size_t AcceptIntoBuffers(off_t offset,
const char *buffer,
size_t size);
190 ssize_t FlushBuffers(
bool force);
193 Entry *FirstAvailableBuffer();
195 bool m_open_for_write;
196 size_t m_avail_count;
197 std::unique_ptr<XrdSfsFile> m_fh;
199 std::vector<std::unique_ptr<Entry>> m_buffers;
201 std::string m_error_buf;