This is an automated email from the ASF dual-hosted git repository. jpeach pushed a commit to branch master in repository https://git-dual.apache.org/repos/asf/trafficserver.git
commit cf53450b74c54a7c1661d95043de91286382ec1f Author: James Peach <[email protected]> AuthorDate: Thu May 5 22:27:14 2016 -0700 TS-4425: Switch IOBuffers over to Ptr::get(). --- iocore/eventsystem/IOBuffer.cc | 26 +++++----- iocore/eventsystem/I_IOBuffer.h | 21 +++++--- iocore/eventsystem/P_IOBuffer.h | 112 ++++++++++++++++++++++++++-------------- 3 files changed, 102 insertions(+), 57 deletions(-) diff --git a/iocore/eventsystem/IOBuffer.cc b/iocore/eventsystem/IOBuffer.cc index b73d81e..b2aa507 100644 --- a/iocore/eventsystem/IOBuffer.cc +++ b/iocore/eventsystem/IOBuffer.cc @@ -79,7 +79,7 @@ MIOBuffer::remove_append(IOBufferReader *r) } r->start_offset = 0; l += b->read_avail(); - append_block(b); + append_block(b.get()); } r->mbuf->_writer = NULL; return l; @@ -140,7 +140,7 @@ int64_t MIOBuffer::write(IOBufferReader *r, int64_t alen, int64_t offset) { int64_t len = alen; - IOBufferBlock *b = r->block; + IOBufferBlock *b = r->block.get(); offset += r->start_offset; while (b && len > 0) { @@ -148,22 +148,24 @@ MIOBuffer::write(IOBufferReader *r, int64_t alen, int64_t offset) max_bytes -= offset; if (max_bytes <= 0) { offset = -max_bytes; - b = b->next; + b = b->next.get(); continue; } int64_t bytes; - if (len < 0 || len >= max_bytes) + if (len < 0 || len >= max_bytes) { bytes = max_bytes; - else + } else { bytes = len; + } IOBufferBlock *bb = b->clone(); bb->_start += offset; bb->_buf_end = bb->_end = bb->_start + bytes; append_block(bb); offset = 0; len -= bytes; - b = b->next; + b = b->next.get(); } + return alen - len; } @@ -212,7 +214,7 @@ IOBufferReader::read(void *ab, int64_t len) int64_t IOBufferReader::memchr(char c, int64_t len, int64_t offset) { - IOBufferBlock *b = block; + IOBufferBlock *b = block.get(); offset += start_offset; int64_t o = offset; @@ -221,7 +223,7 @@ IOBufferReader::memchr(char c, int64_t len, int64_t offset) max_bytes -= offset; if (max_bytes <= 0) { offset = -max_bytes; - b = b->next; + b = b->next.get(); continue; } int64_t bytes; @@ -235,7 +237,7 @@ IOBufferReader::memchr(char c, int64_t len, int64_t offset) return (int64_t)(o - start_offset + p - s); o += bytes; len -= bytes; - b = b->next; + b = b->next.get(); offset = 0; } @@ -246,7 +248,7 @@ char * IOBufferReader::memcpy(const void *ap, int64_t len, int64_t offset) { char *p = (char *)ap; - IOBufferBlock *b = block; + IOBufferBlock *b = block.get(); offset += start_offset; while (b && len) { @@ -254,7 +256,7 @@ IOBufferReader::memcpy(const void *ap, int64_t len, int64_t offset) max_bytes -= offset; if (max_bytes <= 0) { offset = -max_bytes; - b = b->next; + b = b->next.get(); continue; } int64_t bytes; @@ -265,7 +267,7 @@ IOBufferReader::memcpy(const void *ap, int64_t len, int64_t offset) ::memcpy(p, b->start() + offset, bytes); p += bytes; len -= bytes; - b = b->next; + b = b->next.get(); offset = 0; } diff --git a/iocore/eventsystem/I_IOBuffer.h b/iocore/eventsystem/I_IOBuffer.h index 5931f90..b50dfb2 100644 --- a/iocore/eventsystem/I_IOBuffer.h +++ b/iocore/eventsystem/I_IOBuffer.h @@ -917,18 +917,19 @@ public: Returns a pointer to the first writable block on the block chain. Returns NULL if there are not currently any writable blocks on the block list. - */ IOBufferBlock * first_write_block() { if (_writer) { - if (_writer->next && !_writer->write_avail()) - return _writer->next; + if (_writer->next && !_writer->write_avail()) { + return _writer->next.get(); + } ink_assert(!_writer->next || !_writer->next->read_avail()); - return _writer; - } else - return NULL; + return _writer.get(); + } + + return NULL; } char * @@ -937,16 +938,19 @@ public: IOBufferBlock *b = first_write_block(); return b ? b->buf() : 0; } + char * buf_end() { return first_write_block()->buf_end(); } + char * start() { return first_write_block()->start(); } + char * end() { @@ -1318,6 +1322,11 @@ public: { return new_IOBufferBlock_internal(loc, d, len, offset); } + IOBufferBlock * + operator()(Ptr<IOBufferData> &d, int64_t len = 0, int64_t offset = 0) + { + return new_IOBufferBlock_internal(loc, d.get(), len, offset); + } }; #endif diff --git a/iocore/eventsystem/P_IOBuffer.h b/iocore/eventsystem/P_IOBuffer.h index 1298b89..2046ca6 100644 --- a/iocore/eventsystem/P_IOBuffer.h +++ b/iocore/eventsystem/P_IOBuffer.h @@ -69,27 +69,32 @@ index_to_buffer_size(int64_t idx) } TS_INLINE IOBufferBlock * -iobufferblock_clone(IOBufferBlock *b, int64_t offset, int64_t len) +iobufferblock_clone(IOBufferBlock *src, int64_t offset, int64_t len) { IOBufferBlock *start_buf = NULL; IOBufferBlock *current_buf = NULL; - while (b && len >= 0) { - char *start = b->_start; - char *end = b->_end; + while (src && len >= 0) { + char *start = src->_start; + char *end = src->_end; int64_t max_bytes = end - start; + max_bytes -= offset; if (max_bytes <= 0) { offset = -max_bytes; - b = b->next; + src = src->next.get(); continue; } + int64_t bytes = len; - if (bytes >= max_bytes) + if (bytes >= max_bytes) { bytes = max_bytes; - IOBufferBlock *new_buf = b->clone(); + } + + IOBufferBlock *new_buf = src->clone(); new_buf->_start += offset; new_buf->_buf_end = new_buf->_end = new_buf->_start + bytes; + if (!start_buf) { start_buf = new_buf; current_buf = start_buf; @@ -97,10 +102,12 @@ iobufferblock_clone(IOBufferBlock *b, int64_t offset, int64_t len) current_buf->next = new_buf; current_buf = new_buf; } + len -= bytes; - b = b->next; + src = src->next.get(); offset = 0; } + return start_buf; } @@ -109,16 +116,21 @@ iobufferblock_skip(IOBufferBlock *b, int64_t *poffset, int64_t *plen, int64_t wr { int64_t offset = *poffset; int64_t len = write; + while (b && len >= 0) { int64_t max_bytes = b->read_avail(); + + // If this block ends before the start offset, skip it + // and adjust the offset to consume its length. max_bytes -= offset; if (max_bytes <= 0) { offset = -max_bytes; - b = b->next; + b = b->next.get(); continue; } + if (len >= max_bytes) { - b = b->next; + b = b->next.get(); len -= max_bytes; offset = 0; } else { @@ -126,14 +138,13 @@ iobufferblock_skip(IOBufferBlock *b, int64_t *poffset, int64_t *plen, int64_t wr break; } } + *poffset = offset; *plen -= write; return b; } #ifdef TRACK_BUFFER_USER -extern Resource *res_lookup(const char *path); - TS_INLINE void iobuffer_mem_inc(const char *_loc, int64_t _size_index) { @@ -406,19 +417,25 @@ TS_INLINE void IOBufferBlock::clear() { data = NULL; - IOBufferBlock *p = next; + + IOBufferBlock *p = next.get(); while (p) { - int r = p->refcount_dec(); - if (r) - break; - else { - IOBufferBlock *n = p->next.m_ptr; - p->next.m_ptr = NULL; + // If our block pointer refcount dropped to zero, + // recursively free the list. + if (p->refcount_dec() == 0) { + IOBufferBlock *n = p->next.detach(); p->free(); p = n; + } else { + // We don't hold the last refcount, so we are done. + break; } } - next.m_ptr = NULL; + + // Nuke the next pointer without dropping the refcount + // because we already manually did that. + next.detach(); + _buf_end = _end = _start = NULL; } @@ -555,14 +572,16 @@ IOBufferReader::current_low_water() TS_INLINE IOBufferBlock * IOBufferReader::get_current_block() { - return block; + return block.get(); } TS_INLINE char * IOBufferReader::start() { - if (block == 0) + if (!block) { return 0; + } + skip_empty_blocks(); return block->start() + start_offset; } @@ -570,8 +589,10 @@ IOBufferReader::start() TS_INLINE char * IOBufferReader::end() { - if (block == 0) + if (!block) { return 0; + } + skip_empty_blocks(); return block->end(); } @@ -579,8 +600,10 @@ IOBufferReader::end() TS_INLINE int64_t IOBufferReader::block_read_avail() { - if (block == 0) + if (!block) { return 0; + } + skip_empty_blocks(); return (int64_t)(block->end() - (block->start() + start_offset)); } @@ -589,12 +612,13 @@ TS_INLINE int IOBufferReader::block_count() { int count = 0; - IOBufferBlock *b = block; + IOBufferBlock *b = block.get(); while (b) { count++; - b = b->next; + b = b->next.get(); } + return count; } @@ -602,15 +626,18 @@ TS_INLINE int64_t IOBufferReader::read_avail() { int64_t t = 0; - IOBufferBlock *b = block; + IOBufferBlock *b = block.get(); while (b) { t += b->read_avail(); - b = b->next; + b = b->next.get(); } + t -= start_offset; - if (size_limit != INT64_MAX && t > size_limit) + if (size_limit != INT64_MAX && t > size_limit) { t = size_limit; + } + return t; } @@ -618,13 +645,14 @@ inline bool IOBufferReader::is_read_avail_more_than(int64_t size) { int64_t t = -start_offset; - IOBufferBlock *b = block; + IOBufferBlock *b = block.get(); + while (b) { t += b->read_avail(); if (t > size) { return true; } - b = b->next; + b = b->next.get(); } return false; } @@ -633,11 +661,15 @@ TS_INLINE void IOBufferReader::consume(int64_t n) { start_offset += n; - if (size_limit != INT64_MAX) + if (size_limit != INT64_MAX) { size_limit -= n; + } + ink_assert(size_limit >= 0); - if (block == 0) + if (!block) { return; + } + int64_t r = block->read_avail(); int64_t s = start_offset; while (r <= s && block->next && block->next->read_avail()) { @@ -646,26 +678,28 @@ IOBufferReader::consume(int64_t n) block = block->next; r = block->read_avail(); } + ink_assert(read_avail() >= 0); } TS_INLINE char &IOBufferReader::operator[](int64_t i) { static char _error = '\0'; + IOBufferBlock *b = block.get(); - IOBufferBlock *b = block; i += start_offset; while (b) { int64_t bytes = b->read_avail(); if (bytes > i) return b->start()[i]; i -= bytes; - b = b->next; + b = b->next.get(); } ink_assert(!"out of range"); - if (unlikely(b)) + if (unlikely(b)) { return *b->start(); + } return _error; } @@ -893,7 +927,7 @@ MIOBuffer::append_block_internal(IOBufferBlock *b) _writer->next = b; while (b->read_avail()) { _writer = b; - b = b->next; + b = b->next.get(); if (!b) break; } @@ -964,10 +998,10 @@ TS_INLINE int64_t MIOBuffer::current_write_avail() { int64_t t = 0; - IOBufferBlock *b = _writer; + IOBufferBlock *b = _writer.get(); while (b) { t += b->write_avail(); - b = b->next; + b = b->next.get(); } return t; } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
