|  | @@ -92,6 +92,7 @@ CC_opt = $(DEFAULT_CC)
 | 
	
		
			
				|  |  |  CXX_opt = $(DEFAULT_CXX)
 | 
	
		
			
				|  |  |  LD_opt = $(DEFAULT_CC)
 | 
	
		
			
				|  |  |  LDXX_opt = $(DEFAULT_CXX)
 | 
	
		
			
				|  |  | +CXXFLAGS_opt = -fno-exceptions
 | 
	
		
			
				|  |  |  CPPFLAGS_opt = -O2
 | 
	
		
			
				|  |  |  DEFINES_opt = NDEBUG
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -99,7 +100,7 @@ VALID_CONFIG_asan-trace-cmp = 1
 | 
	
		
			
				|  |  |  REQUIRE_CUSTOM_LIBRARIES_asan-trace-cmp = 1
 | 
	
		
			
				|  |  |  CC_asan-trace-cmp = clang
 | 
	
		
			
				|  |  |  CXX_asan-trace-cmp = clang++
 | 
	
		
			
				|  |  | -LD_asan-trace-cmp = clang
 | 
	
		
			
				|  |  | +LD_asan-trace-cmp = clang++
 | 
	
		
			
				|  |  |  LDXX_asan-trace-cmp = clang++
 | 
	
		
			
				|  |  |  CPPFLAGS_asan-trace-cmp = -O0 -fsanitize-coverage=edge -fsanitize-coverage=trace-cmp -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
 | 
	
		
			
				|  |  |  LDFLAGS_asan-trace-cmp = -fsanitize=address
 | 
	
	
		
			
				|  | @@ -109,6 +110,7 @@ CC_dbg = $(DEFAULT_CC)
 | 
	
		
			
				|  |  |  CXX_dbg = $(DEFAULT_CXX)
 | 
	
		
			
				|  |  |  LD_dbg = $(DEFAULT_CC)
 | 
	
		
			
				|  |  |  LDXX_dbg = $(DEFAULT_CXX)
 | 
	
		
			
				|  |  | +CXXFLAGS_dbg = -fno-exceptions
 | 
	
		
			
				|  |  |  CPPFLAGS_dbg = -O0
 | 
	
		
			
				|  |  |  DEFINES_dbg = _DEBUG DEBUG
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -116,7 +118,7 @@ VALID_CONFIG_asan = 1
 | 
	
		
			
				|  |  |  REQUIRE_CUSTOM_LIBRARIES_asan = 1
 | 
	
		
			
				|  |  |  CC_asan = clang
 | 
	
		
			
				|  |  |  CXX_asan = clang++
 | 
	
		
			
				|  |  | -LD_asan = clang
 | 
	
		
			
				|  |  | +LD_asan = clang++
 | 
	
		
			
				|  |  |  LDXX_asan = clang++
 | 
	
		
			
				|  |  |  CPPFLAGS_asan = -O0 -fsanitize-coverage=edge -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
 | 
	
		
			
				|  |  |  LDFLAGS_asan = -fsanitize=address
 | 
	
	
		
			
				|  | @@ -125,7 +127,7 @@ VALID_CONFIG_msan = 1
 | 
	
		
			
				|  |  |  REQUIRE_CUSTOM_LIBRARIES_msan = 1
 | 
	
		
			
				|  |  |  CC_msan = clang
 | 
	
		
			
				|  |  |  CXX_msan = clang++
 | 
	
		
			
				|  |  | -LD_msan = clang
 | 
	
		
			
				|  |  | +LD_msan = clang++
 | 
	
		
			
				|  |  |  LDXX_msan = clang++
 | 
	
		
			
				|  |  |  CPPFLAGS_msan = -O0 -fsanitize-coverage=edge -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-command-line-argument -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS
 | 
	
		
			
				|  |  |  LDFLAGS_msan = -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,)
 | 
	
	
		
			
				|  | @@ -152,7 +154,7 @@ VALID_CONFIG_asan-noleaks = 1
 | 
	
		
			
				|  |  |  REQUIRE_CUSTOM_LIBRARIES_asan-noleaks = 1
 | 
	
		
			
				|  |  |  CC_asan-noleaks = clang
 | 
	
		
			
				|  |  |  CXX_asan-noleaks = clang++
 | 
	
		
			
				|  |  | -LD_asan-noleaks = clang
 | 
	
		
			
				|  |  | +LD_asan-noleaks = clang++
 | 
	
		
			
				|  |  |  LDXX_asan-noleaks = clang++
 | 
	
		
			
				|  |  |  CPPFLAGS_asan-noleaks = -O0 -fsanitize-coverage=edge -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
 | 
	
		
			
				|  |  |  LDFLAGS_asan-noleaks = -fsanitize=address
 | 
	
	
		
			
				|  | @@ -170,7 +172,7 @@ VALID_CONFIG_ubsan = 1
 | 
	
		
			
				|  |  |  REQUIRE_CUSTOM_LIBRARIES_ubsan = 1
 | 
	
		
			
				|  |  |  CC_ubsan = clang
 | 
	
		
			
				|  |  |  CXX_ubsan = clang++
 | 
	
		
			
				|  |  | -LD_ubsan = clang
 | 
	
		
			
				|  |  | +LD_ubsan = clang++
 | 
	
		
			
				|  |  |  LDXX_ubsan = clang++
 | 
	
		
			
				|  |  |  CPPFLAGS_ubsan = -O0 -fsanitize-coverage=edge -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs
 | 
	
		
			
				|  |  |  LDFLAGS_ubsan = -fsanitize=undefined,unsigned-integer-overflow
 | 
	
	
		
			
				|  | @@ -180,7 +182,7 @@ VALID_CONFIG_tsan = 1
 | 
	
		
			
				|  |  |  REQUIRE_CUSTOM_LIBRARIES_tsan = 1
 | 
	
		
			
				|  |  |  CC_tsan = clang
 | 
	
		
			
				|  |  |  CXX_tsan = clang++
 | 
	
		
			
				|  |  | -LD_tsan = clang
 | 
	
		
			
				|  |  | +LD_tsan = clang++
 | 
	
		
			
				|  |  |  LDXX_tsan = clang++
 | 
	
		
			
				|  |  |  CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
 | 
	
		
			
				|  |  |  LDFLAGS_tsan = -fsanitize=thread
 | 
	
	
		
			
				|  | @@ -1160,6 +1162,7 @@ interop_client: $(BINDIR)/$(CONFIG)/interop_client
 | 
	
		
			
				|  |  |  interop_server: $(BINDIR)/$(CONFIG)/interop_server
 | 
	
		
			
				|  |  |  interop_test: $(BINDIR)/$(CONFIG)/interop_test
 | 
	
		
			
				|  |  |  json_run_localhost: $(BINDIR)/$(CONFIG)/json_run_localhost
 | 
	
		
			
				|  |  | +memory_test: $(BINDIR)/$(CONFIG)/memory_test
 | 
	
		
			
				|  |  |  metrics_client: $(BINDIR)/$(CONFIG)/metrics_client
 | 
	
		
			
				|  |  |  mock_test: $(BINDIR)/$(CONFIG)/mock_test
 | 
	
		
			
				|  |  |  noop-benchmark: $(BINDIR)/$(CONFIG)/noop-benchmark
 | 
	
	
		
			
				|  | @@ -1583,6 +1586,7 @@ buildtests_cxx: privatelibs_cxx \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/interop_server \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/interop_test \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/json_run_localhost \
 | 
	
		
			
				|  |  | +  $(BINDIR)/$(CONFIG)/memory_test \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/metrics_client \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/mock_test \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/noop-benchmark \
 | 
	
	
		
			
				|  | @@ -1703,6 +1707,7 @@ buildtests_cxx: privatelibs_cxx \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/interop_server \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/interop_test \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/json_run_localhost \
 | 
	
		
			
				|  |  | +  $(BINDIR)/$(CONFIG)/memory_test \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/metrics_client \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/mock_test \
 | 
	
		
			
				|  |  |    $(BINDIR)/$(CONFIG)/noop-benchmark \
 | 
	
	
		
			
				|  | @@ -2082,6 +2087,8 @@ test_cxx: buildtests_cxx
 | 
	
		
			
				|  |  |  	$(Q) $(BINDIR)/$(CONFIG)/health_service_end2end_test || ( echo test health_service_end2end_test failed ; exit 1 )
 | 
	
		
			
				|  |  |  	$(E) "[RUN]     Testing interop_test"
 | 
	
		
			
				|  |  |  	$(Q) $(BINDIR)/$(CONFIG)/interop_test || ( echo test interop_test failed ; exit 1 )
 | 
	
		
			
				|  |  | +	$(E) "[RUN]     Testing memory_test"
 | 
	
		
			
				|  |  | +	$(Q) $(BINDIR)/$(CONFIG)/memory_test || ( echo test memory_test failed ; exit 1 )
 | 
	
		
			
				|  |  |  	$(E) "[RUN]     Testing mock_test"
 | 
	
		
			
				|  |  |  	$(Q) $(BINDIR)/$(CONFIG)/mock_test || ( echo test mock_test failed ; exit 1 )
 | 
	
		
			
				|  |  |  	$(E) "[RUN]     Testing noop-benchmark"
 | 
	
	
		
			
				|  | @@ -2991,7 +2998,7 @@ LIBGRPC_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -3314,7 +3321,7 @@ LIBGRPC_CRONET_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -3623,7 +3630,7 @@ LIBGRPC_TEST_UTIL_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -3851,7 +3858,7 @@ LIBGRPC_UNSECURE_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -4247,7 +4254,7 @@ LIBGRPC++_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -4580,7 +4587,7 @@ LIBGRPC++_CRONET_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -5341,7 +5348,7 @@ LIBGRPC++_UNSECURE_SRC = \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/completion_queue_factory.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/event_string.c \
 | 
	
		
			
				|  |  | -    src/core/lib/surface/lame_client.c \
 | 
	
		
			
				|  |  | +    src/core/lib/surface/lame_client.cc \
 | 
	
		
			
				|  |  |      src/core/lib/surface/metadata_array.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/server.c \
 | 
	
		
			
				|  |  |      src/core/lib/surface/validate_metadata.c \
 | 
	
	
		
			
				|  | @@ -15397,6 +15404,49 @@ endif
 | 
	
		
			
				|  |  |  endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +MEMORY_TEST_SRC = \
 | 
	
		
			
				|  |  | +    test/core/support/memory_test.cc \
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +MEMORY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MEMORY_TEST_SRC))))
 | 
	
		
			
				|  |  | +ifeq ($(NO_SECURE),true)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# You can't build secure targets if you don't have OpenSSL.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +$(BINDIR)/$(CONFIG)/memory_test: openssl_dep_error
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +else
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +ifeq ($(NO_PROTOBUF),true)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +$(BINDIR)/$(CONFIG)/memory_test: protobuf_dep_error
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +else
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +$(BINDIR)/$(CONFIG)/memory_test: $(PROTOBUF_DEP) $(MEMORY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
 | 
	
		
			
				|  |  | +	$(E) "[LD]      Linking $@"
 | 
	
		
			
				|  |  | +	$(Q) mkdir -p `dirname $@`
 | 
	
		
			
				|  |  | +	$(Q) $(LDXX) $(LDFLAGS) $(MEMORY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.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)/memory_test
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +$(OBJDIR)/$(CONFIG)/test/core/support/memory_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +deps_memory_test: $(MEMORY_TEST_OBJS:.o=.dep)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +ifneq ($(NO_SECURE),true)
 | 
	
		
			
				|  |  | +ifneq ($(NO_DEPS),true)
 | 
	
		
			
				|  |  | +-include $(MEMORY_TEST_OBJS:.o=.dep)
 | 
	
		
			
				|  |  | +endif
 | 
	
		
			
				|  |  | +endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  METRICS_CLIENT_SRC = \
 | 
	
		
			
				|  |  |      $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc \
 | 
	
		
			
				|  |  |      test/cpp/interop/metrics_client.cc \
 |