@@ -324,23 +324,29 @@ template <typename T>
324324StatsBase<T>::StatsBase(
325325 Environment* env,
326326 v8::Local<v8::Object> wrap,
327- int options)
328- : stats_buffer_(
329- env->isolate (),
330- sizeof(typename T::Stats) / sizeof(uint64_t ),
331- reinterpret_cast<uint64_t*>(&stats_)) {
327+ int options) {
332328 static constexpr uint64_t kMax = std::numeric_limits<int64_t >::max ();
333- stats_.created_at = uv_hrtime ();
334329
335- // TODO(@jasnell): The follow are checks instead of handling
336- // the error. Before this code moves out of experimental,
337- // these should be change to properly handle the error.
338-
339- wrap->DefineOwnProperty (
330+ // Create the backing store for the statistics
331+ size_t size = sizeof (Stats);
332+ size_t count = size / sizeof (uint64_t );
333+ stats_store_ = v8::ArrayBuffer::NewBackingStore (env->isolate (), size);
334+ stats_ = new (stats_store_->Data ()) Stats;
335+
336+ DCHECK_NOT_NULL (stats_);
337+ stats_->created_at = uv_hrtime ();
338+
339+ // The stats buffer is exposed as a BigUint64Array on
340+ // the JavaScript side to allow statistics to be monitored.
341+ v8::Local<v8::ArrayBuffer> stats_buffer =
342+ v8::ArrayBuffer::New (env->isolate (), stats_store_);
343+ v8::Local<v8::BigUint64Array> stats_array =
344+ v8::BigUint64Array::New (stats_buffer, 0 , count);
345+ USE (wrap->DefineOwnProperty (
340346 env->context (),
341347 env->stats_string (),
342- stats_buffer_. GetJSArray () ,
343- v8::PropertyAttribute::ReadOnly). Check ( );
348+ stats_array ,
349+ v8::PropertyAttribute::ReadOnly));
344350
345351 if (options & HistogramOptions::ACK) {
346352 ack_ = HistogramBase::New (env, 1 , kMax );
@@ -371,28 +377,28 @@ StatsBase<T>::StatsBase(
371377}
372378
373379template <typename T>
374- void StatsBase<T>::IncrementStat(uint64_t T:: Stats::*member, uint64_t amount) {
380+ void StatsBase<T>::IncrementStat(uint64_t Stats::*member, uint64_t amount) {
375381 static constexpr uint64_t kMax = std::numeric_limits<uint64_t >::max ();
376- stats_. *member += std::min (amount, kMax - stats_. *member);
382+ stats_-> *member += std::min (amount, kMax - stats_-> *member);
377383}
378384
379385template <typename T>
380- void StatsBase<T>::SetStat(uint64_t T:: Stats::*member, uint64_t value) {
381- stats_. *member = value;
386+ void StatsBase<T>::SetStat(uint64_t Stats::*member, uint64_t value) {
387+ stats_-> *member = value;
382388}
383389
384390template <typename T>
385- void StatsBase<T>::RecordTimestamp(uint64_t T:: Stats::*member) {
386- stats_. *member = uv_hrtime ();
391+ void StatsBase<T>::RecordTimestamp(uint64_t Stats::*member) {
392+ stats_-> *member = uv_hrtime ();
387393}
388394
389395template <typename T>
390- uint64_t StatsBase<T>::GetStat(uint64_t T:: Stats::*member) const {
391- return stats_. *member;
396+ uint64_t StatsBase<T>::GetStat(uint64_t Stats::*member) const {
397+ return stats_-> *member;
392398}
393399
394400template <typename T>
395- inline void StatsBase<T>::RecordRate(uint64_t T:: Stats::*member) {
401+ inline void StatsBase<T>::RecordRate(uint64_t Stats::*member) {
396402 CHECK (rate_);
397403 uint64_t received_at = GetStat (member);
398404 uint64_t now = uv_hrtime ();
@@ -408,7 +414,7 @@ inline void StatsBase<T>::RecordSize(uint64_t val) {
408414}
409415
410416template <typename T>
411- inline void StatsBase<T>::RecordAck(uint64_t T:: Stats::*member) {
417+ inline void StatsBase<T>::RecordAck(uint64_t Stats::*member) {
412418 CHECK (ack_);
413419 uint64_t acked_at = GetStat (member);
414420 uint64_t now = uv_hrtime ();
@@ -419,7 +425,7 @@ inline void StatsBase<T>::RecordAck(uint64_t T::Stats::*member) {
419425
420426template <typename T>
421427void StatsBase<T>::StatsMemoryInfo(MemoryTracker* tracker) const {
422- tracker->TrackField (" stats_buffer " , stats_buffer_ );
428+ tracker->TrackField (" stats_store " , stats_store_ );
423429 tracker->TrackField (" rate_histogram" , rate_);
424430 tracker->TrackField (" size_histogram" , size_);
425431 tracker->TrackField (" ack_histogram" , ack_);
@@ -441,7 +447,7 @@ std::string StatsBase<T>::StatsDebug::ToString() const {
441447 out += std::to_string (val);
442448 out += " \n " ;
443449 };
444- add_field (" Duration" , uv_hrtime () - ptr->GetStat (&T:: Stats::created_at));
450+ add_field (" Duration" , uv_hrtime () - ptr->GetStat (&Stats::created_at));
445451 T::ToString (*ptr, add_field);
446452 return out;
447453}
0 commit comments