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);
76 Entry(
size_t capacity) :
82 bool Available()
const {
return m_offset == -1;}
89 if (Available() || !CanWrite(stream)) {
return 0;}
95 if (!force && (m_size != m_capacity)) {
98 ssize_t retval = stream.WriteImpl(m_offset, &m_buffer[0], m_size);
101 if ((retval < 0) || (
static_cast<size_t>(retval) != m_size)) {
110 size_t Accept(off_t offset,
const char *buf,
size_t size) {
112 if ((m_offset != -1) && (offset != m_offset +
static_cast<ssize_t
>(m_size))) {
115 size_t to_accept = m_capacity - m_size;
116 if (to_accept == 0) {
return 0;}
117 if (size > to_accept) {
122 ssize_t new_bytes_needed = (m_size + size) - m_buffer.size();
123 if (new_bytes_needed > 0) {
124 m_buffer.resize(m_capacity);
128 memcpy(&m_buffer[0] + m_size, buf, size);
130 if (m_offset == -1) {
136 void ShrinkIfUnused() {
137 if (!Available()) {
return;}
138 m_buffer.shrink_to_fit();
141 off_t GetOffset()
const {
return m_offset;}
142 size_t GetCapacity()
const {
return m_capacity;}
143 size_t GetSize()
const {
return m_size;}
147 Entry(
const Entry&) =
delete;
149 bool CanWrite(
Stream &stream)
const {
150 return (m_size > 0) && (m_offset == stream.m_offset);
156 std::vector<char> m_buffer;
159 ssize_t WriteImpl(off_t offset,
const char *buffer,
size_t size);
166 size_t AcceptIntoBuffers(off_t offset,
const char *buffer,
size_t size);
176 ssize_t FlushBuffers(
bool force);
179 Entry *FirstAvailableBuffer();
181 bool m_open_for_write;
182 size_t m_avail_count;
183 std::unique_ptr<XrdSfsFile> m_fh;
185 std::vector<std::unique_ptr<Entry>> m_buffers;
187 std::string m_error_buf;
int Read(off_t offset, char *buffer, size_t size)
ssize_t Write(off_t offset, const char *buffer, size_t size, bool force)
Stream(std::unique_ptr< XrdSfsFile > fh, size_t max_blocks, size_t buffer_size, XrdSysError &log)
std::string GetErrorMessage() const
size_t AvailableBuffers() const