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

wwbmmm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new ab5a496f modify bthread attribute with tag (#2476)
ab5a496f is described below

commit ab5a496f8320c1cc6258e8dc8cbf2f62d4bbed3f
Author: Yang,Liming <liming.y...@139.com>
AuthorDate: Tue Jan 9 15:30:17 2024 +0800

    modify bthread attribute with tag (#2476)
    
    Co-authored-by: Yang Liming <yanglimin...@meituan.com>
---
 src/brpc/acceptor.cpp           |  5 +++--
 src/brpc/details/http_message.h |  2 +-
 src/brpc/server.cpp             |  5 ++++-
 src/bthread/bthread.cpp         | 20 +++++++++++++-------
 src/bthread/task_group.cpp      |  2 +-
 src/bthread/types.h             | 13 +++++++------
 6 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/src/brpc/acceptor.cpp b/src/brpc/acceptor.cpp
index 68d77082..d2657258 100644
--- a/src/brpc/acceptor.cpp
+++ b/src/brpc/acceptor.cpp
@@ -76,8 +76,9 @@ int Acceptor::StartAccept(int listened_fd, int 
idle_timeout_sec,
         return -1;
     }
     if (idle_timeout_sec > 0) {
-        if (bthread_start_background(&_close_idle_tid, NULL,
-                                     CloseIdleConnections, this) != 0) {
+        bthread_attr_t tmp = BTHREAD_ATTR_NORMAL;
+        tmp.tag = _bthread_tag;
+        if (bthread_start_background(&_close_idle_tid, &tmp, 
CloseIdleConnections, this) != 0) {
             LOG(FATAL) << "Fail to start bthread";
             return -1;
         }
diff --git a/src/brpc/details/http_message.h b/src/brpc/details/http_message.h
index 97b37132..1b2ae26c 100644
--- a/src/brpc/details/http_message.h
+++ b/src/brpc/details/http_message.h
@@ -19,7 +19,7 @@
 #ifndef BRPC_HTTP_MESSAGE_H
 #define BRPC_HTTP_MESSAGE_H
 
-#include <memory>
+#include <memory>                      // std::unique_ptr
 #include <string>                      // std::string
 #include "butil/macros.h"
 #include "butil/iobuf.h"               // butil::IOBuf
diff --git a/src/brpc/server.cpp b/src/brpc/server.cpp
index ff717f80..ead24568 100644
--- a/src/brpc/server.cpp
+++ b/src/brpc/server.cpp
@@ -906,6 +906,7 @@ int Server::StartInternal(const butil::EndPoint& endpoint,
             init_args[i].done = false;
             init_args[i].stop = false;
             bthread_attr_t tmp = BTHREAD_ATTR_NORMAL;
+            tmp.tag = _options.bthread_tag;
             tmp.keytable_pool = _keytable_pool;
             if (bthread_start_background(
                     &init_args[i].th, &tmp, BthreadInitEntry, &init_args[i]) 
!= 0) {
@@ -1144,7 +1145,9 @@ int Server::StartInternal(const butil::EndPoint& endpoint,
 
     // Launch _derivative_thread.
     CHECK_EQ(INVALID_BTHREAD, _derivative_thread);
-    if (bthread_start_background(&_derivative_thread, NULL,
+    bthread_attr_t tmp = BTHREAD_ATTR_NORMAL;
+    tmp.tag = _options.bthread_tag;
+    if (bthread_start_background(&_derivative_thread, &tmp,
                                  UpdateDerivedVars, this) != 0) {
         LOG(ERROR) << "Fail to create _derivative_thread";
         return -1;
diff --git a/src/bthread/bthread.cpp b/src/bthread/bthread.cpp
index 201a6745..316c53f7 100644
--- a/src/bthread/bthread.cpp
+++ b/src/bthread/bthread.cpp
@@ -174,26 +174,32 @@ start_from_non_worker(bthread_t* __restrict tid,
     if (NULL == c) {
         return ENOMEM;
     }
-    TaskGroup* g = NULL;
+    auto tag = BTHREAD_TAG_DEFAULT;
+    if (attr != NULL && attr->tag != BTHREAD_TAG_INVALID) {
+        tag = attr->tag;
+    }
     if (attr != NULL && (attr->flags & BTHREAD_NOSIGNAL)) {
         // Remember the TaskGroup to insert NOSIGNAL tasks for 2 reasons:
         // 1. NOSIGNAL is often for creating many bthreads in batch,
         //    inserting into the same TaskGroup maximizes the batch.
         // 2. bthread_flush() needs to know which TaskGroup to flush.
-        g = tls_task_group_nosignal;
+        auto g = tls_task_group_nosignal;
         if (NULL == g) {
-            g = c->choose_one_group(attr->tag);
+            g = c->choose_one_group(tag);
             tls_task_group_nosignal = g;
         }
         return g->start_background<true>(tid, attr, fn, arg);
     }
-    g = c->choose_one_group(attr ? attr->tag : BTHREAD_TAG_DEFAULT);
-    return g->start_background<true>(tid, attr, fn, arg);
+    return c->choose_one_group(tag)->start_background<true>(tid, attr, fn, 
arg);
 }
 
-// if tag is default or equal to thread local use thread local task group
+// Meet one of the three conditions, can run in thread local
+// attr is nullptr
+// tag equal to thread local
+// tag equal to BTHREAD_TAG_INVALID
 BUTIL_FORCE_INLINE bool can_run_thread_local(const bthread_attr_t* __restrict 
attr) {
-    return attr == nullptr || attr->tag == bthread::tls_task_group->tag();
+    return attr == nullptr || attr->tag == bthread::tls_task_group->tag() ||
+           attr->tag == BTHREAD_TAG_INVALID;
 }
 
 struct TidTraits {
diff --git a/src/bthread/task_group.cpp b/src/bthread/task_group.cpp
index 1c2fd522..381243f9 100644
--- a/src/bthread/task_group.cpp
+++ b/src/bthread/task_group.cpp
@@ -40,7 +40,7 @@
 namespace bthread {
 
 static const bthread_attr_t BTHREAD_ATTR_TASKGROUP = {
-    BTHREAD_STACKTYPE_UNKNOWN, 0, NULL, BTHREAD_TAG_DEFAULT };
+    BTHREAD_STACKTYPE_UNKNOWN, 0, NULL, BTHREAD_TAG_INVALID };
 
 static bool pass_bool(const char*, bool) { return true; }
 
diff --git a/src/bthread/types.h b/src/bthread/types.h
index e3fdaa8f..cb39ae3c 100644
--- a/src/bthread/types.h
+++ b/src/bthread/types.h
@@ -34,6 +34,7 @@ static const bthread_t INVALID_BTHREAD = 0;
 
 // bthread tag default is 0
 typedef int bthread_tag_t;
+static const bthread_tag_t BTHREAD_TAG_INVALID = -1;
 static const bthread_tag_t BTHREAD_TAG_DEFAULT = 0;
 
 struct sockaddr;
@@ -104,7 +105,7 @@ typedef struct bthread_attr_t {
         stack_type = (stacktype_and_flags & 7);
         flags = (stacktype_and_flags & ~(unsigned)7u);
         keytable_pool = NULL;
-        tag = BTHREAD_TAG_DEFAULT;
+        tag = BTHREAD_TAG_INVALID;
     }
     bthread_attr_t operator|(unsigned other_flags) const {
         CHECK(!(other_flags & 7)) << "flags=" << other_flags;
@@ -122,22 +123,22 @@ typedef struct bthread_attr_t {
 // obvious drawback is that you need more worker pthreads when you have a lot
 // of such bthreads.
 static const bthread_attr_t BTHREAD_ATTR_PTHREAD =
-{ BTHREAD_STACKTYPE_PTHREAD, 0, NULL, BTHREAD_TAG_DEFAULT };
+{ BTHREAD_STACKTYPE_PTHREAD, 0, NULL, BTHREAD_TAG_INVALID };
 
 // bthreads created with following attributes will have different size of
 // stacks. Default is BTHREAD_ATTR_NORMAL.
 static const bthread_attr_t BTHREAD_ATTR_SMALL = {BTHREAD_STACKTYPE_SMALL, 0, 
NULL,
-                                                  BTHREAD_TAG_DEFAULT};
+                                                  BTHREAD_TAG_INVALID};
 static const bthread_attr_t BTHREAD_ATTR_NORMAL = {BTHREAD_STACKTYPE_NORMAL, 
0, NULL,
-                                                   BTHREAD_TAG_DEFAULT};
+                                                   BTHREAD_TAG_INVALID};
 static const bthread_attr_t BTHREAD_ATTR_LARGE = {BTHREAD_STACKTYPE_LARGE, 0, 
NULL,
-                                                  BTHREAD_TAG_DEFAULT};
+                                                  BTHREAD_TAG_INVALID};
 
 // bthreads created with this attribute will print log when it's started,
 // context-switched, finished.
 static const bthread_attr_t BTHREAD_ATTR_DEBUG = {
     BTHREAD_STACKTYPE_NORMAL, BTHREAD_LOG_START_AND_FINISH | 
BTHREAD_LOG_CONTEXT_SWITCH, NULL,
-    BTHREAD_TAG_DEFAULT};
+    BTHREAD_TAG_INVALID};
 
 static const size_t BTHREAD_EPOLL_THREAD_NUM = 1;
 static const bthread_t BTHREAD_ATOMIC_INIT = 0;


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

Reply via email to