You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2020/02/04 22:59:45 UTC

[trafficserver] 02/02: Run dos2unix on all files in tree

This is an automated email from the ASF dual-hosted git repository.

bcall pushed a commit to branch 8.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit 3f3b54fe9be3dfedf4185b181602487aef27fd4e
Author: Randall Meyer <rr...@apache.org>
AuthorDate: Wed Nov 20 16:32:18 2019 +0800

    Run dos2unix on all files in tree
    
    Intentionally ignorng files under lib/yamlcpp (since we just maintain a
    copy of their distro)
    
    (cherry picked from commit 994a2f04be6c28ffe7207c08480ad944690a0411)
    
    Additional files on 8.0.x to backport
            include/tscore/MT_hashtable.h
            tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
    
    Conflicts:
    	tests/gold_tests/pluginTest/regex_remap/gold/regex_remap_crash.gold
    	tests/gold_tests/pluginTest/regex_remap/gold/regex_remap_smoke.gold
    	tests/gold_tests/pluginTest/regex_revalidate/gold/regex_reval-hit.gold
    	tests/gold_tests/pluginTest/regex_revalidate/gold/regex_reval-miss.gold
    	tests/gold_tests/pluginTest/regex_revalidate/gold/regex_reval-stale.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_200.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_206.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_first.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_last.stderr.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_last.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_mid.stderr.gold
    	tests/gold_tests/pluginTest/slice/gold/slice_mid.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold_error/crr.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold_error/etag.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold_error/lm.stdout.gold
    	tests/gold_tests/pluginTest/slice/gold_error/non206.stdout.gold
---
 include/tscore/MT_hashtable.h                      | 882 ++++++++++-----------
 .../data/www.customplugin204.test_get.txt          |   4 +-
 .../data/www.customtemplate204.test_get.txt        |   4 +-
 .../body_factory/data/www.default204.test_get.txt  |   4 +-
 .../body_factory/data/www.default304.test_get.txt  |   4 +-
 .../body_factory/data/www.example.test_get_200.txt |   6 +-
 .../body_factory/data/www.example.test_get_304.txt |   8 +-
 .../body_factory/data/www.example.test_head.txt    |   6 +-
 .../data/www.example.test_head_200.txt             |   6 +-
 .../headers/data/www.passthrough.test_get.txt      |   4 +-
 .../headers/data/www.redirect0.test_get.txt        |   4 +-
 .../headers/data/www.redirect301.test_get.txt      |   4 +-
 .../headers/data/www.redirect302.test_get.txt      |   4 +-
 .../headers/data/www.redirect307.test_get.txt      |   4 +-
 .../headers/data/www.redirect308.test_get.txt      |   4 +-
 .../headers/general-connection-failure-502.gold    |  14 +-
 tests/gold_tests/pluginTest/url_sig/url_sig.gold   |  30 +-
 .../gold_tests/pluginTest/xdebug/x_remap/out.gold  |  58 +-
 tests/gold_tests/redirect/gold/redirect.gold       |   6 +-
 19 files changed, 528 insertions(+), 528 deletions(-)

