Skip to content

Commit

Permalink
fix(napi): fallback to copy buffer if zero copy is not allowed
Browse files Browse the repository at this point in the history
  • Loading branch information
Brooooooklyn committed Jan 19, 2023
1 parent bdbdbcc commit 120a043
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 166 deletions.
21 changes: 18 additions & 3 deletions crates/napi/src/bindgen_runtime/js_values/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,16 +231,31 @@ impl ToNapiValue for Buffer {
// the same data pointer if it's 0x0.
unsafe { sys::napi_create_buffer(env, len, ptr::null_mut(), &mut ret) }
} else {
unsafe {
let value_ptr = val.inner.as_ptr();
let val_box_ptr = Box::into_raw(Box::new(val));
let mut status = unsafe {
sys::napi_create_external_buffer(
env,
len,
val.inner.as_ptr() as *mut c_void,
value_ptr as *mut c_void,
Some(drop_buffer),
Box::into_raw(Box::new(val)) as *mut c_void,
val_box_ptr as *mut c_void,
&mut ret,
)
};
if status == napi_sys::Status::napi_no_external_buffers_allowed {
let value = unsafe { Box::from_raw(val_box_ptr) };
status = unsafe {
sys::napi_create_buffer_copy(
env,
len,
value.inner.as_ptr() as *mut c_void,
ptr::null_mut(),
&mut ret,
)
};
}
status
},
"Failed to create napi buffer"
)?;
Expand Down
1 change: 1 addition & 0 deletions crates/sys/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ pub mod Status {
pub const napi_arraybuffer_expected: i32 = 19;
pub const napi_detachable_arraybuffer_expected: i32 = 20;
pub const napi_would_deadlock: i32 = 21; // unused
pub const napi_no_external_buffers_allowed: i32 = 22;
}

pub type napi_callback =
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
"c8": "^7.12.0",
"colorette": "^2.0.19",
"cross-env": "^7.0.3",
"electron": "20.3.3",
"electron": "22.0.3",
"esbuild": "^0.17.2",
"eslint": "^8.32.0",
"eslint-config-prettier": "^8.6.0",
Expand Down

1 comment on commit 120a043

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 120a043 Previous: bdbdbcc Ratio
noop#napi-rs 49025317 ops/sec (±0.97%) 68073691 ops/sec (±0.34%) 1.39
noop#JavaScript 681933457 ops/sec (±1%) 591619541 ops/sec (±0.13%) 0.87
Plus number#napi-rs 15692608 ops/sec (±1.34%) 20646334 ops/sec (±0.24%) 1.32
Plus number#JavaScript 651232689 ops/sec (±0.9%) 591398593 ops/sec (±0.1%) 0.91
Create buffer#napi-rs 340634 ops/sec (±8.87%) 445751 ops/sec (±6.3%) 1.31
Create buffer#JavaScript 1858767 ops/sec (±6.36%) 2193405 ops/sec (±6.17%) 1.18
createArray#createArrayJson 34516 ops/sec (±0.86%) 45946 ops/sec (±0.11%) 1.33
createArray#create array for loop 5819 ops/sec (±0.67%) 7809 ops/sec (±0.09%) 1.34
createArray#create array with serde trait 5920 ops/sec (±1.16%) 7907 ops/sec (±0.29%) 1.34
getArrayFromJs#get array from json string 14882 ops/sec (±1.18%) 17734 ops/sec (±0.12%) 1.19
getArrayFromJs#get array from serde 7982 ops/sec (±0.74%) 9780 ops/sec (±0.06%) 1.23
getArrayFromJs#get array with for loop 10224 ops/sec (±0.77%) 12586 ops/sec (±0.13%) 1.23
Get Set property#Get Set from native#u32 347692 ops/sec (±5.76%) 413589 ops/sec (±4.81%) 1.19
Get Set property#Get Set from JavaScript#u32 289673 ops/sec (±5.45%) 343075 ops/sec (±4.68%) 1.18
Get Set property#Get Set from native#string 319091 ops/sec (±5.44%) 368779 ops/sec (±4.51%) 1.16
Get Set property#Get Set from JavaScript#string 262335 ops/sec (±7.44%) 326443 ops/sec (±4.9%) 1.24
Async task#spawn task 25895 ops/sec (±4.53%) 35766 ops/sec (±1.47%) 1.38
Async task#ThreadSafeFunction 1730 ops/sec (±3.77%) 2790 ops/sec (±7.79%) 1.61
Async task#Tokio future to Promise 27798 ops/sec (±3.86%) 32605 ops/sec (±0.99%) 1.17
Query#query * 100 1595 ops/sec (±2.82%) 2104 ops/sec (±2.07%) 1.32
Query#query * 1 21763 ops/sec (±5.16%) 32734 ops/sec (±0.38%) 1.50

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.