Updated Branches: refs/heads/master 4a4c89388 -> 6a262b229
TS-1150 Improve performance for the hdr_heap protection, reducing the protection refcnt increments / decrements by 100x, give or take. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/6a262b22 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/6a262b22 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/6a262b22 Branch: refs/heads/master Commit: 6a262b229abc9f1dbe565179f9ece44e2789a1a3 Parents: 4a4c893 Author: Leif Hedstrom <[email protected]> Authored: Thu Mar 29 14:50:12 2012 -0600 Committer: Leif Hedstrom <[email protected]> Committed: Wed Apr 25 11:28:49 2012 -0600 ---------------------------------------------------------------------- proxy/CoreUtils.cc | 1 - proxy/hdrs/HdrHeap.cc | 20 ++-------------- proxy/hdrs/HdrHeap.h | 53 ++++++++++++++++++++++++++++--------------- proxy/hdrs/MIME.cc | 3 +- 4 files changed, 39 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6a262b22/proxy/CoreUtils.cc ---------------------------------------------------------------------- diff --git a/proxy/CoreUtils.cc b/proxy/CoreUtils.cc index 9c79af4..3b74d6f 100644 --- a/proxy/CoreUtils.cc +++ b/proxy/CoreUtils.cc @@ -151,7 +151,6 @@ FILE *fp; memTable default_memTable = { 0, 0, 0 }; DynArray<struct memTable>arrayMem(&default_memTable, 0); -const int HDR_HEAP_HDR_SIZE = ROUND(sizeof(HdrHeap), HDR_PTR_SIZE); HTTPHdrImpl *global_http; HttpSM *last_seen_http_sm = NULL; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6a262b22/proxy/hdrs/HdrHeap.cc ---------------------------------------------------------------------- diff --git a/proxy/hdrs/HdrHeap.cc b/proxy/hdrs/HdrHeap.cc index 9392290..aced42d 100644 --- a/proxy/hdrs/HdrHeap.cc +++ b/proxy/hdrs/HdrHeap.cc @@ -36,9 +36,6 @@ #include "MIME.h" #include "HTTP.h" -#define HDR_MAX_ALLOC_SIZE (HDR_HEAP_DEFAULT_SIZE - sizeof(HdrHeap)) -#define HDR_HEAP_HDR_SIZE ROUND(sizeof(HdrHeap), HDR_PTR_SIZE) -#define STR_HEAP_HDR_SIZE sizeof(HdrStrHeap) #define MAX_LOST_STR_SPACE 1024 Allocator hdrHeapAllocator("hdrHeap", HDR_HEAP_DEFAULT_SIZE); @@ -303,19 +300,8 @@ FAILED: char * HdrHeap::expand_str(const char *old_str, int old_len, int new_len) { - char *rw_ptr = (char *) m_read_write_heap.m_ptr; - - if (rw_ptr) { - // First check to see the old string is in this read-write string - // heap - if (old_str >= rw_ptr + STR_HEAP_HDR_SIZE && old_str < rw_ptr + m_read_write_heap->m_heap_size) { - // We're in the heap. Try to grow the string - char *r = m_read_write_heap->expand((char *) old_str, old_len, new_len); - if (r) { - return r; - } - } - } + if (m_read_write_heap && m_read_write_heap->contains(old_str)) + return m_read_write_heap->expand((char *)old_str, old_len, new_len); return NULL; } @@ -328,7 +314,7 @@ HdrHeap::expand_str(const char *old_str, int old_len, int new_len) char * HdrHeap::duplicate_str(const char *str, int nbytes) { - ProtectHeaps protect(this); // Don't let the source get de-allocated. + HeapGuard guard(this, str); // Don't let the source get de-allocated. char *new_str = allocate_str(nbytes); memcpy(new_str, str, nbytes); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6a262b22/proxy/hdrs/HdrHeap.h ---------------------------------------------------------------------- diff --git a/proxy/hdrs/HdrHeap.h b/proxy/hdrs/HdrHeap.h index 4d76f6b..90d1bb0 100644 --- a/proxy/hdrs/HdrHeap.h +++ b/proxy/hdrs/HdrHeap.h @@ -58,6 +58,10 @@ #define HDR_HEAP_DEFAULT_SIZE 2048 #define HDR_STR_HEAP_DEFAULT_SIZE 2048 +#define HDR_MAX_ALLOC_SIZE (HDR_HEAP_DEFAULT_SIZE - sizeof(HdrHeap)) +#define HDR_HEAP_HDR_SIZE ROUND(sizeof(HdrHeap), HDR_PTR_SIZE) +#define STR_HEAP_HDR_SIZE sizeof(HdrStrHeap) + enum { HDR_HEAP_OBJ_EMPTY = 0, @@ -143,6 +147,11 @@ struct StrHeapDesc char *m_heap_start; int32_t m_heap_len; bool m_locked; + + bool contains(const char *str) const + { + return (str >= m_heap_start && str < (m_heap_start + m_heap_len)); + } }; @@ -161,6 +170,11 @@ public: uint32_t m_heap_size; char *m_free_start; uint32_t m_free_size; + + bool contains(const char *str) const + { + return (str >= ((const char*)this + STR_HEAP_HDR_SIZE) && str < ((const char*)this + m_heap_size)); + } }; class CoreUtils; @@ -252,31 +266,32 @@ public: int attach_str_heap(char *h_start, int h_len, RefCountObj * h_ref_obj, int *index); /** Struct to prevent garbage collection on heaps. - This bumps the reference count to the heaps while the - instance of this class exists. When it goes out of scope - the references are dropped. This is useful inside a method or - block to keep all the heap data around until leaving the scope. + This bumps the reference count to the heap containing the pointer + while the instance of this class exists. When it goes out of scope + the reference is dropped. This is useful inside a method or block + to keep the required heap data around until leaving the scope. */ - struct ProtectHeaps { + struct HeapGuard { /// Construct the protection. - ProtectHeaps(HdrHeap* heap) - : m_read_write_heap(heap->m_read_write_heap) + HeapGuard(HdrHeap* heap, const char *str) { - for (int i=0; i < HDR_BUF_RONLY_HEAPS; ++i) - m_ronly_heap[i] = heap->m_ronly_heap[i].m_ref_count_ptr; + if (heap->m_read_write_heap && heap->m_read_write_heap->contains(str)) { + m_ptr = heap->m_read_write_heap; + } else { + for (int i=0; i < HDR_BUF_RONLY_HEAPS; ++i) { + if (heap->m_ronly_heap[i].contains(str)) { + m_ptr = heap->m_ronly_heap[i].m_ref_count_ptr; + break; + } + } + } } - /// Drop the protection. - ~ProtectHeaps() - { - // The default destructor takes care of the rw-heap - for (int i=0; i < HDR_BUF_RONLY_HEAPS; ++i) - m_ronly_heap[i] = NULL; - } + // There's no need to have a destructor here, the default dtor will take care of + // releaseing the (potentially) locked heap. - Ptr<HdrStrHeap> m_read_write_heap; ///< Reference to RW heap. - /// References to string heaps. - Ptr<RefCountObj> m_ronly_heap[HDR_BUF_RONLY_HEAPS]; + /// The heap we protect (if any) + Ptr<RefCountObj> m_ptr; }; // String Heap access http://git-wip-us.apache.org/repos/asf/trafficserver/blob/6a262b22/proxy/hdrs/MIME.cc ---------------------------------------------------------------------- diff --git a/proxy/hdrs/MIME.cc b/proxy/hdrs/MIME.cc index c82da56..b175ff6 100644 --- a/proxy/hdrs/MIME.cc +++ b/proxy/hdrs/MIME.cc @@ -1763,7 +1763,8 @@ mime_field_value_str_from_strlist(HdrHeap *heap, int *new_str_len_return, StrLis Str *cell; char *new_value, *dest; int i, new_value_len; - HdrHeap::ProtectHeaps protect(heap); + // This works, because all strings are from the same heap when it is "split" into the list. + HdrHeap::HeapGuard guard(heap, list->head->str); new_value_len = 0;
