GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — quic: add aliased struct arenas · nodejs/node@69e48ae

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • lib/internal/quic
    • quic.js
    • state.js
    • stats.js
  • src
    • aliased_struct-inl.h
    • aliased_struct.h
    • quic
      • bindingdata.h
      • session.cc
      • streams.cc
      • streams.h
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎lib/internal/quic/quic.js‎

Copy file name to clipboardExpand all lines: lib/internal/quic/quic.js
+8-4Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,8 +1473,10 @@ class QuicStream {
14731473
this.#handle[kOwner] = this;
14741474
this.#session = session;
14751475
this.#direction = direction;
1476-
this.#stats = new QuicStreamStats(kPrivateConstructor, this.#handle.stats);
1477-
this.#state = new QuicStreamState(kPrivateConstructor, this.#handle.state);
1476+
this.#stats = new QuicStreamStats(
1477+
kPrivateConstructor, this.#handle.stats, this.#handle.statsByteOffset);
1478+
this.#state = new QuicStreamState(
1479+
kPrivateConstructor, this.#handle.state, this.#handle.stateByteOffset);
14781480
this.#reader = this.#handle.getReader();
14791481

14801482
if (hasObserver('quic')) {
@@ -2657,8 +2659,10 @@ class QuicSession {
26572659
this.#pendingQlog = handle._pendingQlog;
26582660
handle._pendingQlog = undefined;
26592661
}
2660-
this.#stats = new QuicSessionStats(kPrivateConstructor, handle.stats);
2661-
this.#state = new QuicSessionState(kPrivateConstructor, handle.state);
2662+
this.#stats = new QuicSessionStats(
2663+
kPrivateConstructor, handle.stats, handle.statsByteOffset);
2664+
this.#state = new QuicSessionState(
2665+
kPrivateConstructor, handle.state, handle.stateByteOffset);
26622666