diff --git a/include/tscore/MT_hashtable.h b/include/tscore/MT_hashtable.h
index bfbae79..2c24225 100644
--- a/include/tscore/MT_hashtable.h
+++ b/include/tscore/MT_hashtable.h
@@ -1,441 +1,441 @@
-/** @file
-
-  A brief file description
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-/****************************************************************************
-
-  MT_hashtable.h
-
-  Multithread Safe Hash table implementation
-
-
- ****************************************************************************/
-#pragma once
-
-#define MT_HASHTABLE_PARTITION_BITS 6
-#define MT_HASHTABLE_PARTITIONS (1 << MT_HASHTABLE_PARTITION_BITS)
-#define MT_HASHTABLE_PARTITION_MASK (MT_HASHTABLE_PARTITIONS - 1)
-#define MT_HASHTABLE_MAX_CHAIN_AVG_LEN 4
-template <class key_t, class data_t> struct HashTableEntry {
-  key_t key;
-  data_t data;
-  HashTableEntry *next;
-
-  static HashTableEntry *
-  alloc()
-  {
-    return (HashTableEntry *)ats_malloc(sizeof(HashTableEntry));
-  }
-
-  static void
-  free(HashTableEntry *entry)
-  {
-    ats_free(entry);
-  }
-};
-
-/*
-struct MT_ListEntry{
-  MT_ListEntry():next(NULL),prev(NULL){}
-  MT_ListEntry* next;
-  MT_ListEntry* prev;
-};
-
-#define INIT_CHAIN_HEAD(h) {(h)->next = (h)->prev = (h);}
-#define APPEND_TO_CHAIN(h, p) {(p)->next = (h)->next; (h)->next->prev = (p); (p)->prev = (h); (h)->next = (p);}
-#define REMOVE_FROM_CHAIN(p) {(p)->next->prev = (p)->prev; (p)->prev->next = (p)->next; (p)->prev = (p)->next = NULL;}
-#define GET_OBJ_PTR(p, type, offset) ((type*)((char*)(p) - offset))
-*/
-
-template <class key_t, class data_t> class HashTableIteratorState
-{
-public:
-  HashTableIteratorState() : cur_buck(-1), ppcur(NULL) {}
-  int cur_buck;
-  HashTableEntry<key_t, data_t> **ppcur;
-};
-
-template <class key_t, class data_t> class IMTHashTable
-{
-public:
-  IMTHashTable(int size, bool (*gc_func)(data_t) = NULL, void (*pre_gc_func)(void) = nullptr)
-  {
-    m_gc_func     = gc_func;
-    m_pre_gc_func = pre_gc_func;
-    bucket_num    = size;
-    cur_size      = 0;
-    buckets       = new HashTableEntry<key_t, data_t> *[bucket_num];
-    memset(buckets, 0, bucket_num * sizeof(HashTableEntry<key_t, data_t> *));
-  }
-  ~IMTHashTable() { reset(); }
-  int
-  getBucketNum()
-  {
-    return bucket_num;
-  }
-  int
-  getCurSize()
-  {
-    return cur_size;
-  }
-
-  int
-  bucket_id(key_t key, int a_bucket_num)
-  {
-    return (int)(((key >> MT_HASHTABLE_PARTITION_BITS) ^ key) % a_bucket_num);
-  }
-
-  int
-  bucket_id(key_t key)
-  {
-    return bucket_id(key, bucket_num);
-  }
-
-  void
-  reset()
-  {
-    HashTableEntry<key_t, data_t> *tmp;
-    for (int i = 0; i < bucket_num; i++) {
-      tmp = buckets[i];
-      while (tmp) {
-        buckets[i] = tmp->next;
-        HashTableEntry<key_t, data_t>::free(tmp);
-        tmp = buckets[i];
-      }
-    }
-    delete[] buckets;
-    buckets = NULL;
-  }
-
-  data_t insert_entry(key_t key, data_t data);
-  data_t remove_entry(key_t key);
-  data_t lookup_entry(key_t key);
-
-  data_t first_entry(int bucket_id, HashTableIteratorState<key_t, data_t> *s);
-  static data_t next_entry(HashTableIteratorState<key_t, data_t> *s);
-  static data_t cur_entry(HashTableIteratorState<key_t, data_t> *s);
-  data_t remove_entry(HashTableIteratorState<key_t, data_t> *s);
-
-  void
-  GC(void)
-  {
-    if (m_gc_func == NULL) {
-      return;
-    }
-    if (m_pre_gc_func) {
-      m_pre_gc_func();
-    }
-    for (int i = 0; i < bucket_num; i++) {
-      HashTableEntry<key_t, data_t> *cur  = buckets[i];
-      HashTableEntry<key_t, data_t> *prev = NULL;
-      HashTableEntry<key_t, data_t> *next = NULL;
-      while (cur != NULL) {
-        next = cur->next;
-        if (m_gc_func(cur->data)) {
-          if (prev != NULL) {
-            prev->next = next;
-          } else {
-            buckets[i] = next;
-          }
-          ats_free(cur);
-          cur_size--;
-        } else {
-          prev = cur;
-        }
-        cur = next;
-      }
-    }
-  }
-
-  void
-  resize(int size)
-  {
-    int new_bucket_num                          = size;
-    HashTableEntry<key_t, data_t> **new_buckets = new HashTableEntry<key_t, data_t> *[new_bucket_num];
-    memset(new_buckets, 0, new_bucket_num * sizeof(HashTableEntry<key_t, data_t> *));
-
-    for (int i = 0; i < bucket_num; i++) {
-      HashTableEntry<key_t, data_t> *cur  = buckets[i];
-      HashTableEntry<key_t, data_t> *next = NULL;
-      while (cur != NULL) {
-        next                = cur->next;
-        int new_id          = bucket_id(cur->key, new_bucket_num);
-        cur->next           = new_buckets[new_id];
-        new_buckets[new_id] = cur;
-        cur                 = next;
-      }
-      buckets[i] = NULL;
-    }
-    delete[] buckets;
-    buckets    = new_buckets;
-    bucket_num = new_bucket_num;
-  }
-
-private:
-  HashTableEntry<key_t, data_t> **buckets;
-  int cur_size;
-  int bucket_num;
-  bool (*m_gc_func)(data_t);
-  void (*m_pre_gc_func)(void);
-
-private:
-  IMTHashTable();
-  IMTHashTable(IMTHashTable &);
-};
-
-/*
- * we can use ClassAllocator here if the malloc performance becomes a problem
- */
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::insert_entry(key_t key, data_t data)
-{
-  int id                             = bucket_id(key);
-  HashTableEntry<key_t, data_t> *cur = buckets[id];
-  while (cur != NULL && cur->key != key) {
-    cur = cur->next;
-  }
-  if (cur != NULL) {
-    if (data == cur->data) {
-      return (data_t)0;
-    } else {
-      data_t tmp = cur->data;
-      cur->data  = data;
-      // potential memory leak, need to check the return value by the caller
-      return tmp;
-    }
-  }
-
-  HashTableEntry<key_t, data_t> *newEntry = HashTableEntry<key_t, data_t>::alloc();
-  newEntry->key                           = key;
-  newEntry->data                          = data;
-  newEntry->next                          = buckets[id];
-  buckets[id]                             = newEntry;
-  cur_size++;
-  if (cur_size / bucket_num > MT_HASHTABLE_MAX_CHAIN_AVG_LEN) {
-    GC();
-    if (cur_size / bucket_num > MT_HASHTABLE_MAX_CHAIN_AVG_LEN) {
-      resize(bucket_num * 2);
-    }
-  }
-  return (data_t)0;
-}
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::remove_entry(key_t key)
-{
-  int id                              = bucket_id(key);
-  data_t ret                          = (data_t)0;
-  HashTableEntry<key_t, data_t> *cur  = buckets[id];
-  HashTableEntry<key_t, data_t> *prev = NULL;
-  while (cur != NULL && cur->key != key) {
-    prev = cur;
-    cur  = cur->next;
-  }
-  if (cur != NULL) {
-    if (prev != NULL) {
-      prev->next = cur->next;
-    } else {
-      buckets[id] = cur->next;
-    }
-    ret = cur->data;
-    HashTableEntry<key_t, data_t>::free(cur);
-    cur_size--;
-  }
-
-  return ret;
-}
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::lookup_entry(key_t key)
-{
-  int id                             = bucket_id(key);
-  data_t ret                         = (data_t)0;
-  HashTableEntry<key_t, data_t> *cur = buckets[id];
-  while (cur != NULL && cur->key != key) {
-    cur = cur->next;
-  }
-  if (cur != NULL) {
-    ret = cur->data;
-  }
-  return ret;
-}
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::first_entry(int bucket_id, HashTableIteratorState<key_t, data_t> *s)
-{
-  s->cur_buck = bucket_id;
-  s->ppcur    = &(buckets[bucket_id]);
-  if (*(s->ppcur) != NULL) {
-    return (*(s->ppcur))->data;
-  }
-  return (data_t)0;
-}
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::next_entry(HashTableIteratorState<key_t, data_t> *s)
-{
-  if ((*(s->ppcur)) != NULL) {
-    s->ppcur = &((*(s->ppcur))->next);
-    if (*(s->ppcur) != NULL) {
-      return (*(s->ppcur))->data;
-    }
-  }
-  return (data_t)0;
-}
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::cur_entry(HashTableIteratorState<key_t, data_t> *s)
-{
-  if (*(s->ppcur) == NULL) {
-    return (data_t)0;
-  }
-  return (*(s->ppcur))->data;
-}
-
-template <class key_t, class data_t>
-inline data_t
-IMTHashTable<key_t, data_t>::remove_entry(HashTableIteratorState<key_t, data_t> *s)
-{
-  data_t data                           = (data_t)0;
-  HashTableEntry<key_t, data_t> *pEntry = *(s->ppcur);
-  if (pEntry != NULL) {
-    data          = pEntry->data;
-    (*(s->ppcur)) = pEntry->next;
-    HashTableEntry<key_t, data_t>::free(pEntry);
-    cur_size--;
-  }
-  return data;
-}
-
-template <class key_t, class data_t> class MTHashTable
-{
-public:
-  MTHashTable(int size, bool (*gc_func)(data_t) = NULL, void (*pre_gc_func)(void) = nullptr)
-  {
-    for (int i = 0; i < MT_HASHTABLE_PARTITIONS; i++) {
-      locks[i]      = new_ProxyMutex();
-      hashTables[i] = new IMTHashTable<key_t, data_t>(size, gc_func, pre_gc_func);
-      // INIT_CHAIN_HEAD(&chain_heads[i]);
-      // last_GC_time[i] = 0;
-    }
-    //    cur_items = 0;
-  }
-  ~MTHashTable()
-  {
-    for (int i = 0; i < MT_HASHTABLE_PARTITIONS; i++) {
-      locks[i] = NULL;
-      delete hashTables[i];
-    }
-  }
-
-  ProxyMutex *
-  lock_for_key(key_t key)
-  {
-    return locks[part_num(key)].get();
-  }
-
-  int
-  getSize()
-  {
-    return MT_HASHTABLE_PARTITIONS;
-  }
-  int
-  part_num(key_t key)
-  {
-    return (int)(key & MT_HASHTABLE_PARTITION_MASK);
-  }
-  data_t
-  insert_entry(key_t key, data_t data)
-  {
-    // ink_atomic_increment(&cur_items, 1);
-    return hashTables[part_num(key)]->insert_entry(key, data);
-  }
-  data_t
-  remove_entry(key_t key)
-  {
-    // ink_atomic_increment(&cur_items, -1);
-    return hashTables[part_num(key)]->remove_entry(key);
-  }
-  data_t
-  lookup_entry(key_t key)
-  {
-    return hashTables[part_num(key)]->lookup_entry(key);
-  }
-
-  data_t
-  first_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
-  {
-    data_t ret = (data_t)0;
-    for (int i = 0; i < hashTables[part_id]->getBucketNum(); i++) {
-      ret = hashTables[part_id]->first_entry(i, s);
-      if (ret != (data_t)0) {
-        return ret;
-      }
-    }
-    return (data_t)0;
-  }
-
-  data_t
-  cur_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
-  {
-    data_t data = IMTHashTable<key_t, data_t>::cur_entry(s);
-    if (!data) {
-      data = next_entry(part_id, s);
-    }
-    return data;
-  };
-  data_t
-  next_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
-  {
-    data_t ret = IMTHashTable<key_t, data_t>::next_entry(s);
-    if (ret != (data_t)0) {
-      return ret;
-    }
-    for (int i = s->cur_buck + 1; i < hashTables[part_id]->getBucketNum(); i++) {
-      ret = hashTables[part_id]->first_entry(i, s);
-      if (ret != (data_t)0) {
-        return ret;
-      }
-    }
-    return (data_t)0;
-  }
-  data_t
-  remove_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
-  {
-    // ink_atomic_increment(&cur_items, -1);
-    return hashTables[part_id]->remove_entry(s);
-  }
-
-private:
-  IMTHashTable<key_t, data_t> *hashTables[MT_HASHTABLE_PARTITIONS];
-  Ptr<ProxyMutex> locks[MT_HASHTABLE_PARTITIONS];
-  // MT_ListEntry chain_heads[MT_HASHTABLE_PARTITIONS];
-  // int last_GC_time[MT_HASHTABLE_PARTITIONS];
-  // int32_t cur_items;
-};
+/** @file
+
+  A brief file description
+
+  @section license License
+
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ */
+
+/****************************************************************************
+
+  MT_hashtable.h
+
+  Multithread Safe Hash table implementation
+
+
+ ****************************************************************************/
+#pragma once
+
+#define MT_HASHTABLE_PARTITION_BITS 6
+#define MT_HASHTABLE_PARTITIONS (1 << MT_HASHTABLE_PARTITION_BITS)
+#define MT_HASHTABLE_PARTITION_MASK (MT_HASHTABLE_PARTITIONS - 1)
+#define MT_HASHTABLE_MAX_CHAIN_AVG_LEN 4
+template <class key_t, class data_t> struct HashTableEntry {
+  key_t key;
+  data_t data;
+  HashTableEntry *next;
+
+  static HashTableEntry *
+  alloc()
+  {
+    return (HashTableEntry *)ats_malloc(sizeof(HashTableEntry));
+  }
+
+  static void
+  free(HashTableEntry *entry)
+  {
+    ats_free(entry);
+  }
+};
+
+/*
+struct MT_ListEntry{
+  MT_ListEntry():next(NULL),prev(NULL){}
+  MT_ListEntry* next;
+  MT_ListEntry* prev;
+};
+
+#define INIT_CHAIN_HEAD(h) {(h)->next = (h)->prev = (h);}
+#define APPEND_TO_CHAIN(h, p) {(p)->next = (h)->next; (h)->next->prev = (p); (p)->prev = (h); (h)->next = (p);}
+#define REMOVE_FROM_CHAIN(p) {(p)->next->prev = (p)->prev; (p)->prev->next = (p)->next; (p)->prev = (p)->next = NULL;}
+#define GET_OBJ_PTR(p, type, offset) ((type*)((char*)(p) - offset))
+*/
+
+template <class key_t, class data_t> class HashTableIteratorState
+{
+public:
+  HashTableIteratorState() : cur_buck(-1), ppcur(NULL) {}
+  int cur_buck;
+  HashTableEntry<key_t, data_t> **ppcur;
+};
+
+template <class key_t, class data_t> class IMTHashTable
+{
+public:
+  IMTHashTable(int size, bool (*gc_func)(data_t) = NULL, void (*pre_gc_func)(void) = nullptr)
+  {
+    m_gc_func     = gc_func;
+    m_pre_gc_func = pre_gc_func;
+    bucket_num    = size;
+    cur_size      = 0;
+    buckets       = new HashTableEntry<key_t, data_t> *[bucket_num];
+    memset(buckets, 0, bucket_num * sizeof(HashTableEntry<key_t, data_t> *));
+  }
+  ~IMTHashTable() { reset(); }
+  int
+  getBucketNum()
+  {
+    return bucket_num;
+  }
+  int
+  getCurSize()
+  {
+    return cur_size;
+  }
+
+  int
+  bucket_id(key_t key, int a_bucket_num)
+  {
+    return (int)(((key >> MT_HASHTABLE_PARTITION_BITS) ^ key) % a_bucket_num);
+  }
+
+  int
+  bucket_id(key_t key)
+  {
+    return bucket_id(key, bucket_num);
+  }
+
+  void
+  reset()
+  {
+    HashTableEntry<key_t, data_t> *tmp;
+    for (int i = 0; i < bucket_num; i++) {
+      tmp = buckets[i];
+      while (tmp) {
+        buckets[i] = tmp->next;
+        HashTableEntry<key_t, data_t>::free(tmp);
+        tmp = buckets[i];
+      }
+    }
+    delete[] buckets;
+    buckets = NULL;
+  }
+
+  data_t insert_entry(key_t key, data_t data);
+  data_t remove_entry(key_t key);
+  data_t lookup_entry(key_t key);
+
+  data_t first_entry(int bucket_id, HashTableIteratorState<key_t, data_t> *s);
+  static data_t next_entry(HashTableIteratorState<key_t, data_t> *s);
+  static data_t cur_entry(HashTableIteratorState<key_t, data_t> *s);
+  data_t remove_entry(HashTableIteratorState<key_t, data_t> *s);
+
+  void
+  GC(void)
+  {
+    if (m_gc_func == NULL) {
+      return;
+    }
+    if (m_pre_gc_func) {
+      m_pre_gc_func();
+    }
+    for (int i = 0; i < bucket_num; i++) {
+      HashTableEntry<key_t, data_t> *cur  = buckets[i];
+      HashTableEntry<key_t, data_t> *prev = NULL;
+      HashTableEntry<key_t, data_t> *next = NULL;
+      while (cur != NULL) {
+        next = cur->next;
+        if (m_gc_func(cur->data)) {
+          if (prev != NULL) {
+            prev->next = next;
+          } else {
+            buckets[i] = next;
+          }
+          ats_free(cur);
+          cur_size--;
+        } else {
+          prev = cur;
+        }
+        cur = next;
+      }
+    }
+  }
+
+  void
+  resize(int size)
+  {
+    int new_bucket_num                          = size;
+    HashTableEntry<key_t, data_t> **new_buckets = new HashTableEntry<key_t, data_t> *[new_bucket_num];
+    memset(new_buckets, 0, new_bucket_num * sizeof(HashTableEntry<key_t, data_t> *));
+
+    for (int i = 0; i < bucket_num; i++) {
+      HashTableEntry<key_t, data_t> *cur  = buckets[i];
+      HashTableEntry<key_t, data_t> *next = NULL;
+      while (cur != NULL) {
+        next                = cur->next;
+        int new_id          = bucket_id(cur->key, new_bucket_num);
+        cur->next           = new_buckets[new_id];
+        new_buckets[new_id] = cur;
+        cur                 = next;
+      }
+      buckets[i] = NULL;
+    }
+    delete[] buckets;
+    buckets    = new_buckets;
+    bucket_num = new_bucket_num;
+  }
+
+private:
+  HashTableEntry<key_t, data_t> **buckets;
+  int cur_size;
+  int bucket_num;
+  bool (*m_gc_func)(data_t);
+  void (*m_pre_gc_func)(void);
+
+private:
+  IMTHashTable();
+  IMTHashTable(IMTHashTable &);
+};
+
+/*
+ * we can use ClassAllocator here if the malloc performance becomes a problem
+ */
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::insert_entry(key_t key, data_t data)
+{
+  int id                             = bucket_id(key);
+  HashTableEntry<key_t, data_t> *cur = buckets[id];
+  while (cur != NULL && cur->key != key) {
+    cur = cur->next;
+  }
+  if (cur != NULL) {
+    if (data == cur->data) {
+      return (data_t)0;
+    } else {
+      data_t tmp = cur->data;
+      cur->data  = data;
+      // potential memory leak, need to check the return value by the caller
+      return tmp;
+    }
+  }
+
+  HashTableEntry<key_t, data_t> *newEntry = HashTableEntry<key_t, data_t>::alloc();
+  newEntry->key                           = key;
+  newEntry->data                          = data;
+  newEntry->next                          = buckets[id];
+  buckets[id]                             = newEntry;
+  cur_size++;
+  if (cur_size / bucket_num > MT_HASHTABLE_MAX_CHAIN_AVG_LEN) {
+    GC();
+    if (cur_size / bucket_num > MT_HASHTABLE_MAX_CHAIN_AVG_LEN) {
+      resize(bucket_num * 2);
+    }
+  }
+  return (data_t)0;
+}
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::remove_entry(key_t key)
+{
+  int id                              = bucket_id(key);
+  data_t ret                          = (data_t)0;
+  HashTableEntry<key_t, data_t> *cur  = buckets[id];
+  HashTableEntry<key_t, data_t> *prev = NULL;
+  while (cur != NULL && cur->key != key) {
+    prev = cur;
+    cur  = cur->next;
+  }
+  if (cur != NULL) {
+    if (prev != NULL) {
+      prev->next = cur->next;
+    } else {
+      buckets[id] = cur->next;
+    }
+    ret = cur->data;
+    HashTableEntry<key_t, data_t>::free(cur);
+    cur_size--;
+  }
+
+  return ret;
+}
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::lookup_entry(key_t key)
+{
+  int id                             = bucket_id(key);
+  data_t ret                         = (data_t)0;
+  HashTableEntry<key_t, data_t> *cur = buckets[id];
+  while (cur != NULL && cur->key != key) {
+    cur = cur->next;
+  }
+  if (cur != NULL) {
+    ret = cur->data;
+  }
+  return ret;
+}
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::first_entry(int bucket_id, HashTableIteratorState<key_t, data_t> *s)
+{
+  s->cur_buck = bucket_id;
+  s->ppcur    = &(buckets[bucket_id]);
+  if (*(s->ppcur) != NULL) {
+    return (*(s->ppcur))->data;
+  }
+  return (data_t)0;
+}
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::next_entry(HashTableIteratorState<key_t, data_t> *s)
+{
+  if ((*(s->ppcur)) != NULL) {
+    s->ppcur = &((*(s->ppcur))->next);
+    if (*(s->ppcur) != NULL) {
+      return (*(s->ppcur))->data;
+    }
+  }
+  return (data_t)0;
+}
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::cur_entry(HashTableIteratorState<key_t, data_t> *s)
+{
+  if (*(s->ppcur) == NULL) {
+    return (data_t)0;
+  }
+  return (*(s->ppcur))->data;
+}
+
+template <class key_t, class data_t>
+inline data_t
+IMTHashTable<key_t, data_t>::remove_entry(HashTableIteratorState<key_t, data_t> *s)
+{
+  data_t data                           = (data_t)0;
+  HashTableEntry<key_t, data_t> *pEntry = *(s->ppcur);
+  if (pEntry != NULL) {
+    data          = pEntry->data;
+    (*(s->ppcur)) = pEntry->next;
+    HashTableEntry<key_t, data_t>::free(pEntry);
+    cur_size--;
+  }
+  return data;
+}
+
+template <class key_t, class data_t> class MTHashTable
+{
+public:
+  MTHashTable(int size, bool (*gc_func)(data_t) = NULL, void (*pre_gc_func)(void) = nullptr)
+  {
+    for (int i = 0; i < MT_HASHTABLE_PARTITIONS; i++) {
+      locks[i]      = new_ProxyMutex();
+      hashTables[i] = new IMTHashTable<key_t, data_t>(size, gc_func, pre_gc_func);
+      // INIT_CHAIN_HEAD(&chain_heads[i]);
+      // last_GC_time[i] = 0;
+    }
+    //    cur_items = 0;
+  }
+  ~MTHashTable()
+  {
+    for (int i = 0; i < MT_HASHTABLE_PARTITIONS; i++) {
+      locks[i] = NULL;
+      delete hashTables[i];
+    }
+  }
+
+  ProxyMutex *
+  lock_for_key(key_t key)
+  {
+    return locks[part_num(key)].get();
+  }
+
+  int
+  getSize()
+  {
+    return MT_HASHTABLE_PARTITIONS;
+  }
+  int
+  part_num(key_t key)
+  {
+    return (int)(key & MT_HASHTABLE_PARTITION_MASK);
+  }
+  data_t
+  insert_entry(key_t key, data_t data)
+  {
+    // ink_atomic_increment(&cur_items, 1);
+    return hashTables[part_num(key)]->insert_entry(key, data);
+  }
+  data_t
+  remove_entry(key_t key)
+  {
+    // ink_atomic_increment(&cur_items, -1);
+    return hashTables[part_num(key)]->remove_entry(key);
+  }
+  data_t
+  lookup_entry(key_t key)
+  {
+    return hashTables[part_num(key)]->lookup_entry(key);
+  }
+
+  data_t
+  first_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
+  {
+    data_t ret = (data_t)0;
+    for (int i = 0; i < hashTables[part_id]->getBucketNum(); i++) {
+      ret = hashTables[part_id]->first_entry(i, s);
+      if (ret != (data_t)0) {
+        return ret;
+      }
+    }
+    return (data_t)0;
+  }
+
+  data_t
+  cur_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
+  {
+    data_t data = IMTHashTable<key_t, data_t>::cur_entry(s);
+    if (!data) {
+      data = next_entry(part_id, s);
+    }
+    return data;
+  };
+  data_t
+  next_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
+  {
+    data_t ret = IMTHashTable<key_t, data_t>::next_entry(s);
+    if (ret != (data_t)0) {
+      return ret;
+    }
+    for (int i = s->cur_buck + 1; i < hashTables[part_id]->getBucketNum(); i++) {
+      ret = hashTables[part_id]->first_entry(i, s);
+      if (ret != (data_t)0) {
+        return ret;
+      }
+    }
+    return (data_t)0;
+  }
+  data_t
+  remove_entry(int part_id, HashTableIteratorState<key_t, data_t> *s)
+  {
+    // ink_atomic_increment(&cur_items, -1);
+    return hashTables[part_id]->remove_entry(s);
+  }
+
+private:
+  IMTHashTable<key_t, data_t> *hashTables[MT_HASHTABLE_PARTITIONS];
+  Ptr<ProxyMutex> locks[MT_HASHTABLE_PARTITIONS];
+  // MT_ListEntry chain_heads[MT_HASHTABLE_PARTITIONS];
+  // int last_GC_time[MT_HASHTABLE_PARTITIONS];
+  // int32_t cur_items;
+};
diff --git a/tests/gold_tests/body_factory/data/www.customplugin204.test_get.txt b/tests/gold_tests/body_factory/data/www.customplugin204.test_get.txt
index be603f9..4cf018a 100644
--- a/tests/gold_tests/body_factory/data/www.customplugin204.test_get.txt
+++ b/tests/gold_tests/body_factory/data/www.customplugin204.test_get.txt
@@ -1,2 +1,2 @@
-GET HTTP://www.customplugin204.test/ HTTP/1.1
-
+GET HTTP://www.customplugin204.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/body_factory/data/www.customtemplate204.test_get.txt b/tests/gold_tests/body_factory/data/www.customtemplate204.test_get.txt
index 395d798..f16fbc7 100644
--- a/tests/gold_tests/body_factory/data/www.customtemplate204.test_get.txt
+++ b/tests/gold_tests/body_factory/data/www.customtemplate204.test_get.txt
@@ -1,2 +1,2 @@
-GET HTTP://www.customtemplate204.test/ HTTP/1.1
-
+GET HTTP://www.customtemplate204.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/body_factory/data/www.default204.test_get.txt b/tests/gold_tests/body_factory/data/www.default204.test_get.txt
index e77408a..1a421dd 100644
--- a/tests/gold_tests/body_factory/data/www.default204.test_get.txt
+++ b/tests/gold_tests/body_factory/data/www.default204.test_get.txt
@@ -1,2 +1,2 @@
-GET HTTP://www.default204.test/ HTTP/1.1
-
+GET HTTP://www.default204.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/body_factory/data/www.default304.test_get.txt b/tests/gold_tests/body_factory/data/www.default304.test_get.txt
index c9064fa..d251435 100644
--- a/tests/gold_tests/body_factory/data/www.default304.test_get.txt
+++ b/tests/gold_tests/body_factory/data/www.default304.test_get.txt
@@ -1,2 +1,2 @@
-GET HTTP://www.default304.test/ HTTP/1.1
-
+GET HTTP://www.default304.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/body_factory/data/www.example.test_get_200.txt b/tests/gold_tests/body_factory/data/www.example.test_get_200.txt
index c53681f..5994603 100644
--- a/tests/gold_tests/body_factory/data/www.example.test_get_200.txt
+++ b/tests/gold_tests/body_factory/data/www.example.test_get_200.txt
@@ -1,3 +1,3 @@
-GET /get200 HTTP/1.1
-Host: www.example.test
-
+GET /get200 HTTP/1.1
+Host: www.example.test
+
diff --git a/tests/gold_tests/body_factory/data/www.example.test_get_304.txt b/tests/gold_tests/body_factory/data/www.example.test_get_304.txt
index 8d0aecf..03a8d59 100644
--- a/tests/gold_tests/body_factory/data/www.example.test_get_304.txt
+++ b/tests/gold_tests/body_factory/data/www.example.test_get_304.txt
@@ -1,4 +1,4 @@
-GET /get304 HTTP/1.1
-Host: www.example.test
-If-Modified-Since: Thu, 1 Jan 1970 00:00:00 GMT
-
+GET /get304 HTTP/1.1
+Host: www.example.test
+If-Modified-Since: Thu, 1 Jan 1970 00:00:00 GMT
+
diff --git a/tests/gold_tests/body_factory/data/www.example.test_head.txt b/tests/gold_tests/body_factory/data/www.example.test_head.txt
index c5a5c97..514c107 100644
--- a/tests/gold_tests/body_factory/data/www.example.test_head.txt
+++ b/tests/gold_tests/body_factory/data/www.example.test_head.txt
@@ -1,3 +1,3 @@
-HEAD http://www.example.test/ HTTP/1.1
-Host: www.example.test
-
+HEAD http://www.example.test/ HTTP/1.1
+Host: www.example.test
+
diff --git a/tests/gold_tests/body_factory/data/www.example.test_head_200.txt b/tests/gold_tests/body_factory/data/www.example.test_head_200.txt
index 6d214e1..fc0f1d5 100644
--- a/tests/gold_tests/body_factory/data/www.example.test_head_200.txt
+++ b/tests/gold_tests/body_factory/data/www.example.test_head_200.txt
@@ -1,3 +1,3 @@
-HEAD /head200 HTTP/1.1
-Host: www.example.test
-
+HEAD /head200 HTTP/1.1
+Host: www.example.test
+
diff --git a/tests/gold_tests/headers/data/www.passthrough.test_get.txt b/tests/gold_tests/headers/data/www.passthrough.test_get.txt
index 0cba742..ffe69c2 100644
--- a/tests/gold_tests/headers/data/www.passthrough.test_get.txt
+++ b/tests/gold_tests/headers/data/www.passthrough.test_get.txt
@@ -1,2 +1,2 @@
-GET http://www.passthrough.test/ HTTP/1.1
-
+GET http://www.passthrough.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/headers/data/www.redirect0.test_get.txt b/tests/gold_tests/headers/data/www.redirect0.test_get.txt
index 40fce98..3d3d219 100644
--- a/tests/gold_tests/headers/data/www.redirect0.test_get.txt
+++ b/tests/gold_tests/headers/data/www.redirect0.test_get.txt
@@ -1,2 +1,2 @@
-GET http://www.redirect0.test/ HTTP/1.1
-
+GET http://www.redirect0.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/headers/data/www.redirect301.test_get.txt b/tests/gold_tests/headers/data/www.redirect301.test_get.txt
index 4835267..e51c353 100644
--- a/tests/gold_tests/headers/data/www.redirect301.test_get.txt
+++ b/tests/gold_tests/headers/data/www.redirect301.test_get.txt
@@ -1,2 +1,2 @@
-GET http://www.redirect301.test/ HTTP/1.1
-
+GET http://www.redirect301.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/headers/data/www.redirect302.test_get.txt b/tests/gold_tests/headers/data/www.redirect302.test_get.txt
index 6aae266..35f7750 100644
--- a/tests/gold_tests/headers/data/www.redirect302.test_get.txt
+++ b/tests/gold_tests/headers/data/www.redirect302.test_get.txt
@@ -1,2 +1,2 @@
-GET http://www.redirect302.test/ HTTP/1.1
-
+GET http://www.redirect302.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/headers/data/www.redirect307.test_get.txt b/tests/gold_tests/headers/data/www.redirect307.test_get.txt
index b37c8ae..49bb1bc 100644
--- a/tests/gold_tests/headers/data/www.redirect307.test_get.txt
+++ b/tests/gold_tests/headers/data/www.redirect307.test_get.txt
@@ -1,2 +1,2 @@
-GET http://www.redirect307.test/ HTTP/1.1
-
+GET http://www.redirect307.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/headers/data/www.redirect308.test_get.txt b/tests/gold_tests/headers/data/www.redirect308.test_get.txt
index 05bcbf8..097e95e 100644
--- a/tests/gold_tests/headers/data/www.redirect308.test_get.txt
+++ b/tests/gold_tests/headers/data/www.redirect308.test_get.txt
@@ -1,2 +1,2 @@
-GET http://www.redirect308.test/ HTTP/1.1
-
+GET http://www.redirect308.test/ HTTP/1.1
+
diff --git a/tests/gold_tests/headers/general-connection-failure-502.gold b/tests/gold_tests/headers/general-connection-failure-502.gold
index 4749e20..a5e2732 100644
--- a/tests/gold_tests/headers/general-connection-failure-502.gold
+++ b/tests/gold_tests/headers/general-connection-failure-502.gold
@@ -1,10 +1,10 @@
-HTTP/1.1 502 connect failed
-Connection: keep-alive
-Cache-Control: no-store
-Content-Type: text/html
-Content-Language: en
-Content-Length: 247
-
+HTTP/1.1 502 connect failed
+Connection: keep-alive
+Cache-Control: no-store
+Content-Type: text/html
+Content-Language: en
+Content-Length: 247
+
 <HTML>
 <HEAD>
 <TITLE>Could Not Connect</TITLE>
