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 7a3e034e Fix brpc_proto_library failure when brpc is used as an 
external Bazel dependency (#3427)
7a3e034e is described below

commit 7a3e034e20dcfba04f30ffc95a03d934ff59ac4e
Author: Bright Chen <[email protected]>
AuthorDate: Sun Aug 9 14:47:53 2026 +0800

    Fix brpc_proto_library failure when brpc is used as an external Bazel 
dependency (#3427)
---
 .bazelignore                                       |  2 +
 .github/workflows/ci-linux.yml                     | 47 ++++++++--
 .licenserc.yaml                                    |  1 +
 MODULE.bazel                                       | 20 ++++-
 bazel/tools/brpc_proto_library.bzl                 | 20 ++---
 bazel/tools/proto_gen.bzl                          | 69 +++++++++------
 example/build_with_bazel/BUILD.bazel               |  6 --
 example/build_with_bazel_module/.bazelrc           | 61 +++++++++++++
 example/build_with_bazel_module/.bazelversion      |  1 +
 .../BUILD.bazel                                    | 19 +++--
 example/build_with_bazel_module/MODULE.bazel       | 30 +++++++
 example/build_with_bazel_module/echo.proto         | 33 ++++++++
 example/build_with_bazel_module/server.cpp         | 99 ++++++++++++++++++++++
 src/butil/object_pool_inl.h                        |  5 +-
 14 files changed, 348 insertions(+), 65 deletions(-)

diff --git a/.bazelignore b/.bazelignore
index 1559ee6e..96ab212d 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -1,4 +1,6 @@
 ./example/build_with_bazel
+./example/build_with_bazel_module
+./example/build_with_old_bazel
 
 # `registry/` is brpc's self-maintained Bzlmod registry. Its overlay
 # BUILD.bazel files reference sources from the libunwind tarball that is
diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml
index e15d81db..b3462d22 100644
--- a/.github/workflows/ci-linux.yml
+++ b/.github/workflows/ci-linux.yml
@@ -129,7 +129,23 @@ jobs:
     runs-on: ubuntu-22.04
     steps:
     - uses: actions/checkout@v2
-    - run: |
+    - run: sudo apt-get update && sudo apt-get install -y  libibverbs-dev
+    - name: root
+      run: |
+        bazel build --define with_mesalink=false \
+                    --define with_glog=true \
+                    --define with_thrift=true \
+                    --define BRPC_WITH_BORINGSSL=true \
+                    --define with_debug_bthread_sche_safety=true \
+                    --define with_debug_lock=true \
+                    --define with_asan=true \
+                    --define with_bthread_tracer=true \
+                    --define BRPC_WITH_NO_PTHREAD_MUTEX_HOOK=true \
+                    --define with_babylon_counter=true \
+                    -- //:brpc //example/...
+    - name: external
+      run: |
+        cd example/build_with_bazel_module
         bazel build --define with_mesalink=false \
                     --define with_glog=true \
                     --define with_thrift=true \
@@ -140,7 +156,7 @@ jobs:
                     --define with_bthread_tracer=true \
                     --define BRPC_WITH_NO_PTHREAD_MUTEX_HOOK=true \
                     --define with_babylon_counter=true \
-                    -- //:brpc
+                    -- //...
 
   clang-compile-with-make-protobuf:
     runs-on: ubuntu-22.04
@@ -188,7 +204,24 @@ jobs:
     runs-on: ubuntu-22.04
     steps:
     - uses: actions/checkout@v2
-    - run: |
+    - run: sudo apt-get update && sudo apt-get install -y  libibverbs-dev
+    - name: root
+      run: |
+        bazel build --action_env=CC=clang \
+                    --define with_mesalink=false \
+                    --define with_glog=true \
+                    --define with_thrift=true \
+                    --define BRPC_WITH_BORINGSSL=true \
+                    --define with_debug_bthread_sche_safety=true \
+                    --define with_debug_lock=true \
+                    --define with_asan=true \
+                    --define with_bthread_tracer=true \
+                    --define BRPC_WITH_NO_PTHREAD_MUTEX_HOOK=true \
+                    --define with_babylon_counter=true \
+                    -- //:brpc //example/...
+    - name: external
+      run: |
+        cd example/build_with_bazel_module
         bazel build --action_env=CC=clang \
                     --define with_mesalink=false \
                     --define with_glog=true \
@@ -200,7 +233,7 @@ jobs:
                     --define with_bthread_tracer=true \
                     --define BRPC_WITH_NO_PTHREAD_MUTEX_HOOK=true \
                     --define with_babylon_counter=true \
-                    -- //:brpc
+                    -- //...
 
   clang-unittest:
     runs-on: ubuntu-22.04
@@ -246,9 +279,9 @@ jobs:
     runs-on: ubuntu-22.04
     env:
       TEST_PROTOBUF_VERSION: "34.1"
-      # protobuf >= 34.x uses new ProtoInfo fields (option_deps,
-      # extension_declarations) introduced in Bazel 8.x. The repo's
-      # .bazelversion (7.2.1) is too old. bazelisk honors USE_BAZEL_VERSION.
+      # protobuf >= 34.x uses new ProtoInfo fields (option_deps, 
extension_declarations)
+      # introduced in Bazel 8.x. The repo's .bazelversion (7.2.1) is too old. 
bazelisk
+      # honors USE_BAZEL_VERSION.
       USE_BAZEL_VERSION: "8.3.1"
     steps:
     - uses: actions/checkout@v2
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 7c8bbd54..f4716989 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -34,6 +34,7 @@ header:
     - 'example/*/*.json'
     - 'example/*/*.pem'
     - 'example/*/*.port'
+    - 'example/build_with_bazel_module/.bazelversion'
     - 'src/bthread/offset_inl.list'
     - 'test/*.crt'
     - 'test/*.key'
diff --git a/MODULE.bazel b/MODULE.bazel
index 6f7b01a8..1e71bfcb 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -1,3 +1,20 @@
+# 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.
+
 module(
   name = 'brpc',
   version = '1.17.0',
@@ -10,11 +27,10 @@ bazel_dep(name = 'bazel_skylib', version = '1.0.3')
 bazel_dep(name = 'boringssl', version = '0.0.0-20211025-d4f1ab9')
 bazel_dep(name = 'protobuf', version = '27.3', repo_name = 
'com_google_protobuf')
 bazel_dep(name = 'gflags', version = '2.2.2', repo_name = 
'com_github_gflags_gflags')
-bazel_dep(name = 'glog', version = '0.5.0', repo_name = 
'com_github_google_glog')
+bazel_dep(name = 'glog', version = '0.7.1', repo_name = 
'com_github_google_glog')
 bazel_dep(name = 'platforms', version = '0.0.4')
 bazel_dep(name = "apple_support", version = "1.22.1")
 bazel_dep(name = 'rules_cc', version = '0.0.1')
-bazel_dep(name = 'rules_proto', version = '4.0.0')
 bazel_dep(name = 'zlib', version = '1.3.1.bcr.5', repo_name = 
'com_github_madler_zlib')
 bazel_dep(name = 'babylon', version = '1.4.4')
 # --registry=https://raw.githubusercontent.com/apache/brpc/master/registry
diff --git a/bazel/tools/brpc_proto_library.bzl 
b/bazel/tools/brpc_proto_library.bzl
index 22a3c00b..f95033be 100644
--- a/bazel/tools/brpc_proto_library.bzl
+++ b/bazel/tools/brpc_proto_library.bzl
@@ -70,17 +70,13 @@ def brpc_proto_library(
       include: protoc `-I` root AND the resulting cc_library `includes`
                root, relative to the current package.
                When omitted, "" or None, the include root is the
-               current package itself (suitable for .proto files
-               sitting directly under the package root, as in `test/`
-               and `example/...`). The root `BUILD.bazel` of brpc must
-               pass `"src"` so that code can reference the protos as
-               `import "brpc/foo.proto"`.
+               current package itself.
       proto_deps: list of native `proto_library` dependencies
                   (well-known protos or external .proto libraries).
                   Defaults to
                   `["@com_google_protobuf//:descriptor_proto"]`.
-                  Pass `[]` explicitly to disable the default; pass
-                  None (the default) to use it.
+                  Pass `[]` explicitly to disable the default.
+                  Pass None (the default) to use it.
       visibility: same semantics as cc_library.
       testonly: same semantics as cc_library.
     """
@@ -127,11 +123,11 @@ def brpc_proto_library(
         # cc_library `includes` is required, otherwise the .pb.cc
         # files inside this cc_library cannot find the .pb.h headers
         # they just generated (the headers live under
-        # bazel-bin/<package>/<include>/...). When include="" we pass
-        # "." to mean "the current package itself"; Bazel then exposes
-        # both `-I <package>` and `-I bazel-bin/<package>`
-        # automatically to dependents.
-        includes = [real_include if real_include else "."],
+        # bazel-bin/<package>/<include>/...). For a non-root package
+        # with include="", "." exposes the current package's source
+        # and bazel-bin directories. The root package needs no extra
+        # include because those roots are already on the search path.
+        includes = [real_include] if real_include else (["."] if 
native.package_name() else []),
         deps = deps + ["@com_google_protobuf//:protobuf"],
         visibility = visibility,
         testonly = testonly,
diff --git a/bazel/tools/proto_gen.bzl b/bazel/tools/proto_gen.bzl
index 554d24df..c2e9c3b5 100644
--- a/bazel/tools/proto_gen.bzl
+++ b/bazel/tools/proto_gen.bzl
@@ -60,31 +60,46 @@ def _resolve_include_dir(ctx):
       ctx.label.package = ""     + include = "src" -> "src"
       ctx.label.package = "test" + include = ""    -> "test"
       ctx.label.package = ""     + include = ""    -> "."
+
+    When the target is in an external repository, the returned path needs
+    to be prefixed with workspace_root.
     """
     pkg = ctx.label.package
     inc = ctx.attr.include.rstrip("/")
     if pkg and inc:
-        return pkg + "/" + inc
-    if pkg:
-        return pkg
-    if inc:
-        return inc
-    return "."
+        rel_path = pkg + "/" + inc
+    elif pkg:
+        rel_path = pkg
+    elif inc:
+        rel_path = inc
+    else:
+        rel_path = "."
+
+    workspace_root = ctx.label.workspace_root
+    if workspace_root:
+        if rel_path == ".":
+            return workspace_root
+        else:
+            return workspace_root + "/" + rel_path
+    return rel_path
 
 def _proto_gen_impl(ctx):
     srcs = ctx.files.srcs
     include_dir = _resolve_include_dir(ctx)
     bin_root = ctx.bin_dir.path
+    current_workspace_root = ctx.label.workspace_root
 
-    # `-I` flags for this target itself: the source-tree root plus
-    # the corresponding bin-dir root. The bin-dir entry is needed
-    # when a transitive dep generates .proto files into bazel-bin
-    # (e.g. via a custom code generator).
+    # Add both the source-tree include root and its bazel-bin counterpart.
+    # For external repositories, include_dir already starts with 
workspace_root,
+    # so appending it to bin_root addresses generated protos in that 
repository.
     own_imports = ["-I" + include_dir]
-    if include_dir == ".":
-        own_imports.append("-I" + bin_root)
-    else:
+    if current_workspace_root:
         own_imports.append("-I" + bin_root + "/" + include_dir)
+    else:
+        if include_dir == ".":
+            own_imports.append("-I" + bin_root)
+        else:
+            own_imports.append("-I" + bin_root + "/" + include_dir)
 
     # Collect transitive info from other `brpc_proto_gen` deps.
     dep_srcs_list = [d[BrpcProtoInfo].transitive_srcs for d in ctx.attr.deps]
@@ -120,12 +135,12 @@ def _proto_gen_impl(ctx):
         proto_dep_src_depsets.append(pi.transitive_sources)
         for path in pi.transitive_proto_path.to_list():
             proto_dep_imports.append("-I" + path)
-        wsroot = pd.label.workspace_root
-        if wsroot:
-            extra_pb_root_imports.append("-I" + wsroot)
-            extra_pb_root_imports.append("-I" + bin_root + "/" + wsroot)
-            extra_pb_root_imports.append("-I" + wsroot + "/src")
-            extra_pb_root_imports.append("-I" + bin_root + "/" + wsroot + 
"/src")
+        dep_workspace_root = pd.label.workspace_root
+        if dep_workspace_root:
+            extra_pb_root_imports.append("-I" + dep_workspace_root)
+            extra_pb_root_imports.append("-I" + bin_root + "/" + 
dep_workspace_root)
+            extra_pb_root_imports.append("-I" + dep_workspace_root + "/src")
+            extra_pb_root_imports.append("-I" + bin_root + "/" + 
dep_workspace_root + "/src")
     # Deduplicate the workspace-level `-I` entries so the same repo
     # is not listed multiple times when several proto_deps share it.
     proto_dep_imports.extend(depset(extra_pb_root_imports).to_list())
@@ -156,14 +171,16 @@ def _proto_gen_impl(ctx):
         outs.append(ctx.actions.declare_file(base + ".pb.h"))
         outs.append(ctx.actions.declare_file(base + ".pb.cc"))
 
-    # protoc's --cpp_out points at the include root under bin_root.
-    # After protoc organizes outputs by their import-relative path,
-    # the .pb.{h,cc} files land exactly where declare_file declared
-    # them above.
-    if include_dir == ".":
-        cpp_out_dir = bin_root
-    else:
+    # Point protoc at this target's include root under bazel-bin. For external
+    # repositories, include_dir includes workspace_root, which places generated
+    # files under the repository-specific portion of bazel-bin.
+    if current_workspace_root:
         cpp_out_dir = bin_root + "/" + include_dir
+    else:
+        if include_dir == ".":
+            cpp_out_dir = bin_root
+        else:
+            cpp_out_dir = bin_root + "/" + include_dir
 
     args = ctx.actions.args()
     args.add_all(all_imports.to_list())
diff --git a/example/build_with_bazel/BUILD.bazel 
b/example/build_with_bazel/BUILD.bazel
index 9ac3da0c..021127f2 100644
--- a/example/build_with_bazel/BUILD.bazel
+++ b/example/build_with_bazel/BUILD.bazel
@@ -12,9 +12,6 @@
 # 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.
-#
-# Thie empty BUILD.bazel file is required to make Bazel treat
-# this directory as a package.
 
 
 cc_binary(
@@ -22,8 +19,5 @@ cc_binary(
     srcs = ["test.cc"],
     deps = [
         "@apache_brpc//:brpc",
-        "@apache_brpc//:bthread",
-        "@apache_brpc//:bvar",
-        "@apache_brpc//:butil",
     ],
 )
diff --git a/example/build_with_bazel_module/.bazelrc 
b/example/build_with_bazel_module/.bazelrc
new file mode 100644
index 00000000..dd2ba48d
--- /dev/null
+++ b/example/build_with_bazel_module/.bazelrc
@@ -0,0 +1,61 @@
+# 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.
+
+# Bazel doesn't need more than 200MB of memory for local build based on memory 
profiling:
+# 
https://docs.bazel.build/versions/master/skylark/performance.html#memory-profiling
+# The default JVM max heapsize is 1/4 of physical memory up to 32GB which 
could be large
+# enough to consume all memory constrained by cgroup in large host.
+# Limiting JVM heapsize here to let it do GC more when approaching the limit to
+# leave room for compiler/linker.
+# The number 3G is chosen heuristically to both support large VM and small VM 
with RBE.
+# Startup options cannot be selected via config.
+startup --host_jvm_args=-Xmx3g
+startup --host_jvm_args="-DBAZEL_TRACK_SOURCE_DIRECTORIES=1"
+
+# Default build options. These are applied first and unconditionally.
+common --registry=https://bcr.bazel.build
+common --registry=https://baidu.github.io/babylon/registry
+common --registry=https://raw.githubusercontent.com/apache/brpc/master/registry
+
+build --verbose_failures
+# Keep SHT_SYMTAB in built binaries so google::Symbolize can resolve
+# in-binary functions (e.g. TestBody() in test binaries) by name
+# instead of falling back to "<unknown>". Bazel's default
+# `--strip=sometimes` strips debug/symbol sections in fastbuild mode,
+# which is what `bazel test` uses unless `-c dbg` is given.
+build --strip=never
+build --cxxopt="-std=c++17"
+build --copt="-fno-omit-frame-pointer"
+# Use gnu17 for asm keyword.
+build --conlyopt="-std=gnu17"
+
+# Enable position independent code (this is the default on macOS and Windows)
+# (Workaround for https://github.com/bazelbuild/rules_foreign_cc/issues/421)
+build --copt=-fPIC
+build --fission=dbg,opt
+build --features=per_object_debug_info
+
+# We already have absl in the build, define absl=1 to tell googletest to use 
absl for backtrace.
+build --define absl=1
+
+test --config=test
+test --test_output=streamed
+
+# Pass PATH, CC, CXX and LLVM_CONFIG variables from the environment.
+build --action_env=CC
+build --action_env=CXX
+build --action_env=LLVM_CONFIG
+build --action_env=PATH
+
diff --git a/example/build_with_bazel_module/.bazelversion 
b/example/build_with_bazel_module/.bazelversion
new file mode 100644
index 00000000..b26a34e4
--- /dev/null
+++ b/example/build_with_bazel_module/.bazelversion
@@ -0,0 +1 @@
+7.2.1
diff --git a/example/build_with_bazel/BUILD.bazel 
b/example/build_with_bazel_module/BUILD.bazel
similarity index 76%
copy from example/build_with_bazel/BUILD.bazel
copy to example/build_with_bazel_module/BUILD.bazel
index 9ac3da0c..8dbc3801 100644
--- a/example/build_with_bazel/BUILD.bazel
+++ b/example/build_with_bazel_module/BUILD.bazel
@@ -12,18 +12,21 @@
 # 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.
-#
-# Thie empty BUILD.bazel file is required to make Bazel treat
-# this directory as a package.
 
+load("@apache_brpc//bazel/tools:brpc_proto_library.bzl", "brpc_proto_library")
+
+brpc_proto_library(
+    name = "cc_echo_c++_proto",
+    srcs = ["echo.proto"],
+)
 
 cc_binary(
-    name = "test",
-    srcs = ["test.cc"],
+    name = "echo_c++_server",
+    srcs = [
+        "server.cpp",
+    ],
     deps = [
+        ":cc_echo_c++_proto",
         "@apache_brpc//:brpc",
-        "@apache_brpc//:bthread",
-        "@apache_brpc//:bvar",
-        "@apache_brpc//:butil",
     ],
 )
diff --git a/example/build_with_bazel_module/MODULE.bazel 
b/example/build_with_bazel_module/MODULE.bazel
new file mode 100644
index 00000000..e5d66a8e
--- /dev/null
+++ b/example/build_with_bazel_module/MODULE.bazel
@@ -0,0 +1,30 @@
+# 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.
+
+module(
+  name = 'brpc-example',
+  version = '1.17.0',
+  compatibility_level = 1,
+)
+
+bazel_dep(name = 'protobuf', version = '27.3', repo_name = 
'com_google_protobuf')
+bazel_dep(name = 'brpc', version = '1.17.0', repo_name = 'apache_brpc')
+
+local_path_override(
+    module_name = "brpc",
+    path = "../..",
+)
\ No newline at end of file
diff --git a/example/build_with_bazel_module/echo.proto 
b/example/build_with_bazel_module/echo.proto
new file mode 100644
index 00000000..e963faf5
--- /dev/null
+++ b/example/build_with_bazel_module/echo.proto
@@ -0,0 +1,33 @@
+// 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.
+
+syntax="proto2";
+option cc_generic_services = true;
+
+package example;
+
+message EchoRequest {
+      required string message = 1;
+};
+
+message EchoResponse {
+      required string message = 1;
+};
+
+service EchoService {
+      rpc Echo(EchoRequest) returns (EchoResponse);
+};
diff --git a/example/build_with_bazel_module/server.cpp 
b/example/build_with_bazel_module/server.cpp
new file mode 100644
index 00000000..54ca0960
--- /dev/null
+++ b/example/build_with_bazel_module/server.cpp
@@ -0,0 +1,99 @@
+// 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.
+
+// A server to receive EchoRequest and send back EchoResponse.
+
+#include <gflags/gflags.h>
+#include <butil/logging.h>
+#include <brpc/server.h>
+#include "echo.pb.h"
+
+DEFINE_bool(echo_attachment, true, "Echo attachment as well");
+DEFINE_int32(port, 8002, "TCP Port of this server");
+DEFINE_int32(idle_timeout_s, -1, "Connection will be closed if there is no "
+             "read/write operations during the last `idle_timeout_s'");
+DEFINE_int32(max_concurrency, 0, "Limit of request processing in parallel");
+DEFINE_int32(internal_port, -1, "Only allow builtin services at this port");
+
+namespace example {
+// Your implementation of EchoService
+class EchoServiceImpl : public EchoService {
+public:
+    EchoServiceImpl() {}
+    ~EchoServiceImpl() {}
+    void Echo(google::protobuf::RpcController* cntl_base,
+              const EchoRequest* request,
+              EchoResponse* response,
+              google::protobuf::Closure* done) {
+        brpc::ClosureGuard done_guard(done);
+        brpc::Controller* cntl =
+            static_cast<brpc::Controller*>(cntl_base);
+
+        // Echo request and its attachment
+        response->set_message(request->message());
+        if (FLAGS_echo_attachment) {
+            cntl->response_attachment().append(cntl->request_attachment());
+        }
+    }
+};
+}  // namespace example
+
+DEFINE_bool(h, false, "print help information");
+
+int main(int argc, char* argv[]) {
+    std::string help_str = "dummy help infomation";
+    GFLAGS_NAMESPACE::SetUsageMessage(help_str);
+
+    // Parse gflags. We recommend you to use gflags as well.
+    GFLAGS_NAMESPACE::ParseCommandLineFlags(&argc, &argv, true);
+
+    if (FLAGS_h) {
+        fprintf(stderr, "%s\n%s\n%s", help_str.c_str(), help_str.c_str(), 
help_str.c_str());
+        return 0;
+    }
+
+    // Generally you only need one Server.
+    brpc::Server server;
+
+    // Instance of your service.
+    example::EchoServiceImpl echo_service_impl;
+
+    // Add the service into server. Notice the second parameter, because the
+    // service is put on stack, we don't want server to delete it, otherwise
+    // use brpc::SERVER_OWNS_SERVICE.
+    if (server.AddService(&echo_service_impl, 
+                          brpc::SERVER_DOESNT_OWN_SERVICE) != 0) {
+        LOG(ERROR) << "Fail to add service";
+        return -1;
+    }
+
+    // Start the server. 
+    brpc::ServerOptions options;
+    options.mutable_ssl_options()->default_cert.certificate = "cert.pem";
+    options.mutable_ssl_options()->default_cert.private_key = "key.pem";
+    options.idle_timeout_sec = FLAGS_idle_timeout_s;
+    options.max_concurrency = FLAGS_max_concurrency;
+    options.internal_port = FLAGS_internal_port;
+    if (server.Start(FLAGS_port, &options) != 0) {
+        LOG(ERROR) << "Fail to start EchoServer";
+        return -1;
+    }
+
+    // Wait until Ctrl-C is pressed, then Stop() and Join() the server.
+    server.RunUntilAskedToQuit();
+    return 0;
+}
diff --git a/src/butil/object_pool_inl.h b/src/butil/object_pool_inl.h
index c98ec16f..d561d3fd 100644
--- a/src/butil/object_pool_inl.h
+++ b/src/butil/object_pool_inl.h
@@ -470,10 +470,7 @@ private:
         if (BAIDU_LIKELY(lp != NULL)) {
             return lp;
         }
-        lp = new(std::nothrow) LocalPool(this);
-        if (NULL == lp) {
-            return NULL;
-        }
+        lp = new LocalPool(this);
         BAIDU_SCOPED_LOCK(_change_thread_mutex); //avoid race with clear()
            BAIDU_SET_VOLATILE_THREAD_LOCAL(_local_pool, lp);
         butil::thread_atexit(LocalPool::delete_local_pool, lp);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to