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(
new 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;}
85 if (Available() || !CanWrite(stream)) {
return 0;}
91 if (!force && (m_size != m_capacity)) {
94 ssize_t retval = stream.WriteImpl(m_offset, &m_buffer[0], m_size);
97 if ((retval < 0) || (
static_cast<size_t>(retval) != m_size)) {
106 size_t Accept(off_t offset,
const char *buf,
size_t size) {
108 if ((m_offset != -1) && (offset != m_offset +
static_cast<ssize_t
>(m_size))) {
111 size_t to_accept = m_capacity - m_size;
112 if (to_accept == 0) {
return 0;}
113 if (size > to_accept) {
118 ssize_t new_bytes_needed = (m_size + size) - m_buffer.size();
119 if (new_bytes_needed > 0) {
120 m_buffer.resize(m_capacity);
124 memcpy(&m_buffer[0] + m_size, buf, size);
126 if (m_offset == -1) {
132 void ShrinkIfUnused() {
133 if (!Available()) {
return;}
134 #if __cplusplus > 199711L
135 m_buffer.shrink_to_fit();
139 void Move(Entry &other) {
140 m_buffer.swap(other.m_buffer);
141 m_offset = other.m_offset;
142 m_size = other.m_size;
145 off_t GetOffset()
const {
return m_offset;}
146 size_t GetCapacity()
const {
return m_capacity;}
147 size_t GetSize()
const {
return m_size;}
151 Entry(
const Entry&) =
delete;
153 bool CanWrite(
Stream &stream)
const {
154 return (m_size > 0) && (m_offset == stream.m_offset);
160 std::vector<char> m_buffer;
163 ssize_t WriteImpl(off_t offset,
const char *buffer,
size_t size);
165 bool m_open_for_write;
166 size_t m_avail_count;
167 std::unique_ptr<XrdSfsFile> m_fh;
169 std::vector<Entry*> m_buffers;
171 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
ssize_t Move(KernelBuffer &kbuff, char *&ubuff)