diff --git a/tests/gold_tests/pluginTest/url_sig/url_sig.gold b/tests/gold_tests/pluginTest/url_sig/url_sig.gold
index 256898b..12043d8 100644
--- a/tests/gold_tests/pluginTest/url_sig/url_sig.gold
+++ b/tests/gold_tests/pluginTest/url_sig/url_sig.gold
@@ -1,15 +1,15 @@
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 403 Forbidden
-< HTTP/1.1 200 OK
-< HTTP/1.1 200 OK
-< HTTP/1.1 200 OK
-< HTTP/1.1 200 OK
-< HTTP/1.1 200 OK
-< HTTP/1.1 200 OK
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 403 Forbidden
+< HTTP/1.1 200 OK
+< HTTP/1.1 200 OK
+< HTTP/1.1 200 OK
+< HTTP/1.1 200 OK
+< HTTP/1.1 200 OK
+< HTTP/1.1 200 OK
diff --git a/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold b/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
index cb8fd49..057b5ce 100644
--- a/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
+++ b/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
@@ -1,13 +1,13 @@
-HTTP/1.1 502 Cannot find server.
+HTTP/1.1 502 Cannot find server.
 Date:``
-Connection: keep-alive
+Connection: keep-alive
 Server:``
-Cache-Control: no-store
-Content-Type: text/html
-Content-Language: en
-X-Remap: from=Not-Found, to=Not-Found
-Content-Length: 391
-
+Cache-Control: no-store
+Content-Type: text/html
+Content-Language: en
+X-Remap: from=Not-Found, to=Not-Found
+Content-Length: 391
+
 <HTML>
 <HEAD>
 <TITLE>Unknown Host</TITLE>
