wwbmmm commented on code in PR #2768:
URL: https://github.com/apache/brpc/pull/2768#discussion_r1769514822


##########
src/bthread/key.cpp:
##########
@@ -205,53 +214,130 @@ class BAIDU_CACHELINE_ALIGNMENT KeyTable {
     SubKeyTable* _subs[KEY_1STLEVEL_SIZE];
 };
 
-struct KeyTableList {
-    KeyTableList() {
-        keytable = NULL;
+class BAIDU_CACHELINE_ALIGNMENT KeyTableList {
+ public:
+  KeyTableList() : _head(NULL), _tail(NULL), _length(0) {}
+
+  ~KeyTableList() {
+    bthread::TaskGroup* g = bthread::tls_task_group;
+    bthread::KeyTable* old_kt = bthread::tls_bls.keytable;
+    KeyTable* keytable = _head;
+    while (keytable) {
+      bthread::KeyTable* kt = keytable;
+      keytable = kt->next;
+      bthread::tls_bls.keytable = kt;
+      if (g) {
+        g->current_task()->local_storage.keytable = kt;
+      }
+      delete kt;
+      if (old_kt == kt) {
+        old_kt = NULL;
+      }
+      g = bthread::tls_task_group;
     }
-    ~KeyTableList() {
-        bthread::TaskGroup* g = bthread::tls_task_group;
-        bthread::KeyTable* old_kt = bthread::tls_bls.keytable;
-        while (keytable) {
-            bthread::KeyTable* kt = keytable;
-            keytable = kt->next;
-            bthread::tls_bls.keytable = kt;
-            if (g) {
-                g->current_task()->local_storage.keytable = kt;
-            }
-            delete kt;
-            if (old_kt == kt) {
-                old_kt = NULL;
-            }
-            g = bthread::tls_task_group;
-        }
-        bthread::tls_bls.keytable = old_kt;
-        if(g) {
-            g->current_task()->local_storage.keytable = old_kt;
-        }
+    bthread::tls_bls.keytable = old_kt;
+    if (g) {
+      g->current_task()->local_storage.keytable = old_kt;
+    }
+  }
+
+  void append(KeyTable* keytable) {
+    if (keytable == NULL) {
+      return;
     }
-    KeyTable* keytable;
+    if (_head == NULL) {
+      _head = _tail = keytable;
+    } else {
+      _tail->next = keytable;
+      _tail = keytable;
+    }
+    keytable->next = NULL;
+    _length++;
+  }
+
+  KeyTable* remove_front() {
+    if (_head == NULL) {
+      return NULL;
+    }
+    KeyTable* temp = _head;
+    _head = _head->next;
+    _length--;
+    if (_head == NULL) {
+      _tail = NULL;
+    }
+    return temp;
+  }
+
+  void move_first_n_to_target(KeyTable* target, uint32_t size) {
+    if (size < _length || _head == NULL) {

Review Comment:
   是_length < size吧?



##########
src/bthread/key.cpp:
##########
@@ -205,53 +214,130 @@ class BAIDU_CACHELINE_ALIGNMENT KeyTable {
     SubKeyTable* _subs[KEY_1STLEVEL_SIZE];
 };
 
-struct KeyTableList {
-    KeyTableList() {
-        keytable = NULL;
+class BAIDU_CACHELINE_ALIGNMENT KeyTableList {
+ public:
+  KeyTableList() : _head(NULL), _tail(NULL), _length(0) {}
+
+  ~KeyTableList() {
+    bthread::TaskGroup* g = bthread::tls_task_group;
+    bthread::KeyTable* old_kt = bthread::tls_bls.keytable;
+    KeyTable* keytable = _head;
+    while (keytable) {
+      bthread::KeyTable* kt = keytable;
+      keytable = kt->next;
+      bthread::tls_bls.keytable = kt;
+      if (g) {
+        g->current_task()->local_storage.keytable = kt;
+      }
+      delete kt;
+      if (old_kt == kt) {
+        old_kt = NULL;
+      }
+      g = bthread::tls_task_group;
     }
-    ~KeyTableList() {
-        bthread::TaskGroup* g = bthread::tls_task_group;
-        bthread::KeyTable* old_kt = bthread::tls_bls.keytable;
-        while (keytable) {
-            bthread::KeyTable* kt = keytable;
-            keytable = kt->next;
-            bthread::tls_bls.keytable = kt;
-            if (g) {
-                g->current_task()->local_storage.keytable = kt;
-            }
-            delete kt;
-            if (old_kt == kt) {
-                old_kt = NULL;
-            }
-            g = bthread::tls_task_group;
-        }
-        bthread::tls_bls.keytable = old_kt;
-        if(g) {
-            g->current_task()->local_storage.keytable = old_kt;
-        }
+    bthread::tls_bls.keytable = old_kt;
+    if (g) {
+      g->current_task()->local_storage.keytable = old_kt;
+    }
+  }
+
+  void append(KeyTable* keytable) {
+    if (keytable == NULL) {
+      return;
     }
-    KeyTable* keytable;
+    if (_head == NULL) {
+      _head = _tail = keytable;
+    } else {
+      _tail->next = keytable;
+      _tail = keytable;
+    }
+    keytable->next = NULL;
+    _length++;
+  }
+
+  KeyTable* remove_front() {
+    if (_head == NULL) {
+      return NULL;
+    }
+    KeyTable* temp = _head;
+    _head = _head->next;
+    _length--;
+    if (_head == NULL) {
+      _tail = NULL;
+    }
+    return temp;
+  }
+
+  void move_first_n_to_target(KeyTable* target, uint32_t size) {
+    if (size < _length || _head == NULL) {
+      return;
+    }
+
+    KeyTable* current = _head;
+    KeyTable* prev = NULL;
+    uint32_t count = 0;
+    while (current != NULL && count < size) {
+      prev = current;
+      current = current->next;
+      count++;
+    }
+    if (prev != NULL) {
+      prev->next = NULL;
+      if (target == NULL) {
+        target = _head;

Review Comment:
   target是值传进来的,修改target有什么用?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org
For additional commands, e-mail: dev-h...@brpc.apache.org

Reply via email to