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