Bug Summary

File:jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp
Warning:line 127, column 3
Potential memory leak

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test_networkUtilization.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mthread-model posix -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/libjvm/gtest/objs/precompiled -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D _GNU_SOURCE -D _REENTRANT -D LIBC=gnu -D LINUX -D VM_LITTLE_ENDIAN -D _LP64=1 -D ASSERT -D CHECK_UNHANDLED_OOPS -D TARGET_ARCH_x86 -D INCLUDE_SUFFIX_OS=_linux -D INCLUDE_SUFFIX_CPU=_x86 -D INCLUDE_SUFFIX_COMPILER=_gcc -D TARGET_COMPILER_gcc -D AMD64 -D HOTSPOT_LIB_ARCH="amd64" -D COMPILER1 -D COMPILER2 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -I /home/daniel/Projects/java/jdk/src/hotspot/share/precompiled -I /home/daniel/Projects/java/jdk/src/hotspot/share/include -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix/include -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base/linux -I /home/daniel/Projects/java/jdk/src/java.base/share/native/libjimage -I /home/daniel/Projects/java/googletest/googletest/include -I /home/daniel/Projects/java/googletest/googlemock/include -I /home/daniel/Projects/java/jdk/test/hotspot/gtest -I /home/daniel/Projects/java/jdk/test/hotspot/gtest -D _FORTIFY_SOURCE=2 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-format-zero-length -Wno-unused-parameter -Wno-unused -Wno-parentheses -Wno-comment -Wno-unknown-pragmas -Wno-address -Wno-delete-non-virtual-dtor -Wno-char-subscripts -Wno-array-bounds -Wno-int-in-bool-context -Wno-ignored-qualifiers -Wno-missing-field-initializers -Wno-implicit-fallthrough -Wno-empty-body -Wno-strict-overflow -Wno-sequence-point -Wno-maybe-uninitialized -Wno-misleading-indentation -Wno-cast-function-type -Wno-shift-negative-value -Wno-undef -Wno-stringop-overflow -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /home/daniel/Projects/java/jdk/make/hotspot -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -stack-protector 1 -fno-rtti -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /home/daniel/Projects/java/scan/2021-12-21-193737-8510-1 -x c++ /home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp

/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp

