MCPcopy Create free account
hub / github.com/CapSoftware/Cap / borrow

Function borrow

apps/desktop/src/utils/shared-frame-buffer.ts:475–569  ·  view source on GitHub ↗
(timeoutMs: number = 100)

Source from the content-addressed store, hash-verified

473 },
474
475 borrow(timeoutMs: number = 100): BorrowedFrame | null {
476 const MAX_CAS_RETRIES = 3;
477
478 for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
479 const shutdownFlag = Atomics.load(controlView, CONTROL_SHUTDOWN);
480 if (shutdownFlag) {
481 return null;
482 }
483
484 const readIdx = Atomics.load(controlView, CONTROL_READ_INDEX);
485 const slotMetaIdx =
486 (metadataOffset + readIdx * METADATA_ENTRY_SIZE) / 4;
487
488 let state = Atomics.load(metadataView, slotMetaIdx + META_SLOT_STATE);
489
490 if (state !== SLOT_STATE.READY) {
491 const waitResult = Atomics.wait(
492 metadataView,
493 slotMetaIdx + META_SLOT_STATE,
494 state,
495 timeoutMs,
496 );
497 if (waitResult === "timed-out") {
498 return null;
499 }
500
501 const shutdownCheck = Atomics.load(controlView, CONTROL_SHUTDOWN);
502 if (shutdownCheck) {
503 return null;
504 }
505
506 state = Atomics.load(metadataView, slotMetaIdx + META_SLOT_STATE);
507 if (state !== SLOT_STATE.READY) {
508 continue;
509 }
510 }
511
512 const exchangedState = Atomics.compareExchange(
513 metadataView,
514 slotMetaIdx + META_SLOT_STATE,
515 SLOT_STATE.READY,
516 SLOT_STATE.READING,
517 );
518 if (exchangedState !== SLOT_STATE.READY) {
519 continue;
520 }
521
522 const frameSize = Atomics.load(
523 metadataView,
524 slotMetaIdx + META_FRAME_SIZE,
525 );
526 const slotDataOffset = dataOffset + readIdx * slotSize;
527
528 if (
529 !Number.isInteger(frameSize) ||
530 frameSize < 0 ||
531 frameSize > slotSize ||
532 slotDataOffset < 0 ||

Callers

nothing calls this directly

Calls 1

advanceReadIndexCASFunction · 0.85

Tested by

no test coverage detected