Reviewer comments

pull/16455/head
Yash Tibrewal 6 years ago
parent bab043e865
commit c7e92f26eb
  1. 2
      CMakeLists.txt
  2. 6
      Makefile
  3. 3
      build.yaml
  4. 14
      src/core/ext/transport/chttp2/transport/context_list.cc
  5. 24
      src/core/ext/transport/chttp2/transport/context_list.h
  6. 5
      src/core/lib/iomgr/endpoint.cc
  7. 3
      test/core/transport/chttp2/BUILD
  8. 33
      test/core/transport/chttp2/context_list_test.cc
  9. 2
      tools/run_tests/generated/sources_and_headers.json
  10. 2
      tools/run_tests/generated/tests.json

@ -12738,6 +12738,8 @@ target_link_libraries(context_list_test
${_gRPC_ALLTARGETS_LIBRARIES} ${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util grpc_test_util
grpc grpc
gpr_test_util
gpr
${_gRPC_GFLAGS_LIBRARIES} ${_gRPC_GFLAGS_LIBRARIES}
) )

@ -17582,16 +17582,16 @@ $(BINDIR)/$(CONFIG)/context_list_test: protobuf_dep_error
else else
$(BINDIR)/$(CONFIG)/context_list_test: $(PROTOBUF_DEP) $(CONTEXT_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(BINDIR)/$(CONFIG)/context_list_test: $(PROTOBUF_DEP) $(CONTEXT_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@" $(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@` $(Q) mkdir -p `dirname $@`
$(Q) $(LDXX) $(LDFLAGS) $(CONTEXT_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/context_list_test $(Q) $(LDXX) $(LDFLAGS) $(CONTEXT_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/context_list_test
endif endif
endif endif
$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/context_list_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/context_list_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_context_list_test: $(CONTEXT_LIST_TEST_OBJS:.o=.dep) deps_context_list_test: $(CONTEXT_LIST_TEST_OBJS:.o=.dep)

@ -4605,6 +4605,7 @@ targets:
- grpc++_codegen_base_src - grpc++_codegen_base_src
uses_polling: false uses_polling: false
- name: context_list_test - name: context_list_test
gtest: true
build: test build: test
language: c++ language: c++
src: src:
@ -4612,6 +4613,8 @@ targets:
deps: deps:
- grpc_test_util - grpc_test_util
- grpc - grpc
- gpr_test_util
- gpr
uses_polling: false uses_polling: false
- name: credentials_test - name: credentials_test
gtest: true gtest: true

@ -21,30 +21,30 @@
#include "src/core/ext/transport/chttp2/transport/context_list.h" #include "src/core/ext/transport/chttp2/transport/context_list.h"
namespace { namespace {
void (*cb)(void*, grpc_core::Timestamps*) = nullptr; void (*write_timestamps_callback_g)(void*, grpc_core::Timestamps*) = nullptr;
} }
namespace grpc_core { namespace grpc_core {
void ContextList::Execute(void* arg, grpc_core::Timestamps* ts, void ContextList::Execute(void* arg, grpc_core::Timestamps* ts,
grpc_error* error) { grpc_error* error) {
ContextList* head = static_cast<ContextList*>(arg); ContextList* head = static_cast<ContextList*>(arg);
ContextList* ptr; ContextList* to_be_freed;
while (head != nullptr) { while (head != nullptr) {
if (error == GRPC_ERROR_NONE && ts != nullptr) { if (error == GRPC_ERROR_NONE && ts != nullptr) {
if (cb) { if (write_timestamps_callback_g) {
cb(head->s_->context, ts); write_timestamps_callback_g(head->s_->context, ts);
} }
} }
GRPC_CHTTP2_STREAM_UNREF(static_cast<grpc_chttp2_stream*>(head->s_), GRPC_CHTTP2_STREAM_UNREF(static_cast<grpc_chttp2_stream*>(head->s_),
"timestamp"); "timestamp");
ptr = head; to_be_freed = head;
head = head->next_; head = head->next_;
grpc_core::Delete(ptr); grpc_core::Delete(to_be_freed);
} }
} }
void grpc_http2_set_write_timestamps_callback( void grpc_http2_set_write_timestamps_callback(
void (*fn)(void*, grpc_core::Timestamps*)) { void (*fn)(void*, grpc_core::Timestamps*)) {
cb = fn; write_timestamps_callback_g = fn;
} }
} /* namespace grpc_core */ } /* namespace grpc_core */

@ -16,8 +16,8 @@
* *
*/ */
#ifndef GRPC_CORE_EXT_TRANSPORT_CONTEXT_LIST_H #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CONTEXT_LIST_H
#define GRPC_CORE_EXT_TRANSPORT_CONTEXT_LIST_H #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CONTEXT_LIST_H
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
@ -33,8 +33,10 @@ class ContextList {
* list. */ * list. */
static void Append(ContextList** head, grpc_chttp2_stream* s) { static void Append(ContextList** head, grpc_chttp2_stream* s) {
/* Make sure context is not already present */ /* Make sure context is not already present */
ContextList* ptr = *head;
GRPC_CHTTP2_STREAM_REF(s, "timestamp"); GRPC_CHTTP2_STREAM_REF(s, "timestamp");
#ifndef NDEBUG
ContextList* ptr = *head;
while (ptr != nullptr) { while (ptr != nullptr) {
if (ptr->s_ == s) { if (ptr->s_ == s) {
GPR_ASSERT( GPR_ASSERT(
@ -43,17 +45,13 @@ class ContextList {
} }
ptr = ptr->next_; ptr = ptr->next_;
} }
#endif
/* Create a new element in the list and add it at the front */
ContextList* elem = grpc_core::New<ContextList>(); ContextList* elem = grpc_core::New<ContextList>();
elem->s_ = s; elem->s_ = s;
if (*head == nullptr) { elem->next_ = *head;
*head = elem; *head = elem;
return;
}
ptr = *head;
while (ptr->next_ != nullptr) {
ptr = ptr->next_;
}
ptr->next_ = elem;
} }
/* Executes a function \a fn with each context in the list and \a ts. It also /* Executes a function \a fn with each context in the list and \a ts. It also
@ -69,4 +67,4 @@ void grpc_http2_set_write_timestamps_callback(
void (*fn)(void*, grpc_core::Timestamps*)); void (*fn)(void*, grpc_core::Timestamps*));
} /* namespace grpc_core */ } /* namespace grpc_core */
#endif /* GRPC_CORE_EXT_TRANSPORT_CONTEXT_LIST_H */ #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CONTEXT_LIST_H */

@ -63,8 +63,5 @@ grpc_resource_user* grpc_endpoint_get_resource_user(grpc_endpoint* ep) {
} }
bool grpc_endpoint_can_track_err(grpc_endpoint* ep) { bool grpc_endpoint_can_track_err(grpc_endpoint* ep) {
if (ep->vtable->can_track_err != nullptr) { return ep->vtable->can_track_err(ep);
return ep->vtable->can_track_err(ep);
}
return false;
} }

@ -69,6 +69,9 @@ grpc_cc_test(
grpc_cc_test( grpc_cc_test(
name = "context_list_test", name = "context_list_test",
srcs = ["context_list_test.cc"], srcs = ["context_list_test.cc"],
external_deps = [
"gtest",
],
language = "C++", language = "C++",
deps = [ deps = [
"//:gpr", "//:gpr",

@ -18,6 +18,7 @@
#include "src/core/lib/iomgr/port.h" #include "src/core/lib/iomgr/port.h"
#include <gtest/gtest.h>
#include <new> #include <new>
#include <vector> #include <vector>
@ -29,25 +30,28 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
static void TestExecuteFlushesListVerifier(void* arg, namespace grpc_core {
grpc_core::Timestamps* ts) { namespace testing {
namespace {
void TestExecuteFlushesListVerifier(void* arg, grpc_core::Timestamps* ts) {
GPR_ASSERT(arg != nullptr); GPR_ASSERT(arg != nullptr);
gpr_atm* done = reinterpret_cast<gpr_atm*>(arg); gpr_atm* done = reinterpret_cast<gpr_atm*>(arg);
gpr_atm_rel_store(done, static_cast<gpr_atm>(1)); gpr_atm_rel_store(done, static_cast<gpr_atm>(1));
} }
static void discard_write(grpc_slice slice) {} void discard_write(grpc_slice slice) {}
/** Tests that all ContextList elements in the list are flushed out on /** Tests that all ContextList elements in the list are flushed out on
* execute. * execute.
* Also tests that arg is passed correctly. * Also tests that arg is passed correctly.
*/ */
static void TestExecuteFlushesList() { TEST(ContextList, ExecuteFlushesList) {
grpc_core::ContextList* list = nullptr; grpc_core::ContextList* list = nullptr;
grpc_http2_set_write_timestamps_callback(TestExecuteFlushesListVerifier); grpc_http2_set_write_timestamps_callback(TestExecuteFlushesListVerifier);
#define NUM_ELEM 5 const int kNumElems = 5;
grpc_core::ExecCtx exec_ctx; grpc_core::ExecCtx exec_ctx;
grpc_stream_refcount ref; grpc_stream_refcount ref;
GRPC_STREAM_REF_INIT(&ref, 1, nullptr, nullptr, "dummy ref");
grpc_resource_quota* resource_quota = grpc_resource_quota* resource_quota =
grpc_resource_quota_create("context_list_test"); grpc_resource_quota_create("context_list_test");
grpc_endpoint* mock_endpoint = grpc_endpoint* mock_endpoint =
@ -55,9 +59,9 @@ static void TestExecuteFlushesList() {
grpc_transport* t = grpc_transport* t =
grpc_create_chttp2_transport(nullptr, mock_endpoint, true); grpc_create_chttp2_transport(nullptr, mock_endpoint, true);
std::vector<grpc_chttp2_stream*> s; std::vector<grpc_chttp2_stream*> s;
s.reserve(NUM_ELEM); s.reserve(kNumElems);
gpr_atm verifier_called[NUM_ELEM]; gpr_atm verifier_called[kNumElems];
for (auto i = 0; i < NUM_ELEM; i++) { for (auto i = 0; i < kNumElems; i++) {
s.push_back(static_cast<grpc_chttp2_stream*>( s.push_back(static_cast<grpc_chttp2_stream*>(
gpr_malloc(grpc_transport_stream_size(t)))); gpr_malloc(grpc_transport_stream_size(t))));
grpc_transport_init_stream(reinterpret_cast<grpc_transport*>(t), grpc_transport_init_stream(reinterpret_cast<grpc_transport*>(t),
@ -69,7 +73,7 @@ static void TestExecuteFlushesList() {
} }
grpc_core::Timestamps ts; grpc_core::Timestamps ts;
grpc_core::ContextList::Execute(list, &ts, GRPC_ERROR_NONE); grpc_core::ContextList::Execute(list, &ts, GRPC_ERROR_NONE);
for (auto i = 0; i < NUM_ELEM; i++) { for (auto i = 0; i < kNumElems; i++) {
GPR_ASSERT(gpr_atm_acq_load(&verifier_called[i]) == GPR_ASSERT(gpr_atm_acq_load(&verifier_called[i]) ==
static_cast<gpr_atm>(1)); static_cast<gpr_atm>(1));
grpc_transport_destroy_stream(reinterpret_cast<grpc_transport*>(t), grpc_transport_destroy_stream(reinterpret_cast<grpc_transport*>(t),
@ -82,12 +86,13 @@ static void TestExecuteFlushesList() {
grpc_resource_quota_unref(resource_quota); grpc_resource_quota_unref(resource_quota);
exec_ctx.Flush(); exec_ctx.Flush();
} }
} // namespace
static void TestContextList() { TestExecuteFlushesList(); } } // namespace testing
} // namespace grpc_core
int main(int argc, char** argv) { int main(int argc, char** argv) {
grpc_test_init(argc, argv);
grpc_init(); grpc_init();
TestContextList(); ::testing::InitGoogleTest(&argc, argv);
grpc_shutdown(); return RUN_ALL_TESTS();
return 0;
} }

@ -3509,6 +3509,8 @@
}, },
{ {
"deps": [ "deps": [
"gpr",
"gpr_test_util",
"grpc", "grpc",
"grpc_test_util" "grpc_test_util"
], ],

@ -4136,7 +4136,7 @@
"exclude_configs": [], "exclude_configs": [],
"exclude_iomgrs": [], "exclude_iomgrs": [],
"flaky": false, "flaky": false,
"gtest": false, "gtest": true,
"language": "c++", "language": "c++",
"name": "context_list_test", "name": "context_list_test",
"platforms": [ "platforms": [

Loading…
Cancel
Save