@@ -515,35 +515,35 @@ void Http2Stream::EmitStatistics() {
515
515
Http2StreamPerformanceEntry* entry =
516
516
new Http2StreamPerformanceEntry (env (), id_, statistics_);
517
517
env ()->SetImmediate ([](Environment* env, void * data) {
518
- Http2StreamPerformanceEntry* entry =
519
- static_cast <Http2StreamPerformanceEntry*>(data);
520
- if (HasHttp2Observer (env)) {
521
- AliasedBuffer<double , v8::Float64Array>& buffer =
522
- env->http2_state ()->stream_stats_buffer ;
523
- buffer[IDX_STREAM_STATS_ID] = entry->id ();
524
- if (entry->first_byte () != 0 ) {
525
- buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTE] =
526
- (entry->first_byte () - entry->startTimeNano ()) / 1e6 ;
527
- } else {
528
- buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTE] = 0 ;
529
- }
530
- if (entry->first_header () != 0 ) {
531
- buffer[IDX_STREAM_STATS_TIMETOFIRSTHEADER] =
532
- (entry->first_header () - entry->startTimeNano ()) / 1e6 ;
533
- } else {
534
- buffer[IDX_STREAM_STATS_TIMETOFIRSTHEADER] = 0 ;
535
- }
536
- if (entry->first_byte_sent () != 0 ) {
537
- buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTESENT] =
538
- (entry->first_byte_sent () - entry->startTimeNano ()) / 1e6 ;
539
- } else {
540
- buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTESENT] = 0 ;
541
- }
542
- buffer[IDX_STREAM_STATS_SENTBYTES] = entry->sent_bytes ();
543
- buffer[IDX_STREAM_STATS_RECEIVEDBYTES] = entry->received_bytes ();
544
- entry->Notify (entry->ToObject ());
518
+ // This takes ownership, the entr is destroyed at the end of this scope.
519
+ std::unique_ptr<Http2StreamPerformanceEntry> entry {
520
+ static_cast <Http2StreamPerformanceEntry*>(data) };
521
+ if (!HasHttp2Observer (env))
522
+ return ;
523
+ AliasedBuffer<double , v8::Float64Array>& buffer =
524
+ env->http2_state ()->stream_stats_buffer ;
525
+ buffer[IDX_STREAM_STATS_ID] = entry->id ();
526
+ if (entry->first_byte () != 0 ) {
527
+ buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTE] =
528
+ (entry->first_byte () - entry->startTimeNano ()) / 1e6 ;
529
+ } else {
530
+ buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTE] = 0 ;
545
531
}
546
- delete entry;
532
+ if (entry->first_header () != 0 ) {
533
+ buffer[IDX_STREAM_STATS_TIMETOFIRSTHEADER] =
534
+ (entry->first_header () - entry->startTimeNano ()) / 1e6 ;
535
+ } else {
536
+ buffer[IDX_STREAM_STATS_TIMETOFIRSTHEADER] = 0 ;
537
+ }
538
+ if (entry->first_byte_sent () != 0 ) {
539
+ buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTESENT] =
540
+ (entry->first_byte_sent () - entry->startTimeNano ()) / 1e6 ;
541
+ } else {
542
+ buffer[IDX_STREAM_STATS_TIMETOFIRSTBYTESENT] = 0 ;
543
+ }
544
+ buffer[IDX_STREAM_STATS_SENTBYTES] = entry->sent_bytes ();
545
+ buffer[IDX_STREAM_STATS_RECEIVEDBYTES] = entry->received_bytes ();
546
+ entry->Notify (entry->ToObject ());
547
547
}, static_cast <void *>(entry));
548
548
}
549
549
@@ -553,25 +553,25 @@ void Http2Session::EmitStatistics() {
553
553
Http2SessionPerformanceEntry* entry =
554
554
new Http2SessionPerformanceEntry (env (), statistics_, session_type_);
555
555
env ()->SetImmediate ([](Environment* env, void * data) {
556
- Http2SessionPerformanceEntry* entry =
557
- static_cast <Http2SessionPerformanceEntry*>(data);
558
- if ( HasHttp2Observer (env)) {
559
- AliasedBuffer< double , v8::Float64Array>& buffer =
560
- env-> http2_state ()-> session_stats_buffer ;
561
- buffer[IDX_SESSION_STATS_TYPE] = entry-> type ();
562
- buffer[IDX_SESSION_STATS_PINGRTT] = entry-> ping_rtt () / 1e6 ;
563
- buffer[IDX_SESSION_STATS_FRAMESRECEIVED ] = entry->frame_count ();
564
- buffer[IDX_SESSION_STATS_FRAMESSENT ] = entry->frame_sent () ;
565
- buffer[IDX_SESSION_STATS_STREAMCOUNT ] = entry->stream_count ();
566
- buffer[IDX_SESSION_STATS_STREAMAVERAGEDURATION ] =
567
- entry->stream_average_duration ();
568
- buffer[IDX_SESSION_STATS_DATA_SENT ] = entry-> data_sent ();
569
- buffer[IDX_SESSION_STATS_DATA_RECEIVED] = entry->data_received ();
570
- buffer[IDX_SESSION_STATS_MAX_CONCURRENT_STREAMS ] =
571
- entry->max_concurrent_streams ();
572
- entry-> Notify (entry-> ToObject ());
573
- }
574
- delete entry;
556
+ // This takes ownership, the entr is destroyed at the end of this scope.
557
+ std::unique_ptr <Http2SessionPerformanceEntry> entry {
558
+ static_cast <Http2SessionPerformanceEntry*>(data) };
559
+ if (! HasHttp2Observer (env))
560
+ return ;
561
+ AliasedBuffer< double , v8::Float64Array>& buffer =
562
+ env-> http2_state ()-> session_stats_buffer ;
563
+ buffer[IDX_SESSION_STATS_TYPE ] = entry->type ();
564
+ buffer[IDX_SESSION_STATS_PINGRTT ] = entry->ping_rtt () / 1e6 ;
565
+ buffer[IDX_SESSION_STATS_FRAMESRECEIVED ] = entry->frame_count ();
566
+ buffer[IDX_SESSION_STATS_FRAMESSENT ] = entry-> frame_sent ();
567
+ buffer[IDX_SESSION_STATS_STREAMCOUNT] = entry->stream_count ();
568
+ buffer[IDX_SESSION_STATS_STREAMAVERAGEDURATION ] =
569
+ entry->stream_average_duration ();
570
+ buffer[IDX_SESSION_STATS_DATA_SENT ] = entry-> data_sent ();
571
+ buffer[IDX_SESSION_STATS_DATA_RECEIVED] = entry->data_received ();
572
+ buffer[IDX_SESSION_STATS_MAX_CONCURRENT_STREAMS] =
573
+ entry-> max_concurrent_streams ();
574
+ entry-> Notify (entry-> ToObject ()) ;
575
575
}, static_cast <void *>(entry));
576
576
}
577
577
@@ -1379,6 +1379,7 @@ void Http2Session::MaybeScheduleWrite() {
1379
1379
1380
1380
// Sending data may call arbitrary JS code, so keep track of
1381
1381
// async context.
1382
+ HandleScope handle_scope (env->isolate ());
1382
1383
InternalCallbackScope callback_scope (session);
1383
1384
session->SendPendingData ();
1384
1385
}, static_cast <void *>(this ), object ());
0 commit comments