24 Stream(std::unique_ptr<XrdSfsFile> fh,
size_t max_blocks,
size_t buffer_size,
XrdSysError &log)
25 : m_open_for_write(false),
26 m_avail_count(max_blocks),
31 m_buffers.reserve(max_blocks);
32 for (
size_t idx=0; idx < max_blocks; idx++) {
33 m_buffers.push_back(
new Entry(buffer_size));
35 m_open_for_write =
true;
42 int Read(off_t offset,
char *buffer,
size_t size);
54 ssize_t
Write(off_t offset,
const char *buffer,
size_t size,
bool force);
75 Entry(
size_t capacity) :
81 bool Available()
const {
return m_offset == -1;}
84 if (Available() || !CanWrite(stream)) {
return 0;}
90 if (!force && (m_size != m_capacity)) {
93 ssize_t retval = stream.WriteImpl(m_offset, &m_buffer[0], m_size);
96 if ((retval < 0) || (
static_cast<size_t>(retval) != m_size)) {
105 size_t Accept(off_t offset,
const char *buf,
size_t size) {
107 if ((m_offset != -1) && (offset != m_offset +
static_cast<ssize_t
>(m_size))) {
110 size_t to_accept = m_capacity - m_size;
111 if (to_accept == 0) {
return 0;}
112 if (size > to_accept) {
117 ssize_t new_bytes_needed = (m_size + size) - m_buffer.size();
118 if (new_bytes_needed > 0) {
119 m_buffer.resize(m_capacity);
123 memcpy(&m_buffer[0] + m_size, buf, size);
125 if (m_offset == -1) {
131 void ShrinkIfUnused() {
132 if (!Available()) {
return;}
133 #if __cplusplus > 199711L
134 m_buffer.shrink_to_fit();
138 void Move(Entry &other) {
139 m_buffer.swap(other.m_buffer);
140 m_offset = other.m_offset;
141 m_size = other.m_size;
144 off_t GetOffset()
const {
return m_offset;}
145 size_t GetCapacity()
const {
return m_capacity;}
146 size_t GetSize()
const {
return m_size;}
150 Entry(
const Entry&) =
delete;
152 bool CanWrite(
Stream &stream)
const {
153 return (m_size > 0) && (m_offset == stream.m_offset);
159 std::vector<char> m_buffer;
162 ssize_t WriteImpl(off_t offset,
const char *buffer,
size_t size);
164 bool m_open_for_write;
165 size_t m_avail_count;
166 std::unique_ptr<XrdSfsFile> m_fh;
168 std::vector<Entry*> m_buffers;
170 std::string m_error_buf;
int stat(const char *path, struct stat *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)