diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2019-06-14 13:58:20 -0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-06-14 13:56:36 -0700 |
commit | 1361e302234b17ab8079107b134dfd0ddf288439 (patch) | |
tree | a38ce903ddbd89ee2dfd437bd8f984cb1d85695b /cli/dispatch_minimal.rs | |
parent | 3dff147d0ca1a2cd8d264d20a178d71cb38b1c4e (diff) |
Revert "Refactor dispatch handling (#2452)"
Due to performance regression:
https://github.com/denoland/deno/commit/dc60fe9f300043f191286ef804a365e16e455f87#commitcomment-33943711
This reverts commit dc60fe9f300043f191286ef804a365e16e455f87.
Diffstat (limited to 'cli/dispatch_minimal.rs')
-rw-r--r-- | cli/dispatch_minimal.rs | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/cli/dispatch_minimal.rs b/cli/dispatch_minimal.rs index 643fdaed9..0e20d3b1a 100644 --- a/cli/dispatch_minimal.rs +++ b/cli/dispatch_minimal.rs @@ -6,7 +6,6 @@ //! message or a "minimal" message. use crate::state::ThreadSafeState; use deno::Buf; -use deno::CoreOp; use deno::Op; use deno::PinnedBuf; use futures::Future; @@ -18,6 +17,7 @@ const OP_WRITE: i32 = 2; #[derive(Copy, Clone, Debug, PartialEq)] // This corresponds to RecordMinimal on the TS side. pub struct Record { + pub promise_id: i32, pub op_id: i32, pub arg: i32, pub result: i32, @@ -25,9 +25,15 @@ pub struct Record { impl Into<Buf> for Record { fn into(self) -> Buf { - let vec = vec![DISPATCH_MINIMAL_TOKEN, self.op_id, self.arg, self.result]; + let vec = vec![ + DISPATCH_MINIMAL_TOKEN, + self.promise_id, + self.op_id, + self.arg, + self.result, + ]; let buf32 = vec.into_boxed_slice(); - let ptr = Box::into_raw(buf32) as *mut [u8; 4 * 4]; + let ptr = Box::into_raw(buf32) as *mut [u8; 5 * 4]; unsafe { Box::from_raw(ptr) } } } @@ -39,32 +45,36 @@ pub fn parse_min_record(bytes: &[u8]) -> Option<Record> { let p = bytes.as_ptr(); #[allow(clippy::cast_ptr_alignment)] let p32 = p as *const i32; - let s = unsafe { std::slice::from_raw_parts(p32, bytes.len() / 3) }; + let s = unsafe { std::slice::from_raw_parts(p32, bytes.len() / 4) }; - if s.len() < 4 { + if s.len() < 5 { return None; } let ptr = s.as_ptr(); - let ints = unsafe { std::slice::from_raw_parts(ptr, 4) }; + let ints = unsafe { std::slice::from_raw_parts(ptr, 5) }; if ints[0] != DISPATCH_MINIMAL_TOKEN { return None; } Some(Record { - op_id: ints[1], - arg: ints[2], - result: ints[3], + promise_id: ints[1], + op_id: ints[2], + arg: ints[3], + result: ints[4], }) } #[test] fn test_parse_min_record() { - let buf = vec![0xFE, 0xCA, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]; + let buf = vec![ + 0xFE, 0xCA, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, + ]; assert_eq!( parse_min_record(&buf), Some(Record { - op_id: 1, - arg: 2, - result: 3, + promise_id: 1, + op_id: 2, + arg: 3, + result: 4, }) ); @@ -79,7 +89,8 @@ pub fn dispatch_minimal( state: &ThreadSafeState, mut record: Record, zero_copy: Option<PinnedBuf>, -) -> CoreOp { +) -> Op { + let is_sync = record.promise_id == 0; let min_op = match record.op_id { OP_READ => ops::read(record.arg, zero_copy), OP_WRITE => ops::write(record.arg, zero_copy), @@ -104,7 +115,11 @@ pub fn dispatch_minimal( state.metrics_op_completed(buf.len()); Ok(buf) })); - Op::Async(fut) + if is_sync { + Op::Sync(fut.wait().unwrap()) + } else { + Op::Async(fut) + } } mod ops { |