src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp
author egahlin
Fri, 17 May 2019 16:02:27 +0200
branchJEP-349-branch
changeset 57360 5d043a159d5c
parent 53013 c8b2a408628b
child 57870 00860d9caf4d
permissions -rw-r--r--
Preview
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     1
/*
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
50879
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;
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
    43
  bool written;
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    44
};
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    45
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    46
static GrowableArray<InterfaceEntry>* _interfaces = NULL;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    47
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    48
void JfrNetworkUtilization::destroy() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    49
  if (_interfaces != NULL) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    50
    for (int i = 0; i < _interfaces->length(); ++i) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    51
      FREE_C_HEAP_ARRAY(char, _interfaces->at(i).name);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    52
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    53
    delete _interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    54
    _interfaces = NULL;
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
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    58
static InterfaceEntry& new_entry(const NetworkInterface* iface, GrowableArray<InterfaceEntry>* interfaces) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    59
  assert(iface != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    60
  assert(interfaces != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    61
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    62
  // single threaded premise
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    63
  static traceid interface_id = 0;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    64
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    65
  const char* name = iface->get_name();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    66
  assert(name != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    67
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    68
  InterfaceEntry entry;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    69
  const size_t length = strlen(name);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    70
  entry.name = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    71
  strncpy(entry.name, name, length + 1);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    72
  entry.id = ++interface_id;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    73
  entry.bytes_in = iface->get_bytes_in();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    74
  entry.bytes_out = iface->get_bytes_out();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    75
  entry.in_use = false;
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
    76
  entry.written = false;
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    77
  return _interfaces->at(_interfaces->append(entry));
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    78
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    79
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    80
static GrowableArray<InterfaceEntry>* get_interfaces() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    81
  if (_interfaces == NULL) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    82
    _interfaces = new(ResourceObj::C_HEAP, mtTracing) GrowableArray<InterfaceEntry>(10, true, mtTracing);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    83
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    84
  return _interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    85
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    86
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    87
static InterfaceEntry& get_entry(const NetworkInterface* iface) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    88
  // 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
    89
  // in the same order every time.
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    90
  static int saved_index = -1;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    91
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    92
  GrowableArray<InterfaceEntry>* interfaces = get_interfaces();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    93
  assert(interfaces != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    94
  for (int i = 0; i < _interfaces->length(); ++i) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    95
    saved_index = (saved_index + 1) % _interfaces->length();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    96
    if (strcmp(_interfaces->at(saved_index).name, iface->get_name()) == 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    97
      return _interfaces->at(saved_index);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    98
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    99
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   100
  return new_entry(iface, interfaces);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   101
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   102
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   103
// 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
   104
// 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
   105
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
   106
  assert(interval.value() > 0, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   107
  if (current <= old) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   108
    return 0;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   109
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   110
  return ((current - old) * NANOSECS_PER_SEC) / interval.nanoseconds();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   111
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   112
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   113
static bool get_interfaces(NetworkInterface** network_interfaces) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   114
  const int ret_val = JfrOSInterface::network_utilization(network_interfaces);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   115
  if (ret_val == OS_ERR) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   116
    log_debug(jfr, system)("Unable to generate network utilization events");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   117
    return false;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   118
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   119
  return ret_val != FUNCTIONALITY_NOT_IMPLEMENTED;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   120
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   121
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   122
static void write_interface_types(JfrCheckpointWriter& writer) {
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   123
    assert(_interfaces != NULL, "invariant");
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   124
  writer.write_type(TYPE_NETWORKINTERFACENAME);
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   125
    const JfrCheckpointContext ctx = writer.context();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   126
    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
   127
    int active_interfaces = 0;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   128
    for (int i = 0; i < _interfaces->length(); ++i) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   129
      InterfaceEntry& entry = _interfaces->at(i);
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   130
    if (entry.in_use && !entry.written) {
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   131
        entry.in_use = false;
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   132
        entry.written = true;
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   133
        writer.write_key(entry.id);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   134
        writer.write(entry.name);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   135
        ++active_interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   136
      }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   137
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   138
    if (active_interfaces == 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   139
      // nothing to write, restore context
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   140
      writer.set_context(ctx);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   141
      return;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   142
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   143
    writer.write_count(active_interfaces, count_offset);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   144
  }
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   145
class JfrNetworkInterfaceName : public JfrSerializer {
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   146
 public:
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   147
   void on_rotation() {
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   148
     for (int i = 0; i < _interfaces->length(); ++i) {
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   149
       InterfaceEntry& entry = _interfaces->at(i);
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   150
       entry.written = false;
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   151
     }
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   152
   }
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   153
};
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   154
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   155
static bool register_network_interface_name_serializer() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   156
  assert(_interfaces != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   157
  return JfrSerializer::register_serializer(TYPE_NETWORKINTERFACENAME,
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   158
                                            false, // disallow caching; we want a callback every rotation
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   159
                                            new JfrNetworkInterfaceName());
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   160
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   161
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   162
void JfrNetworkUtilization::send_events() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   163
  ResourceMark rm;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   164
  NetworkInterface* network_interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   165
  if (!get_interfaces(&network_interfaces)) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   166
    return;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   167
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   168
  log_trace(jfr, event)("Reporting network utilization");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   169
  static JfrTicks last_sample_instant;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   170
  const JfrTicks cur_time = JfrTicks::now();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   171
  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
   172
  last_sample_instant = cur_time;
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   173
  bool write_type = false;
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   174
  for (NetworkInterface *cur = network_interfaces; cur != NULL; cur = cur->next()) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   175
    InterfaceEntry& entry = get_entry(cur);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   176
    if (interval.value() > 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   177
      const uint64_t current_bytes_in = cur->get_bytes_in();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   178
      const uint64_t current_bytes_out = cur->get_bytes_out();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   179
      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
   180
      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
   181
      if (read_rate > 0 || write_rate > 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   182
        entry.in_use = true;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   183
        EventNetworkUtilization event(UNTIMED);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   184
        event.set_starttime(cur_time);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   185
        event.set_endtime(cur_time);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   186
        event.set_networkInterface(entry.id);
53013
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50879
diff changeset
   187
        event.set_readRate(8 * read_rate);
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50879
diff changeset
   188
        event.set_writeRate(8 * write_rate);
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   189
        event.commit();
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   190
        if (!entry.written) {
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   191
          write_type = true;
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   192
        }
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   193
      }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   194
      // update existing entry with new values
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   195
      entry.bytes_in = current_bytes_in;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   196
      entry.bytes_out = current_bytes_out;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   197
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   198
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   199
57360
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   200
  if (write_type) {
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   201
    JfrCheckpointWriter writer(false, true, Thread::current());
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   202
    write_interface_types(writer);
5d043a159d5c Preview
egahlin
parents: 53013
diff changeset
   203
  }
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   204
  static bool is_serializer_registered = false;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   205
  if (!is_serializer_registered) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   206
    is_serializer_registered = register_network_interface_name_serializer();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   207
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   208
}