26632667
if (hasObserver('quic')) {
26642668
startPerf(this, kPerfEntry, { type: 'quic', name: 'QuicSession' });
Collapse file

‎lib/internal/quic/state.js‎

Copy file name to clipboardExpand all lines: lib/internal/quic/state.js
+67-53Lines changed: 67 additions & 53 deletions
Large diffs are not rendered by default.
Collapse file

‎lib/internal/quic/stats.js‎

Copy file name to clipboardExpand all lines: lib/internal/quic/stats.js
+78-57Lines changed: 78 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -332,163 +332,168 @@ class QuicSessionStats {
332332
* @param {symbol} privateSymbol
333333
* @param {ArrayBuffer} buffer
334334
*/
335-
constructor(privateSymbol, buffer) {
335+
/** @type {number} */
336+
#offset = 0;
337+
338+
constructor(privateSymbol, view, byteOffset = 0) {
336339
// We use the kPrivateConstructor symbol to restrict the ability to
337340
// create new instances of QuicSessionStats to internal code.
338341
if (privateSymbol !== kPrivateConstructor) {
339342
throw new ERR_ILLEGAL_CONSTRUCTOR();
340343
}
341-
if (!isArrayBuffer(buffer)) {
342-
throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer);
344+
if (isArrayBuffer(view)) {
345+
this.#handle = new BigUint64Array(view);
346+
} else {
347+
this.#handle = view;
343348
}
344-
this.#handle = new BigUint64Array(buffer);
349+
this.#offset = byteOffset / 8;
345350
}
346351

347352
/** @type {bigint} */
348353
get createdAt() {
349-
return this.#handle[IDX_STATS_SESSION_CREATED_AT];
354+
return this.#handle[this.#offset + IDX_STATS_SESSION_CREATED_AT];
350355
}
351356

352357
/** @type {bigint} */
353358
get destroyedAt() {
354-
return this.#handle[IDX_STATS_SESSION_DESTROYED_AT];
359+
return this.#handle[this.#offset + IDX_STATS_SESSION_DESTROYED_AT];
355360
}
356361

357362
/** @type {bigint} */
358363
get closingAt() {
359-
return this.#handle[IDX_STATS_SESSION_CLOSING_AT];
364+
return this.#handle[this.#offset + IDX_STATS_SESSION_CLOSING_AT];
360365
}
361366

362367
/** @type {bigint} */
363368
get handshakeCompletedAt() {
364-
return this.#handle[IDX_STATS_SESSION_HANDSHAKE_COMPLETED_AT];
369+
return this.#handle[this.#offset + IDX_STATS_SESSION_HANDSHAKE_COMPLETED_AT];
365370
}
366371

367372
/** @type {bigint} */
368373
get handshakeConfirmedAt() {
369-
return this.#handle[IDX_STATS_SESSION_HANDSHAKE_CONFIRMED_AT];
374+
return this.#handle[this.#offset + IDX_STATS_SESSION_HANDSHAKE_CONFIRMED_AT];
370375
}
371376

372377
/** @type {bigint} */
373378
get bytesReceived() {
374-
return this.#handle[IDX_STATS_SESSION_BYTES_RECEIVED];
379+
return this.#handle[this.#offset + IDX_STATS_SESSION_BYTES_RECEIVED];
375380
}
376381

377382
/** @type {bigint} */
378383
get bidiInStreamCount() {
379-
return this.#handle[IDX_STATS_SESSION_BIDI_IN_STREAM_COUNT];
384+
return this.#handle[this.#offset + IDX_STATS_SESSION_BIDI_IN_STREAM_COUNT];
380385
}
381386

382387
/** @type {bigint} */
383388
get bidiOutStreamCount() {
384-
return this.#handle[IDX_STATS_SESSION_BIDI_OUT_STREAM_COUNT];
389+
return this.#handle[this.#offset + IDX_STATS_SESSION_BIDI_OUT_STREAM_COUNT];
385390
}
386391

387392
/** @type {bigint} */
388393
get uniInStreamCount() {
389-
return this.#handle[IDX_STATS_SESSION_UNI_IN_STREAM_COUNT];
394+
return this.#handle[this.#offset + IDX_STATS_SESSION_UNI_IN_STREAM_COUNT];
390395
}
391396

392397
/** @type {bigint} */
393398
get uniOutStreamCount() {
394-
return this.#handle[IDX_STATS_SESSION_UNI_OUT_STREAM_COUNT];
399+
return this.#handle[this.#offset + IDX_STATS_SESSION_UNI_OUT_STREAM_COUNT];
395400
}
396401

397402
/** @type {bigint} */
398403
get maxBytesInFlight() {
399-
return this.#handle[IDX_STATS_SESSION_MAX_BYTES_IN_FLIGHT];
404+
return this.#handle[this.#offset + IDX_STATS_SESSION_MAX_BYTES_IN_FLIGHT];
400405
}
401406

402407
/** @type {bigint} */
403408
get bytesInFlight() {
404-
return this.#handle[IDX_STATS_SESSION_BYTES_IN_FLIGHT];
409+
return this.#handle[this.#offset + IDX_STATS_SESSION_BYTES_IN_FLIGHT];
405410
}
406411

407412
/** @type {bigint} */
408413
get blockCount() {
409-
return this.#handle[IDX_STATS_SESSION_BLOCK_COUNT];
414+
return this.#handle[this.#offset + IDX_STATS_SESSION_BLOCK_COUNT];
410415
}
411416

412417
/** @type {bigint} */
413418
get cwnd() {
414-
return this.#handle[IDX_STATS_SESSION_CWND];
419+
return this.#handle[this.#offset + IDX_STATS_SESSION_CWND];
415420
}
416421

417422
/** @type {bigint} */
418423
get latestRtt() {
419-
return this.#handle[IDX_STATS_SESSION_LATEST_RTT];
424+
return this.#handle[this.#offset + IDX_STATS_SESSION_LATEST_RTT];
420425
}
421426

422427
/** @type {bigint} */
423428
get minRtt() {
424-
return this.#handle[IDX_STATS_SESSION_MIN_RTT];
429+
return this.#handle[this.#offset + IDX_STATS_SESSION_MIN_RTT];
425430
}
426431

427432
/** @type {bigint} */
428433
get rttVar() {
429-
return this.#handle[IDX_STATS_SESSION_RTTVAR];
434+
return this.#handle[this.#offset + IDX_STATS_SESSION_RTTVAR];
430435
}
431436

432437
/** @type {bigint} */
433438
get smoothedRtt() {
434-
return this.#handle[IDX_STATS_SESSION_SMOOTHED_RTT];
439+
return this.#handle[this.#offset + IDX_STATS_SESSION_SMOOTHED_RTT];
435440
}
436441

437442
/** @type {bigint} */
438443
get ssthresh() {
439-
return this.#handle[IDX_STATS_SESSION_SSTHRESH];
444+
return this.#handle[this.#offset + IDX_STATS_SESSION_SSTHRESH];
440445
}
441446

442447
get pktSent() {
443-
return this.#handle[IDX_STATS_SESSION_PKT_SENT];
448+
return this.#handle[this.#offset + IDX_STATS_SESSION_PKT_SENT];
444449
}
445450

446451
get bytesSent() {
447-
return this.#handle[IDX_STATS_SESSION_BYTES_SENT];
452+
return this.#handle[this.#offset + IDX_STATS_SESSION_BYTES_SENT];
448453
}
449454

450455
get pktRecv() {
451-
return this.#handle[IDX_STATS_SESSION_PKT_RECV];
456+
return this.#handle[this.#offset + IDX_STATS_SESSION_PKT_RECV];
452457
}
453458

454459
get bytesRecv() {
455-
return this.#handle[IDX_STATS_SESSION_BYTES_RECV];
460+
return this.#handle[this.#offset + IDX_STATS_SESSION_BYTES_RECV];
456461
}
457462

458463
get pktLost() {
459-
return this.#handle[IDX_STATS_SESSION_PKT_LOST];
464+
return this.#handle[this.#offset + IDX_STATS_SESSION_PKT_LOST];
460465
}
461466

462467
get bytesLost() {
463-
return this.#handle[IDX_STATS_SESSION_BYTES_LOST];
468+
return this.#handle[this.#offset + IDX_STATS_SESSION_BYTES_LOST];
464469
}
465470

466471
get pingRecv() {
467-
return this.#handle[IDX_STATS_SESSION_PING_RECV];
472+
return this.#handle[this.#offset + IDX_STATS_SESSION_PING_RECV];
468473
}
469474

470475
get pktDiscarded() {
471-
return this.#handle[IDX_STATS_SESSION_PKT_DISCARDED];
476+
return this.#handle[this.#offset + IDX_STATS_SESSION_PKT_DISCARDED];
472477
}
473478

474479
/** @type {bigint} */
475480
get datagramsReceived() {
476-
return this.#handle[IDX_STATS_SESSION_DATAGRAMS_RECEIVED];
481+
return this.#handle[this.#offset + IDX_STATS_SESSION_DATAGRAMS_RECEIVED];
477482
}
478483

479484
/** @type {bigint} */
480485
get datagramsSent() {
481-
return this.#handle[IDX_STATS_SESSION_DATAGRAMS_SENT];
486+
return this.#handle[this.#offset + IDX_STATS_SESSION_DATAGRAMS_SENT];
482487
}
483488

484489
/** @type {bigint} */
485490
get datagramsAcknowledged() {
486-
return this.#handle[IDX_STATS_SESSION_DATAGRAMS_ACKNOWLEDGED];
491+
return this.#handle[this.#offset + IDX_STATS_SESSION_DATAGRAMS_ACKNOWLEDGED];
487492
}
488493

489494
/** @type {bigint} */
490495
get datagramsLost() {
491-
return this.#handle[IDX_STATS_SESSION_DATAGRAMS_LOST];
496+
return this.#handle[this.#offset + IDX_STATS_SESSION_DATAGRAMS_LOST];
492497
}
493498

494499
toString() {
@@ -590,88 +595,99 @@ class QuicSessionStats {
590595
}
591596

592597
[kFinishClose]() {
593-
// Snapshot the stats into a new BigUint64Array since the underlying
594-
// buffer will be destroyed.
595-
this.#handle = new BigUint64Array(this.#handle);
598+
// Snapshot this session's stats slice into a standalone BigUint64Array.
599+
const count = IDX_STATS_SESSION_DATAGRAMS_LOST + 1;
600+
const snapshot = new BigUint64Array(count);
601+
for (let i = 0; i < count; i++) {
602+
snapshot[i] = this.#handle[this.#offset + i];
603+
}
604+
this.#handle = snapshot;
605+
this.#offset = 0;
596606
this.#disconnected = true;
597607
}
598608
}
599609

600610
class QuicStreamStats {
601611
/** @type {BigUint64Array} */
602612
#handle;
613+
/** @type {number} */
614+
#offset = 0;
603615
/** type {boolean} */
604616
#disconnected = false;
605617

606618
/**
607619
* @param {symbol} privateSymbol
608-
* @param {ArrayBuffer} buffer
620+
* @param {BigUint64Array|ArrayBuffer} view
621+
* @param {number} [byteOffset] - byte offset into the shared page view
609622
*/
610-
constructor(privateSymbol, buffer) {
623+
constructor(privateSymbol, view, byteOffset = 0) {
611624
// We use the kPrivateConstructor symbol to restrict the ability to
612625
// create new instances of QuicStreamStats to internal code.
613626
if (privateSymbol !== kPrivateConstructor) {
614627
throw new ERR_ILLEGAL_CONSTRUCTOR();
615628
}
616-
if (!isArrayBuffer(buffer)) {
617-
throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer);
629+
if (isArrayBuffer(view)) {
630+
this.#handle = new BigUint64Array(view);
631+
} else {
632+
this.#handle = view;
618633
}
619-
this.#handle = new BigUint64Array(buffer);
634+
// Convert byte offset to element offset (8 bytes per uint64).
635+
this.#offset = byteOffset / 8;
620636
}
621637

622638
/** @type {bigint} */
623639
get createdAt() {
624-
return this.#handle[IDX_STATS_STREAM_CREATED_AT];
640+
return this.#handle[this.#offset + IDX_STATS_STREAM_CREATED_AT];
625641
}
626642

627643
/** @type {bigint} */
628644
get openedAt() {
629-
return this.#handle[IDX_STATS_STREAM_OPENED_AT];
645+
return this.#handle[this.#offset + IDX_STATS_STREAM_OPENED_AT];
630646
}
631647

632648
/** @type {bigint} */
633649
get receivedAt() {
634-
return this.#handle[IDX_STATS_STREAM_RECEIVED_AT];
650+
return this.#handle[this.#offset + IDX_STATS_STREAM_RECEIVED_AT];
635651
}
636652

637653
/** @type {bigint} */
638654
get ackedAt() {
639-
return this.#handle[IDX_STATS_STREAM_ACKED_AT];
655+
return this.#handle[this.#offset + IDX_STATS_STREAM_ACKED_AT];
640656
}
641657

642658
/** @type {bigint} */
643659
get destroyedAt() {
644-
return this.#handle[IDX_STATS_STREAM_DESTROYED_AT];
660+
return this.#handle[this.#offset + IDX_STATS_STREAM_DESTROYED_AT];
645661
}
646662

647663
/** @type {bigint} */
648664
get bytesReceived() {
649-
return this.#handle[IDX_STATS_STREAM_BYTES_RECEIVED];
665+
return this.#handle[this.#offset + IDX_STATS_STREAM_BYTES_RECEIVED];
650666
}
651667

652668
/** @type {bigint} */
653669
get bytesSent() {
654-
return this.#handle[IDX_STATS_STREAM_BYTES_SENT];
670+
return this.#handle[this.#offset + IDX_STATS_STREAM_BYTES_SENT];
655671
}
656672

657673
/** @type {bigint} */
658674
get maxOffset() {
659-
return this.#handle[IDX_STATS_STREAM_MAX_OFFSET];
675+
return this.#handle[this.#offset + IDX_STATS_STREAM_MAX_OFFSET];
660676
}
661677

662678
/** @type {bigint} */
663679
get maxOffsetAcknowledged() {
664-
return this.#handle[IDX_STATS_STREAM_MAX_OFFSET_ACK];
680+
return this.#handle[this.#offset + IDX_STATS_STREAM_MAX_OFFSET_ACK];
665681
}
666682

667683
/** @type {bigint} */
668684
get maxOffsetReceived() {
669-
return this.#handle[IDX_STATS_STREAM_MAX_OFFSET_RECV];
685+
return this.#handle[this.#offset + IDX_STATS_STREAM_MAX_OFFSET_RECV];
670686
}
671687

672688
/** @type {bigint} */
673689
get finalSize() {
674-
return this.#handle[IDX_STATS_STREAM_FINAL_SIZE];
690+
return this.#handle[this.#offset + IDX_STATS_STREAM_FINAL_SIZE];
675691
}
676692

677693
toString() {
@@ -735,9 +751,14 @@ class QuicStreamStats {
735751
}
736752

737753
[kFinishClose]() {
738-
// Snapshot the stats into a new BigUint64Array since the underlying
739-
// buffer will be destroyed.
740-
this.#handle = new BigUint64Array(this.#handle);
754+
// Snapshot this stream's stats slice into a standalone BigUint64Array.
755+
const count = IDX_STATS_STREAM_FINAL_SIZE + 1;
756+
const snapshot = new BigUint64Array(count);
757+
for (let i = 0; i < count; i++) {
758+
snapshot[i] = this.#handle[this.#offset + i];
759+
}
760+
this.#handle = snapshot;
761+
this.#offset = 0;
741762
this.#disconnected = true;
742763
}
743764
}

0 commit comments

Comments
0 (0)
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.