@@ -61,7 +61,12 @@ PerformanceState::PerformanceState(Isolate* isolate,
6161 offsetof (performance_state_internal, uv_metrics),
6262 3,
6363 root,
64- MAYBE_FIELD_PTR(info, uv_metrics)) {
64+ MAYBE_FIELD_PTR(info, uv_metrics)),
65+ uv_metrics_bigint(isolate,
66+ offsetof (performance_state_internal, uv_metrics_bigint),
67+ 3,
68+ root,
69+ MAYBE_FIELD_PTR(info, uv_metrics_bigint)) {
6570 if (info == nullptr ) {
6671 // For performance states initialized from scratch, reset
6772 // all the milestones and initialize the time origin.
@@ -89,11 +94,15 @@ PerformanceState::SerializeInfo PerformanceState::Serialize(
8994 for (size_t i = 0 ; i < uv_metrics.Length (); ++i) {
9095 uv_metrics[i] = 0 ;
9196 }
97+ for (size_t i = 0 ; i < uv_metrics_bigint.Length (); ++i) {
98+ uv_metrics_bigint[i] = 0 ;
99+ }
92100
93101 SerializeInfo info{root.Serialize (context, creator),
94102 milestones.Serialize (context, creator),
95103 observers.Serialize (context, creator),
96- uv_metrics.Serialize (context, creator)};
104+ uv_metrics.Serialize (context, creator),
105+ uv_metrics_bigint.Serialize (context, creator)};
97106 return info;
98107}
99108
@@ -116,6 +125,7 @@ void PerformanceState::Deserialize(v8::Local<v8::Context> context,
116125 milestones.Deserialize (context);
117126 observers.Deserialize (context);
118127 uv_metrics.Deserialize (context);
128+ uv_metrics_bigint.Deserialize (context);
119129
120130 // Re-initialize the time origin and timestamp i.e. the process start time.
121131 Initialize (time_origin, time_origin_timestamp);
@@ -128,6 +138,7 @@ std::ostream& operator<<(std::ostream& o,
128138 << " " << i.milestones << " , // milestones\n "
129139 << " " << i.observers << " , // observers\n "
130140 << " " << i.uv_metrics << " , // uv_metrics\n "
141+ << " " << i.uv_metrics_bigint << " , // uv_metrics_bigint\n "
131142 << " }" ;
132143 return o;
133144}
@@ -280,12 +291,16 @@ void UvMetricsInfo(const FunctionCallbackInfo<Value>& args) {
280291 uv_metrics_t metrics;
281292 // uv_metrics_info always return 0
282293 CHECK_EQ (uv_metrics_info (env->event_loop (), &metrics), 0 );
283- // libuv reports 64-bit counters. Store them as doubles so that they are
284- // exact up to Number.MAX_SAFE_INTEGER instead of wrapping at 2^31.
285- AliasedFloat64Array& buffer = env->performance_state ()->uv_metrics ;
286- buffer[0 ] = static_cast <double >(metrics.loop_count );
287- buffer[1 ] = static_cast <double >(metrics.events );
288- buffer[2 ] = static_cast <double >(metrics.events_waiting );
294+ // libuv reports 64-bit counters. The doubles backing uvMetricsInfo are
295+ // exact up to Number.MAX_SAFE_INTEGER, while the uint64_t values backing
296+ // uvMetricsInfoBigInt carry the full range.
297+ PerformanceState* state = env->performance_state ();
298+ const uint64_t values[] = {
299+ metrics.loop_count , metrics.events , metrics.events_waiting };
300+ for (size_t i = 0 ; i < arraysize (values); ++i) {
301+ state->uv_metrics [i] = static_cast <double >(values[i]);
302+ state->uv_metrics_bigint [i] = values[i];
303+ }
289304}
290305
291306void CreateELDHistogram (const FunctionCallbackInfo<Value>& args) {
@@ -382,6 +397,11 @@ void CreatePerContextProperties(Local<Object> target,
382397 FIXED_ONE_BYTE_STRING (isolate, " uvMetricsBuffer" ),
383398 state->uv_metrics .GetJSArray ())
384399 .Check ();
400+ target
401+ ->Set (context,
402+ FIXED_ONE_BYTE_STRING (isolate, " uvMetricsBigIntBuffer" ),
403+ state->uv_metrics_bigint .GetJSArray ())
404+ .Check ();
385405
386406 Local<Object> constants = Object::New (isolate);
387407
0 commit comments