@@ -26,36 +26,36 @@ name and try again.
 <HR>
 </BODY>
 ======
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK
 Date:``
 Age:``
-Transfer-Encoding: chunked
-Connection: keep-alive
+Transfer-Encoding: chunked
+Connection: keep-alive
 Server:``
-X-Remap: from=http://one/, to=http://127.0.0.1:SERVER_PORT/
-
-0
-
+X-Remap: from=http://one/, to=http://127.0.0.1:SERVER_PORT/
+
+0
+
 ======
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK
 Date:``
 Age:``
-Transfer-Encoding: chunked
-Connection: keep-alive
+Transfer-Encoding: chunked
+Connection: keep-alive
 Server:``
-X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
-
-0
-
+X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
+
+0
+
 ======
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK
 Date:``
 Age:``
-Transfer-Encoding: chunked
-Connection: keep-alive
+Transfer-Encoding: chunked
+Connection: keep-alive
 Server:``
-X-Remap: from=http://three[0-9]+/, to=http://127.0.0.1:SERVER_PORT/
-
-0
-
+X-Remap: from=http://three[0-9]+/, to=http://127.0.0.1:SERVER_PORT/
+
+0
+
 ======
diff --git a/tests/gold_tests/redirect/gold/redirect.gold b/tests/gold_tests/redirect/gold/redirect.gold
index 9500bf9..3082e74 100644
--- a/tests/gold_tests/redirect/gold/redirect.gold
+++ b/tests/gold_tests/redirect/gold/redirect.gold
@@ -1,5 +1,5 @@
-HTTP/1.1 204 No Content
+HTTP/1.1 204 No Content
 ``
-Age: ``
-Connection: keep-alive
+Age: ``
+Connection: keep-alive