This is an automated email from the ASF dual-hosted git repository.
jamesge pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-brpc.git
The following commit(s) were added to refs/heads/master by this push:
new 11949fc Fix #955 and add UT
11949fc is described below
commit 11949fc1cb60a96f891205853162e8f7b0f1ff87
Author: jamesge <[email protected]>
AuthorDate: Sun Nov 3 20:02:17 2019 -0800
Fix #955 and add UT
---
src/butil/containers/bounded_queue.h | 12 ++--
test/BUILD | 1 +
test/CMakeLists.txt | 1 +
test/Makefile | 1 +
test/bounded_queue_unittest.cc | 106 +++++++++++++++++++++++++++++++++++
5 files changed, 116 insertions(+), 5 deletions(-)
diff --git a/src/butil/containers/bounded_queue.h
b/src/butil/containers/bounded_queue.h
index 556d70b..fb688ca 100644
--- a/src/butil/containers/bounded_queue.h
+++ b/src/butil/containers/bounded_queue.h
@@ -168,8 +168,9 @@ public:
bool pop(T* item) {
if (_count) {
--_count;
- *item = ((T*)_items)[_start];
- ((T*)_items)[_start].~T();
+ T* const p = (T*)_items + _start;
+ *item = *p;
+ p->~T();
_start = _mod(_start + 1, _cap);
return true;
}
@@ -181,7 +182,7 @@ public:
bool pop_bottom() {
if (_count) {
--_count;
- ((T*)_items + _start + _count)->~T();
+ ((T*)_items + _mod(_start + _count, _cap))->~T();
return true;
}
return false;
@@ -192,8 +193,9 @@ public:
bool pop_bottom(T* item) {
if (_count) {
--_count;
- *item = ((T*)_items)[_start + _count];
- ((T*)_items)[_start + _count].~T();
+ T* const p = (T*)_items + _mod(_start + _count, _cap);
+ *item = *p;
+ p->~T();
return true;
}
return false;
diff --git a/test/BUILD b/test/BUILD
index 88ccafe..71206da 100644
--- a/test/BUILD
+++ b/test/BUILD
@@ -155,6 +155,7 @@ TEST_BUTIL_SOURCES = [
"scoped_locale.cc",
"recordio_unittest.cpp",
#"popen_unittest.cpp",
+ "bounded_queue_unittest.cc",
"butil_unittest_main.cpp",
] + select({
"@bazel_tools//tools/osx:darwin": [],
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index f61b715..f3642de 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -76,6 +76,7 @@ file(COPY ${PROJECT_SOURCE_DIR}/test/run_tests.sh DESTINATION
${CMAKE_CURRENT_BI
SET(TEST_BUTIL_SOURCES
${PROJECT_SOURCE_DIR}/test/recordio_unittest.cpp
${PROJECT_SOURCE_DIR}/test/popen_unittest.cpp
+ ${PROJECT_SOURCE_DIR}/test/bounded_queue_unittest.cc
${PROJECT_SOURCE_DIR}/test/at_exit_unittest.cc
${PROJECT_SOURCE_DIR}/test/atomicops_unittest.cc
${PROJECT_SOURCE_DIR}/test/base64_unittest.cc
diff --git a/test/Makefile b/test/Makefile
index 27c97c4..ad7fff1 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -140,6 +140,7 @@ TEST_BUTIL_SOURCES = \
test_switches.cc \
scoped_locale.cc \
popen_unittest.cpp \
+ bounded_queue_unittest.cc \
butil_unittest_main.cpp
ifeq ($(SYSTEM), Linux)
diff --git a/test/bounded_queue_unittest.cc b/test/bounded_queue_unittest.cc
new file mode 100644
index 0000000..6e1bc45
--- /dev/null
+++ b/test/bounded_queue_unittest.cc
@@ -0,0 +1,106 @@
+// 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.
+
+// Author: Ge,Jun ([email protected])
+// Date: Sun Nov 3 19:16:50 PST 2019
+
+#include <iostream>
+#include "butil/containers/bounded_queue.h"
+#include <gtest/gtest.h>
+
+namespace {
+
+TEST(BoundedQueueTest, sanity) {
+ const int N = 36;
+ char storage[N * sizeof(int)];
+ butil::BoundedQueue<int> q(storage, sizeof(storage),
butil::NOT_OWN_STORAGE);
+ ASSERT_EQ(0ul, q.size());
+ ASSERT_TRUE(q.empty());
+ ASSERT_TRUE(NULL == q.top());
+ ASSERT_TRUE(NULL == q.bottom());
+ for (int i = 1; i <= N; ++i) {
+ if (i % 2 == 0) {
+ ASSERT_TRUE(q.push(i));
+ } else {
+ int* p = q.push();
+ ASSERT_TRUE(p);
+ *p = i;
+ }
+ ASSERT_EQ((size_t)i, q.size());
+ ASSERT_EQ(1, *q.top());
+ ASSERT_EQ(i, *q.bottom());
+ }
+ ASSERT_FALSE(q.push(N+1));
+ ASSERT_FALSE(q.push_top(N+1));
+ ASSERT_EQ((size_t)N, q.size());
+ ASSERT_FALSE(q.empty());
+ ASSERT_TRUE(q.full());
+
+ for (int i = 1; i <= N; ++i) {
+ ASSERT_EQ(i, *q.top());
+ ASSERT_EQ(N, *q.bottom());
+ if (i % 2 == 0) {
+ int tmp = 0;
+ ASSERT_TRUE(q.pop(&tmp));
+ ASSERT_EQ(tmp, i);
+ } else {
+ ASSERT_TRUE(q.pop());
+ }
+ ASSERT_EQ((size_t)(N-i), q.size());
+ }
+ ASSERT_EQ(0ul, q.size());
+ ASSERT_TRUE(q.empty());
+ ASSERT_FALSE(q.full());
+ ASSERT_FALSE(q.pop());
+
+ for (int i = 1; i <= N; ++i) {
+ if (i % 2 == 0) {
+ ASSERT_TRUE(q.push_top(i));
+ } else {
+ int* p = q.push_top();
+ ASSERT_TRUE(p);
+ *p = i;
+ }
+ ASSERT_EQ((size_t)i, q.size());
+ ASSERT_EQ(i, *q.top());
+ ASSERT_EQ(1, *q.bottom());
+ }
+ ASSERT_FALSE(q.push(N+1));
+ ASSERT_FALSE(q.push_top(N+1));
+ ASSERT_EQ((size_t)N, q.size());
+ ASSERT_FALSE(q.empty());
+ ASSERT_TRUE(q.full());
+
+ for (int i = 1; i <= N; ++i) {
+ ASSERT_EQ(N, *q.top());
+ ASSERT_EQ(i, *q.bottom());
+ if (i % 2 == 0) {
+ int tmp = 0;
+ ASSERT_TRUE(q.pop_bottom(&tmp));
+ ASSERT_EQ(tmp, i);
+ } else {
+ ASSERT_TRUE(q.pop_bottom());
+ }
+ ASSERT_EQ((size_t)(N-i), q.size());
+ }
+ ASSERT_EQ(0ul, q.size());
+ ASSERT_TRUE(q.empty());
+ ASSERT_FALSE(q.full());
+ ASSERT_FALSE(q.pop());
+}
+
+} // anonymous namespace
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]