1/*
2 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26
27// This test performs mocking of certain JVM functionality. This works by
28// including the source file under test inside an anonymous namespace (which
29// prevents linking conflicts) with the mocked symbols redefined.
30
31// The include list should mirror the one found in the included source file -
32// with the ones that should pick up the mocks removed. Those should be included
33// later after the mocks have been defined.
34
35#include "logging/log.hpp"
36#include "jfr/jfrEvents.hpp"
37#include "jfr/metadata/jfrSerializer.hpp"
38#include "jfr/periodic/jfrOSInterface.hpp"
39#include "jfr/utilities/jfrTime.hpp"
40#include "jfr/utilities/jfrTypes.hpp"
41#include "runtime/os_perf.hpp"
42#include "utilities/globalDefinitions.hpp"
43#include "utilities/growableArray.hpp"
44
45#include "unittest.hpp"
46
47#include <vector>
48#include <list>
49#include <map>
50
51namespace {
52
53 class MockFastUnorderedElapsedCounterSource : public ::FastUnorderedElapsedCounterSource {
54 public:
55 static jlong current_ticks;
56 static Type now() {
57 return current_ticks;
58 }
59 static uint64_t nanoseconds(Type value) {
60 return value;
61 }
62 };
63
64 typedef TimeInstant<CounterRepresentation, MockFastUnorderedElapsedCounterSource> MockJfrTicks;
65 typedef TimeInterval<CounterRepresentation, MockFastUnorderedElapsedCounterSource> MockJfrTickspan;
66
67 class MockJfrCheckpointWriter {
68 public:
69 traceid current;
70 std::map<traceid, std::string> ids;
71
72 const JfrCheckpointContext context() const {
73 return JfrCheckpointContext();
74 }
75 intptr_t reserve(size_t size) {
76 return 0;
77 }
78 void write_key(traceid id) {
79 current = id;
80 }
81 void write_type(JfrTypeId id) {}
82 MockJfrCheckpointWriter() {}
83 void write(const char* data) {}
84 void set_context(const JfrCheckpointContext ctx) { }
85 void write_count(u4 nof_entries) { }
86 };
87
88 class MockJfrSerializer {
89 public:
90 static bool register_serializer(JfrTypeId id, bool permit_cache, MockJfrSerializer* serializer) {
91 return true;
92 }
93 virtual void on_rotation() {}
94 virtual void serialize(MockJfrCheckpointWriter& writer) {}
95 };
96
97 struct MockNetworkInterface {
98 std::string name;
99 uint64_t bytes_in;
100 uint64_t bytes_out;
101 traceid id;
102 MockNetworkInterface(std::string name, uint64_t bytes_in, uint64_t bytes_out, traceid id) :
103 name(name), bytes_in(bytes_in), bytes_out(bytes_out), id(id) {}
104
105 bool operator==(const MockNetworkInterface& rhs) const {
106 return name == rhs.name;
107 }
108 };
109
110 class NetworkInterface : public ::NetworkInterface {
111 public:
112 NetworkInterface(const char* name, uint64_t bytes_in, uint64_t bytes_out, NetworkInterface* next) :
113 ::NetworkInterface(name, bytes_in, bytes_out, next) {}
114 NetworkInterface* next(void) const {
115 return reinterpret_cast<NetworkInterface*>(::NetworkInterface::next());
116 }
117 };
118
119 class MockJfrOSInterface {
120 static std::list<MockNetworkInterface> _interfaces;
121 public:
122 MockJfrOSInterface() {}
123 static int network_utilization(NetworkInterface** network_interfaces) {
124 *network_interfaces = NULL__null;
125 for (std::list<MockNetworkInterface>::const_iterator i = _interfaces.begin();
126 i != _interfaces.end();
127 ++i) {
128 NetworkInterface* cur = new NetworkInterface(i->name.c_str(), i->bytes_in, i->bytes_out, *network_interfaces);
129 *network_interfaces = cur;
130 }
131 return OS_OK;
132 }
133 static MockNetworkInterface& add_interface(const std::string& name, traceid id) {
134 MockNetworkInterface iface(name, 0, 0, id);
135 _interfaces.push_front(iface);
136 return _interfaces.front();
137 }
138 static void remove_interface(const MockNetworkInterface& iface) {
139 _interfaces.remove(iface);
140 }
141 static void clear_interfaces() {
142 _interfaces.clear();
143 }
144 static const MockNetworkInterface& get_interface(traceid id) {
145 std::list<MockNetworkInterface>::const_iterator i = _interfaces.begin();
146 for (; i != _interfaces.end(); ++i) {
147 if (i->id == id) {
148 break;
149 }
150 }
151 return *i;
152 }
153 };
154
155 std::list<MockNetworkInterface> MockJfrOSInterface::_interfaces;
156
157 class MockEventNetworkUtilization : public ::EventNetworkUtilization {
158 public:
159 std::string iface;
160 s8 readRate;
161 s8 writeRate;
162 static std::vector<MockEventNetworkUtilization> committed;
163 MockJfrCheckpointWriter writer;
164
165 public:
166 MockEventNetworkUtilization(EventStartTime timing=TIMED) :
167 ::EventNetworkUtilization(timing) {}
168
169 void set_networkInterface(traceid new_value) {
170 const MockNetworkInterface& entry = MockJfrOSInterface::get_interface(new_value);
171 iface = entry.name;
172 }
173 void set_readRate(s8 new_value) {
174 readRate = new_value;
175 }
176 void set_writeRate(s8 new_value) {
177 writeRate = new_value;
178 }
179
180 void commit() {
181 committed.push_back(*this);
182 }
183
184 void set_starttime(const MockJfrTicks& time) {}
185 void set_endtime(const MockJfrTicks& time) {}
186
187 static const MockEventNetworkUtilization& get_committed(const std::string& name) {
188 static MockEventNetworkUtilization placeholder;
189 for (std::vector<MockEventNetworkUtilization>::const_iterator i = committed.begin();
190 i != committed.end();
191 ++i) {
192 if (name == i->iface) {
193 return *i;
194 }
195 }
196 return placeholder;
197 }
198 };
199
200 std::vector<MockEventNetworkUtilization> MockEventNetworkUtilization::committed;
201
202 jlong MockFastUnorderedElapsedCounterSource::current_ticks;
203
204// Reincluding source files in the anonymous namespace unfortunately seems to
205// behave strangely with precompiled headers (only when using gcc though)
206#ifndef DONT_USE_PRECOMPILED_HEADER
207#define DONT_USE_PRECOMPILED_HEADER
208#endif
209
210#define EventNetworkUtilization MockEventNetworkUtilization
211#define FastUnorderedElapsedCounterSource MockFastUnorderedElapsedCounterSource
212#define JfrOSInterface MockJfrOSInterface
213#define JfrSerializer MockJfrSerializer
214#define JfrCheckpointWriter MockJfrCheckpointWriter
215#define JfrTicks MockJfrTicks
216#define JfrTickspan MockJfrTickspan
217
218#include "jfr/periodic/jfrNetworkUtilization.hpp"
219#include "jfr/periodic/jfrNetworkUtilization.cpp"
220
221#undef EventNetworkUtilization
222#undef FastUnorderedElapsedCounterSource
223#undef JfrOSInterface
224#undef JfrSerializer
225#undef JfrCheckpointWriter
226#undef JfrTicks
227#undef JfrTickspan
228
229} // anonymous namespace
230
231class JfrTestNetworkUtilization : public ::testing::Test {
232protected:
233 void SetUp() {
234 MockEventNetworkUtilization::committed.clear();
235 MockJfrOSInterface::clear_interfaces();
236 // Ensure that tests are separated in time
237 MockFastUnorderedElapsedCounterSource::current_ticks += 1 * NANOSECS_PER_SEC;
238 }
239
240 void TearDown() {
241 JfrNetworkUtilization::destroy();
242 }
243};
244
245static traceid id = 0;
246
247TEST_VM_F(JfrTestNetworkUtilization, RequestFunctionBasic)class JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test :
public JfrTestNetworkUtilization { public: JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test
() {} private: virtual void TestBody(); static ::testing::TestInfo
* const test_info_ __attribute__ ((unused)); JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test
(JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test const
&) = delete; void operator=(JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test
const &) = delete;};::testing::TestInfo* const JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"JfrTestNetworkUtilization", "RequestFunctionBasic_vm", __null
, __null, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 247), (::testing::internal::GetTypeId<JfrTestNetworkUtilization
>()), JfrTestNetworkUtilization::SetUpTestCase, JfrTestNetworkUtilization
::TearDownTestCase, new ::testing::internal::TestFactoryImpl<
JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test>);
void JfrTestNetworkUtilization_RequestFunctionBasic_vm_Test::
TestBody()
{
248
249 MockNetworkInterface& eth0 = MockJfrOSInterface::add_interface("eth0", ++id);
250 JfrNetworkUtilization::send_events();
251 ASSERT_EQ(0u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0u)) == 1)>::Compare("0u",
"MockEventNetworkUtilization::committed.size()", 0u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 251, gtest_ar.failure_message()) = ::testing::Message()
;
252
253 eth0.bytes_in += 10;
254 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
255
256 JfrNetworkUtilization::send_events();
257 ASSERT_EQ(1u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(1u)) == 1)>::Compare("1u",
"MockEventNetworkUtilization::committed.size()", 1u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 257, gtest_ar.failure_message()) = ::testing::Message()
;
258 MockEventNetworkUtilization& e = MockEventNetworkUtilization::committed[0];
259 EXPECT_EQ(40, e.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(40)) == 1)>::Compare("40",
"e.readRate", 40, e.readRate))) ; else ::testing::internal::
AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 259, gtest_ar.failure_message()) = ::testing::Message()
;
260 EXPECT_EQ(0, e.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "e.writeRate"
, 0, e.writeRate))) ; else ::testing::internal::AssertHelper(
::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 260, gtest_ar.failure_message()) = ::testing::Message()
;
261 EXPECT_STREQ("eth0", e.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth0\"", "e.iface.c_str()"
, "eth0", e.iface.c_str()))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 261, gtest_ar.failure_message()) = ::testing::Message()
;
262}
263
264TEST_VM_F(JfrTestNetworkUtilization, RequestFunctionMultiple)class JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test
: public JfrTestNetworkUtilization { public: JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test
() {} private: virtual void TestBody(); static ::testing::TestInfo
* const test_info_ __attribute__ ((unused)); JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test
(JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test const
&) = delete; void operator=(JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test
const &) = delete;};::testing::TestInfo* const JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"JfrTestNetworkUtilization", "RequestFunctionMultiple_vm", __null
, __null, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 264), (::testing::internal::GetTypeId<JfrTestNetworkUtilization
>()), JfrTestNetworkUtilization::SetUpTestCase, JfrTestNetworkUtilization
::TearDownTestCase, new ::testing::internal::TestFactoryImpl<
JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test>
);void JfrTestNetworkUtilization_RequestFunctionMultiple_vm_Test
::TestBody()
{
265
266 MockNetworkInterface& eth0 = MockJfrOSInterface::add_interface("eth0", ++id);
267 MockNetworkInterface& eth1 = MockJfrOSInterface::add_interface("eth1", ++id);
268 MockNetworkInterface& ppp0 = MockJfrOSInterface::add_interface("ppp0", ++id);
269 JfrNetworkUtilization::send_events();
270 ASSERT_EQ(0u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0u)) == 1)>::Compare("0u",
"MockEventNetworkUtilization::committed.size()", 0u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 270, gtest_ar.failure_message()) = ::testing::Message()
;
271
272 eth0.bytes_in += 10;
273 eth1.bytes_in += 100;
274 ppp0.bytes_out += 50;
275 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
276
277 JfrNetworkUtilization::send_events();
278 ASSERT_EQ(3u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(3u)) == 1)>::Compare("3u",
"MockEventNetworkUtilization::committed.size()", 3u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 278, gtest_ar.failure_message()) = ::testing::Message()
;
279 const MockEventNetworkUtilization& eth0_event = MockEventNetworkUtilization::get_committed("eth0");
280 const MockEventNetworkUtilization& eth1_event = MockEventNetworkUtilization::get_committed("eth1");
281 const MockEventNetworkUtilization& ppp0_event = MockEventNetworkUtilization::get_committed("ppp0");
282
283 EXPECT_EQ(40, eth0_event.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(40)) == 1)>::Compare("40",
"eth0_event.readRate", 40, eth0_event.readRate))) ; else ::testing
::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure
, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 283, gtest_ar.failure_message()) = ::testing::Message()
;
284 EXPECT_EQ(0, eth0_event.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "eth0_event.writeRate"
, 0, eth0_event.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 284, gtest_ar.failure_message()) = ::testing::Message()
;
285 EXPECT_STREQ("eth0", eth0_event.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth0\"", "eth0_event.iface.c_str()"
, "eth0", eth0_event.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 285, gtest_ar.failure_message()) = ::testing::Message()
;
286
287 EXPECT_EQ(400, eth1_event.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(400)) == 1)>::Compare("400"
, "eth1_event.readRate", 400, eth1_event.readRate))) ; else ::
testing::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure
, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 287, gtest_ar.failure_message()) = ::testing::Message()
;
288 EXPECT_EQ(0, eth1_event.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "eth1_event.writeRate"
, 0, eth1_event.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 288, gtest_ar.failure_message()) = ::testing::Message()
;
289 EXPECT_STREQ("eth1", eth1_event.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth1\"", "eth1_event.iface.c_str()"
, "eth1", eth1_event.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 289, gtest_ar.failure_message()) = ::testing::Message()
;
290
291 EXPECT_EQ(0, ppp0_event.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "ppp0_event.readRate"
, 0, ppp0_event.readRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 291, gtest_ar.failure_message()) = ::testing::Message()
;
292 EXPECT_EQ(200, ppp0_event.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(200)) == 1)>::Compare("200"
, "ppp0_event.writeRate", 200, ppp0_event.writeRate))) ; else
::testing::internal::AssertHelper(::testing::TestPartResult::
kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 292, gtest_ar.failure_message()) = ::testing::Message()
;
293 EXPECT_STREQ("ppp0", ppp0_event.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"ppp0\"", "ppp0_event.iface.c_str()"
, "ppp0", ppp0_event.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 293, gtest_ar.failure_message()) = ::testing::Message()
;
294}
295
296TEST_VM_F(JfrTestNetworkUtilization, InterfaceRemoved)class JfrTestNetworkUtilization_InterfaceRemoved_vm_Test : public
JfrTestNetworkUtilization { public: JfrTestNetworkUtilization_InterfaceRemoved_vm_Test
() {} private: virtual void TestBody(); static ::testing::TestInfo
* const test_info_ __attribute__ ((unused)); JfrTestNetworkUtilization_InterfaceRemoved_vm_Test
(JfrTestNetworkUtilization_InterfaceRemoved_vm_Test const &
) = delete; void operator=(JfrTestNetworkUtilization_InterfaceRemoved_vm_Test
const &) = delete;};::testing::TestInfo* const JfrTestNetworkUtilization_InterfaceRemoved_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"JfrTestNetworkUtilization", "InterfaceRemoved_vm", __null, __null
, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 296), (::testing::internal::GetTypeId<JfrTestNetworkUtilization
>()), JfrTestNetworkUtilization::SetUpTestCase, JfrTestNetworkUtilization
::TearDownTestCase, new ::testing::internal::TestFactoryImpl<
JfrTestNetworkUtilization_InterfaceRemoved_vm_Test>);void
JfrTestNetworkUtilization_InterfaceRemoved_vm_Test::TestBody
()
{
297 MockNetworkInterface& eth0 = MockJfrOSInterface::add_interface("eth0", ++id);
298 MockNetworkInterface& eth1 = MockJfrOSInterface::add_interface("eth1", ++id);
299 JfrNetworkUtilization::send_events();
300 ASSERT_EQ(0u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0u)) == 1)>::Compare("0u",
"MockEventNetworkUtilization::committed.size()", 0u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 300, gtest_ar.failure_message()) = ::testing::Message()
;
301
302 eth0.bytes_in += 10;
303 eth1.bytes_in += 20;
304 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
305
306 JfrNetworkUtilization::send_events();
307 ASSERT_EQ(2u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(2u)) == 1)>::Compare("2u",
"MockEventNetworkUtilization::committed.size()", 2u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 307, gtest_ar.failure_message()) = ::testing::Message()
;
308 const MockEventNetworkUtilization& eth0_event = MockEventNetworkUtilization::get_committed("eth0");
309 const MockEventNetworkUtilization& eth1_event = MockEventNetworkUtilization::get_committed("eth1");
310
311 EXPECT_EQ(40, eth0_event.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(40)) == 1)>::Compare("40",
"eth0_event.readRate", 40, eth0_event.readRate))) ; else ::testing
::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure
, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 311, gtest_ar.failure_message()) = ::testing::Message()
;
312 EXPECT_EQ(0, eth0_event.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "eth0_event.writeRate"
, 0, eth0_event.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 312, gtest_ar.failure_message()) = ::testing::Message()
;
313 EXPECT_STREQ("eth0", eth0_event.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth0\"", "eth0_event.iface.c_str()"
, "eth0", eth0_event.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 313, gtest_ar.failure_message()) = ::testing::Message()
;
314
315 EXPECT_EQ(80, eth1_event.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(80)) == 1)>::Compare("80",
"eth1_event.readRate", 80, eth1_event.readRate))) ; else ::testing
::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure
, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 315, gtest_ar.failure_message()) = ::testing::Message()
;
316 EXPECT_EQ(0, eth1_event.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "eth1_event.writeRate"
, 0, eth1_event.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 316, gtest_ar.failure_message()) = ::testing::Message()
;
317 EXPECT_STREQ("eth1", eth1_event.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth1\"", "eth1_event.iface.c_str()"
, "eth1", eth1_event.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 317, gtest_ar.failure_message()) = ::testing::Message()
;
318
319 MockJfrOSInterface::remove_interface(eth0);
320 MockEventNetworkUtilization::committed.clear();
321
322 eth1.bytes_in += 10;
323 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
324 JfrNetworkUtilization::send_events();
325 ASSERT_EQ(1u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(1u)) == 1)>::Compare("1u",
"MockEventNetworkUtilization::committed.size()", 1u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 325, gtest_ar.failure_message()) = ::testing::Message()
;
326 const MockEventNetworkUtilization& eth1_event_v2 = MockEventNetworkUtilization::get_committed("eth1");
327
328 EXPECT_EQ(40, eth1_event_v2.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(40)) == 1)>::Compare("40",
"eth1_event_v2.readRate", 40, eth1_event_v2.readRate))) ; else
::testing::internal::AssertHelper(::testing::TestPartResult::
kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 328, gtest_ar.failure_message()) = ::testing::Message()
;
329 EXPECT_EQ(0, eth1_event_v2.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "eth1_event_v2.writeRate"
, 0, eth1_event_v2.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 329, gtest_ar.failure_message()) = ::testing::Message()
;
330 EXPECT_STREQ("eth1", eth1_event_v2.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth1\"", "eth1_event_v2.iface.c_str()"
, "eth1", eth1_event_v2.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 330, gtest_ar.failure_message()) = ::testing::Message()
;
331}
332
333TEST_VM_F(JfrTestNetworkUtilization, InterfaceReset)class JfrTestNetworkUtilization_InterfaceReset_vm_Test : public
JfrTestNetworkUtilization { public: JfrTestNetworkUtilization_InterfaceReset_vm_Test
() {} private: virtual void TestBody(); static ::testing::TestInfo
* const test_info_ __attribute__ ((unused)); JfrTestNetworkUtilization_InterfaceReset_vm_Test
(JfrTestNetworkUtilization_InterfaceReset_vm_Test const &
) = delete; void operator=(JfrTestNetworkUtilization_InterfaceReset_vm_Test
const &) = delete;};::testing::TestInfo* const JfrTestNetworkUtilization_InterfaceReset_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"JfrTestNetworkUtilization", "InterfaceReset_vm", __null, __null
, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 333), (::testing::internal::GetTypeId<JfrTestNetworkUtilization
>()), JfrTestNetworkUtilization::SetUpTestCase, JfrTestNetworkUtilization
::TearDownTestCase, new ::testing::internal::TestFactoryImpl<
JfrTestNetworkUtilization_InterfaceReset_vm_Test>);void JfrTestNetworkUtilization_InterfaceReset_vm_Test
::TestBody()
{
334 MockNetworkInterface& eth0 = MockJfrOSInterface::add_interface("eth0", ++id);
335 JfrNetworkUtilization::send_events();
1
Calling 'JfrNetworkUtilization::send_events'
336 ASSERT_EQ(0u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0u)) == 1)>::Compare("0u",
"MockEventNetworkUtilization::committed.size()", 0u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 336, gtest_ar.failure_message()) = ::testing::Message()
;
337
338 eth0.bytes_in += 10;
339 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
340
341 JfrNetworkUtilization::send_events();
342 ASSERT_EQ(1u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(1u)) == 1)>::Compare("1u",
"MockEventNetworkUtilization::committed.size()", 1u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 342, gtest_ar.failure_message()) = ::testing::Message()
;
343 const MockEventNetworkUtilization& event = MockEventNetworkUtilization::committed[0];
344 EXPECT_EQ(40, event.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(40)) == 1)>::Compare("40",
"event.readRate", 40, event.readRate))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 344, gtest_ar.failure_message()) = ::testing::Message()
;
345 EXPECT_EQ(0, event.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "event.writeRate"
, 0, event.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 345, gtest_ar.failure_message()) = ::testing::Message()
;
346 EXPECT_STREQ("eth0", event.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth0\"", "event.iface.c_str()"
, "eth0", event.iface.c_str()))) ; else ::testing::internal::
AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 346, gtest_ar.failure_message()) = ::testing::Message()
;
347
348 eth0.bytes_in = 0;
349 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
350 MockEventNetworkUtilization::committed.clear();
351
352 JfrNetworkUtilization::send_events();
353 ASSERT_EQ(0u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0u)) == 1)>::Compare("0u",
"MockEventNetworkUtilization::committed.size()", 0u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 353, gtest_ar.failure_message()) = ::testing::Message()
;
354
355 eth0.bytes_in = 10;
356 MockFastUnorderedElapsedCounterSource::current_ticks += 2 * NANOSECS_PER_SEC;
357
358 JfrNetworkUtilization::send_events();
359 ASSERT_EQ(1u, MockEventNetworkUtilization::committed.size())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(1u)) == 1)>::Compare("1u",
"MockEventNetworkUtilization::committed.size()", 1u, MockEventNetworkUtilization
::committed.size()))) ; else return ::testing::internal::AssertHelper
(::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 359, gtest_ar.failure_message()) = ::testing::Message()
;
360 const MockEventNetworkUtilization& event_v2 = MockEventNetworkUtilization::committed[0];
361 EXPECT_EQ(40, event_v2.readRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(40)) == 1)>::Compare("40",
"event_v2.readRate", 40, event_v2.readRate))) ; else ::testing
::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure
, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 361, gtest_ar.failure_message()) = ::testing::Message()
;
362 EXPECT_EQ(0, event_v2.writeRate)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal:: EqHelper<(sizeof(::testing
::internal::IsNullLiteralHelper(0)) == 1)>::Compare("0", "event_v2.writeRate"
, 0, event_v2.writeRate))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 362, gtest_ar.failure_message()) = ::testing::Message()
;
363 EXPECT_STREQ("eth0", event_v2.iface.c_str())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar = (::testing::internal::CmpHelperSTREQ("\"eth0\"", "event_v2.iface.c_str()"
, "eth0", event_v2.iface.c_str()))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/jfr/test_networkUtilization.cpp"
, 363, gtest_ar.failure_message()) = ::testing::Message()
;
364}

/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp

1/*
2 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "logging/log.hpp"
27#include "jfr/jfrEvents.hpp"
28#include "jfr/metadata/jfrSerializer.hpp"
29#include "jfr/periodic/jfrNetworkUtilization.hpp"
30#include "jfr/periodic/jfrOSInterface.hpp"
31#include "jfr/utilities/jfrTime.hpp"
32#include "jfr/utilities/jfrTypes.hpp"
33#include "runtime/os_perf.hpp"
34#include "utilities/globalDefinitions.hpp"
35#include "utilities/growableArray.hpp"
36
37struct InterfaceEntry {
38 char* name;
39 traceid id;
40 uint64_t bytes_in;
41 uint64_t bytes_out;
42 mutable bool written;
43};
44
45static GrowableArray<InterfaceEntry>* _interfaces = NULL__null;
46
47void JfrNetworkUtilization::destroy() {
48 if (_interfaces != NULL__null) {
49 for (int i = 0; i < _interfaces->length(); ++i) {
50 FREE_C_HEAP_ARRAY(char, _interfaces->at(i).name)FreeHeap((char*)(_interfaces->at(i).name));
51 }
52 delete _interfaces;
53 _interfaces = NULL__null;
54 }
55}
56
57static InterfaceEntry& new_entry(const NetworkInterface* iface, GrowableArray<InterfaceEntry>* interfaces) {
58 assert(iface != NULL, "invariant")do { if (!(iface != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp"
, 58, "assert(" "iface != __null" ") failed", "invariant"); ::
breakpoint(); } } while (0)
;
59 assert(interfaces != NULL, "invariant")do { if (!(interfaces != __null)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp"
, 59, "assert(" "interfaces != __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
60
61 // single threaded premise
62 static traceid interface_id = 0;
63
64 const char* name = iface->get_name();
65 assert(name != NULL, "invariant")do { if (!(name != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp"
, 65, "assert(" "name != __null" ") failed", "invariant"); ::
breakpoint(); } } while (0)
;
66
67 InterfaceEntry entry;
68 const size_t length = strlen(name);
69 entry.name = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal)(char*) (AllocateHeap((length + 1) * sizeof(char), mtInternal
))
;
70 strncpy(entry.name, name, length + 1);
71 entry.id = ++interface_id;
72 entry.bytes_in = iface->get_bytes_in();
73 entry.bytes_out = iface->get_bytes_out();
74 entry.written = false;
75 return _interfaces->at(_interfaces->append(entry));
76}
77
78static GrowableArray<InterfaceEntry>* get_interfaces() {
79 if (_interfaces == NULL__null) {
80 _interfaces = new(ResourceObj::C_HEAP, mtTracing) GrowableArray<InterfaceEntry>(10, mtTracing);
81 }
82 return _interfaces;
83}
84
85static InterfaceEntry& get_entry(const NetworkInterface* iface) {
86 // Remember the index we started at last time, since we're most likely looking at them
87 // in the same order every time.
88 static int saved_index = -1;
89
90 GrowableArray<InterfaceEntry>* interfaces = get_interfaces();
91 assert(interfaces != NULL, "invariant")do { if (!(interfaces != __null)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp"
, 91, "assert(" "interfaces != __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
92 for (int i = 0; i < _interfaces->length(); ++i) {
93 saved_index = (saved_index + 1) % _interfaces->length();
94 if (strcmp(_interfaces->at(saved_index).name, iface->get_name()) == 0) {
95 return _interfaces->at(saved_index);
96 }
97 }
98 return new_entry(iface, interfaces);
99}
100
101// If current counters are less than previous we assume the interface has been reset
102// If no bytes have been either sent or received, we'll also skip the event
103static uint64_t rate_per_second(uint64_t current, uint64_t old, const JfrTickspan& interval) {
104 assert(interval.value() > 0, "invariant")do { if (!(interval.value() > 0)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp"
, 104, "assert(" "interval.value() > 0" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
105 if (current <= old) {
106 return 0;
107 }
108 return ((current - old) * NANOSECS_PER_SEC) / interval.nanoseconds();
109}
110
111class JfrNetworkInterfaceName : public JfrSerializer {
112 public:
113 void serialize(JfrCheckpointWriter& writer) {} // we write each constant lazily
114
115 void on_rotation() {
116 for (int i = 0; i < _interfaces->length(); ++i) {
117 const InterfaceEntry& entry = _interfaces->at(i);
118 if (entry.written) {
119 entry.written = false;
120 }
121 }
122 }
123};
124
125static bool register_network_interface_name_serializer() {
126 assert(_interfaces != NULL, "invariant")do { if (!(_interfaces != __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp"
, 126, "assert(" "_interfaces != __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
6
Assuming the condition is true
7
Taking false branch
8
Loop condition is false. Exiting loop
127 return JfrSerializer::register_serializer(TYPE_NETWORKINTERFACENAME,
10
Potential memory leak
128 false, // disallow caching; we want a callback every rotation
129 new JfrNetworkInterfaceName());
9
Memory is allocated
130}
131
132static void write_interface_constant(const InterfaceEntry& entry) {
133 if (entry.written) {
134 return;
135 }
136 JfrCheckpointWriter writer;
137 writer.write_type(TYPE_NETWORKINTERFACENAME);
138 writer.write_count(1);
139 writer.write_key(entry.id);
140 writer.write(entry.name);
141 entry.written = true;
142}
143
144static bool get_interfaces(NetworkInterface** network_interfaces) {
145 const int ret_val = JfrOSInterface::network_utilization(network_interfaces);
146 if (ret_val == OS_ERR) {
147 log_debug(jfr, system)(!(LogImpl<(LogTag::_jfr), (LogTag::_system), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
>::is_level(LogLevel::Debug))) ? (void)0 : LogImpl<(LogTag
::_jfr), (LogTag::_system), (LogTag::__NO_TAG), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel
::Debug>
("Unable to generate network utilization events");
148 return false;
149 }
150 return ret_val != FUNCTIONALITY_NOT_IMPLEMENTED-8;
151}
152
153void JfrNetworkUtilization::send_events() {
154 ResourceMark rm;
155 NetworkInterface* network_interfaces;
156 if (!get_interfaces(&network_interfaces)) {
2
Taking false branch
157 return;
158 }
159 static JfrTicks last_sample_instant;
160 const JfrTicks cur_time = JfrTicks::now();
161 if (cur_time > last_sample_instant) {
3
Taking false branch
162 const JfrTickspan interval = cur_time - last_sample_instant;
163 for (NetworkInterface *cur = network_interfaces; cur != NULL__null; cur = cur->next()) {
164 InterfaceEntry& entry = get_entry(cur);
165 const uint64_t current_bytes_in = cur->get_bytes_in();
166 const uint64_t current_bytes_out = cur->get_bytes_out();
167 const uint64_t read_rate = rate_per_second(current_bytes_in, entry.bytes_in, interval);
168 const uint64_t write_rate = rate_per_second(current_bytes_out, entry.bytes_out, interval);
169 if (read_rate > 0 || write_rate > 0) {
170 write_interface_constant(entry);
171 EventNetworkUtilization event(UNTIMED);
172 event.set_starttime(cur_time);
173 event.set_endtime(cur_time);
174 event.set_networkInterface(entry.id);
175 event.set_readRate(8 * read_rate);
176 event.set_writeRate(8 * write_rate);
177 event.commit();
178 }
179 // update existing entry with new values
180 entry.bytes_in = current_bytes_in;
181 entry.bytes_out = current_bytes_out;
182 }
183 }
184 last_sample_instant = cur_time;
185
186 static bool is_serializer_registered = false;
187 if (!is_serializer_registered
3.1
'is_serializer_registered' is false
3.1
'is_serializer_registered' is false
) {
4
Taking true branch
188 is_serializer_registered = register_network_interface_name_serializer();
5
Calling 'register_network_interface_name_serializer'
189 }
190}