robobun
e7672b2d04
Add string fast path for postMessage and structuredClone ( #21926 )
...
## Summary
Implements a string fast path optimization for `postMessage` and
`structuredClone` operations that provides significant performance
improvements for string-only data transfer, along with various bug fixes
and infrastructure improvements.
## Key Performance Improvements
**postMessage with Workers:**
- **Small strings (11 chars):** ~5% faster (572ns vs 599ns)
- **Medium strings (14KB):** **~2.7x faster** (528ns vs 1.40μs)
- **Large strings (3MB):** **~660x faster** (540ns vs 356μs)
**Compared to Node.js postMessage:**
- Similar performance for small strings
- Competitive for medium strings
- **~455x faster** for large strings (540ns vs 245μs)
## Implementation Details
The optimization adds a **string fast path** that bypasses full
structured cloning serialization when:
- Input is a pure string (`value.isString()`)
- No transfer list or message ports are involved
- Not being stored persistently
### Core Changes
**String Thread-Safety Utilities (`BunString.cpp/h`):**
- `isCrossThreadShareable()` - Checks if string can be safely shared
across threads
- `toCrossThreadShareable()` - Converts strings to thread-safe form via
`isolatedCopy()`
- Handles edge cases: atoms, symbols, substring slices, external buffers
**Serialization Fast Path (`SerializedScriptValue.cpp`):**
- New `m_fastPathString` field stores string data directly
- Bypasses full object serialization machinery for pure strings
- Creates isolated copies for cross-thread safety
**Deserialization Fast Path:**
- Directly returns JSString from stored string data
- Avoids parsing serialized byte streams
**Updated Flags System (`JSValue.zig`, `Serialization.cpp`):**
- Replaces boolean `forTransfer` with structured `SerializedFlags`
- Supports `forCrossProcessTransfer` and `forStorage` distinctions
**Structured Clone Infrastructure:**
- Moved `structuredClone` implementation to dedicated
`StructuredClone.cpp`
- Added `jsFunctionStructuredCloneAdvanced` for testing with custom
flags
- Improved class serialization compatibility checks (`isForTransfer`,
`isForStorage`)
**IPC Improvements (`ipc.zig`):**
- Fixed race conditions in `SendQueue` by deferring cleanup to next tick
- Proper fd ownership handling with `bun.take()`
- Cached IPC serialize/parse functions for better performance
**BlockList Thread Safety Fixes (`BlockList.zig`):**
- Fixed potential deadlocks by moving mutex locking inside methods
- Added atomic `estimated_size` counter to avoid lock during GC
- Corrected pointer handling in comparison functions
- Improved GC safety in `rules()` method
## Benchmark Results
```
❯ bun-21926 bench/string-postmessage.mjs # This branch
postMessage(11 chars string) 572.24 ns/iter
postMessage(14 KB string) 527.55 ns/iter ← ~2.7x faster
postMessage(3 MB string) 539.70 ns/iter ← ~660x faster
❯ bun-1.2.20 bench/string-postmessage.mjs # Previous
postMessage(11 chars string) 598.76 ns/iter
postMessage(14 KB string) 1.40 µs/iter
postMessage(3 MB string) 356.38 µs/iter
❯ node bench/string-postmessage.mjs # Node.js comparison
postMessage(11 chars string) 569.63 ns/iter
postMessage(14 KB string) 1.46 µs/iter
postMessage(3 MB string) 245.46 µs/iter
```
**Key insight:** The fast path achieves **constant time performance**
regardless of string size (~540ns), while traditional serialization
scales linearly with data size.
## Test Coverage
**New Tests:**
- `test/js/web/structured-clone-fastpath.test.ts` - Fast path memory
usage validation
- `test/js/web/workers/structuredClone-classes.test.ts` - Comprehensive
class serialization tests
- Tests ArrayBuffer transferability
- Tests BunFile cloning with storage/transfer restrictions
- Tests net.BlockList cloning behavior
- Validates different serialization contexts (default, worker, window)
**Enhanced Tests:**
- `test/js/web/workers/structured-clone.test.ts` - Multi-function
testing
- Tests `structuredClone`, `jscSerializeRoundtrip`, and cross-process
serialization
- Validates consistency across different serialization paths
- `test/js/node/cluster.test.ts` - Better error handling and debugging
**Benchmarks:**
- `bench/string-postmessage.mjs` - Worker postMessage performance
comparison
- `bench/string-fastpath.mjs` - Fast path vs traditional serialization
comparison
## Bug Fixes
**BlockList Threading Issues:**
- Fixed potential deadlocks when multiple threads access BlockList
simultaneously
- Moved mutex locks inside methods rather than holding across entire
function calls
- Added atomic size tracking for GC compatibility
- Fixed comparison function pointer handling
**IPC Race Conditions:**
- Fixed race condition where `SendQueue._onAfterIPCClosed()` could be
called on wrong thread
- Deferred cleanup operations to next tick using task queue
- Improved file descriptor ownership with proper `bun.take()` usage
**Structured Clone Compatibility:**
- Enhanced class serialization with proper transfer/storage mode
checking
- Fixed edge cases where non-transferable objects were incorrectly
handled
- Added better error reporting for unsupported clone operations
## Technical Notes
- Thread safety ensured via `String.isolatedCopy()` for cross-VM
transfers
- Memory cost calculation updated to account for string references
- Maintains full compatibility with existing structured clone semantics
- Does not affect object serialization or transfer lists
- Proper cleanup and error handling throughout IPC pipeline
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Meghan Denny <meghan@bun.sh >
2025-08-20 00:25:00 -07:00
190n
6090833da6
deflake worker.test.ts ( #19634 )
2025-05-14 18:58:24 -07:00
190n
cd8d037c79
pass test-worker-message-event.js ( #19614 )
...
Co-authored-by: 190n <7763597+190n@users.noreply.github.com >
2025-05-14 18:56:14 -07:00
190n
a182c313e2
pass test-worker-nested-uncaught.js ( #19509 )
2025-05-12 14:10:18 -07:00
190n
b5f31a6ee2
node:worker_threads: improve error messages, support environmentData, emit worker event ( #18768 )
...
Co-authored-by: 190n <7763597+190n@users.noreply.github.com >
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2025-05-08 19:27:46 -07:00
Meghan Denny
9e201eff9e
node:net: implement BlockList ( #19277 )
2025-05-01 16:09:44 -07:00
Meghan Denny
2a2247bbb6
js: fix serialization of non-transferable objects ( #19351 )
2025-04-29 18:23:26 -07:00
Jarred Sumner
376b1b4f97
Support preload option in Worker ( #15045 )
2024-11-07 21:30:51 -08:00
Jarred Sumner
cd6785771e
run prettier and add back format action ( #13722 )
2024-09-03 21:32:52 -07:00
Andrew Johnston
483af7c33c
fix (worker-eval): fail worker with source when eval = false ( #13062 )
...
Co-authored-by: Andrew Johnston <andrew@bun.sh >
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-08-03 23:49:36 -07:00
Ciro Spaciari
1c648063fa
fix(tls/socket/fetch) shutdown fix + ref counted context ( #12925 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-07-30 22:41:54 -07:00
Jarred Sumner
5f1b569c52
Fix crash when creating a new Worker with a numeric environment varia… ( #12810 )
2024-07-25 18:10:57 -07:00
Ashcon Partovi
d105b048b1
Use Buildkite for CI ( #11477 )
2024-06-27 14:56:07 -07:00
Dylan Conway
5b48bb1d5d
Fix cloning File with structuredClone ( #11766 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-06-10 19:35:09 -07:00
Jarred Sumner
6a756bf979
Implement blob: URLs in fetch, import, and Worker ( #11537 )
...
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com >
Co-authored-by: dave caruso <me@paperdave.net >
2024-06-05 18:49:03 -07:00
Meghan Denny
d0d4d8bf85
windows: enable more passing tests ( #8711 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-02-06 16:08:49 -08:00
Ashcon Partovi
264142e756
Add isWindows and related helpers to test harness
2024-02-05 12:47:52 -08:00
dave caruso
647b15e4f3
fix(windows): initialize uv allocators earlier ( #8631 )
...
* uv loop is thread local
* hi
* stuff so far
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-02-02 00:18:28 -08:00
Meghan Denny
3a7df3f6c7
windows: add more passing test ( #8615 )
2024-02-01 13:45:47 -08:00
dave caruso
072f2f15ea
ci: run windows tests and also run them concurrently ( #7758 )
2024-01-12 17:02:20 -08:00
Otger Rogla
2946bacbbd
feat(worker_threads) support argv and execArgv options ( #7962 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-01-03 14:23:39 -08:00
Jérôme Benoit
6a5995e27d
test(worker): refactor worker tests ( #6732 )
...
* test(worker): refactor worker tests
+ constify variables
+ typing
+ untangle web worker from worker_threads tests
+ cleanup variables namespace
no functional changes on tests
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: move worker_threads related code to node/worker_threads
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: move worker tests into workers directory
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* refactor: report upstream changes
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* refactor: report upstream change
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* fix: address review comments
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* chore: fix submodule
---------
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
Co-authored-by: dave caruso <me@paperdave.net >
2023-12-06 17:06:11 -08:00
Jérôme Benoit
85a0d71c52
fix(worker_threads): off by one on threadId ( #6671 )
...
* fix(worker_threads): off by one on threadId
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: refine worker_threads threadId consistency test
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: improve worker_threads tests
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: fix worker_threads threadId consistency test
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: simplify worker_threads threadId consistency test
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: refine worker_threads threadId consistency test
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org >
* refactor: cleanup import on worker_threads tests
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: switch worker_threads worker to TS
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: revert wrong refactoring
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: format
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: port worker_threads worker to ESM
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: cleanup worker_threads test
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
* test: improve worker_threads coverage
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org >
---------
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com >
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org >
2023-10-24 17:05:22 -07:00
Dylan Conway
6c40d6f2f5
add BroadcastChannel ( #3922 )
...
* copy and format
* update `SerializedScriptValue.cpp`
* use `expect().fail()` in message channel tests
* rename `BroadcastChannelIdentifier.h`
* copy registries
* progress and tests
* cleanup
* worker and broadcast channel test
* `BroadcastChannel` ref and unref
* `MessagePort` ref, unref, and hasRef
* remove `SecurityContext.cpp/h`
* add types
2023-08-01 18:40:02 -07:00
Dylan Conway
d432448ac8
fix types and add message channel/port gc test
2023-07-28 16:55:49 -07:00
Dylan Conway
d614fdfaac
MessageChannel and MessagePort (#3860 )
...
* copy and format
* copy
* copy
* cleanup
* some tests
* spellcheck
* add types
* don't lock getting contextId
* array buffer test
2023-07-28 16:44:28 -07:00
Dylan Conway
c39c11e101
structured clone ( #3637 )
...
* copy `SerializedScriptValue`
* format
* make `SerializedScriptValue` compile
* add `transfer` option
* tests
* serialize/deserialize blobs
* tests for blobs
* serialize/deserialize file blobs
* more tests
* small cleanup
* format
* small changes + serialize offset
* slice helper
* map and set test
2023-07-14 19:37:22 -07:00