From bc53a3bbe81a3263efb67291b44a42a75a975d98 Mon Sep 17 00:00:00 2001 From: Nicolas Guerrero Date: Fri, 4 Dec 2020 15:24:07 -0500 Subject: [PATCH 1/6] Some progress --- cli/ops/timers.rs | 49 ++++++++++++++++++++++++++++------------ cli/rt/11_timers.js | 7 ++++-- cli/rt/40_performance.js | 4 ++-- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/cli/ops/timers.rs b/cli/ops/timers.rs index 841cdf289d035..00e463b2f0033 100644 --- a/cli/ops/timers.rs +++ b/cli/ops/timers.rs @@ -8,17 +8,19 @@ //! only need to be able to start, cancel and await a single timer (or Delay, as Tokio //! calls it) for an entire Isolate. This is what is implemented here. +use crate::metrics::metrics_op; use crate::permissions::Permissions; +use deno_core::BufVec; use deno_core::error::AnyError; +use deno_core::error::type_error; use deno_core::futures; use deno_core::futures::channel::oneshot; use deno_core::futures::FutureExt; use deno_core::futures::TryFutureExt; +use deno_core::OpState; use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::serde_json::Value; -use deno_core::BufVec; -use deno_core::OpState; use deno_core::ZeroCopyBuf; use serde::Deserialize; use std::cell::RefCell; @@ -28,6 +30,8 @@ use std::rc::Rc; use std::thread::sleep; use std::time::Duration; use std::time::Instant; +use super::dispatch_minimal::minimal_op; +use super::dispatch_minimal::MinimalOp; pub type StartTime = Instant; @@ -77,7 +81,7 @@ pub fn init(rt: &mut deno_core::JsRuntime) { super::reg_json_sync(rt, "op_global_timer_stop", op_global_timer_stop); super::reg_json_sync(rt, "op_global_timer_start", op_global_timer_start); super::reg_json_async(rt, "op_global_timer", op_global_timer); - super::reg_json_sync(rt, "op_now", op_now); + rt.register_op("op_now", metrics_op(minimal_op(op_now))); super::reg_json_sync(rt, "op_sleep_sync", op_sleep_sync); } @@ -138,26 +142,41 @@ async fn op_global_timer( // If the High precision flag is not set, the // nanoseconds are rounded on 2ms. fn op_now( - state: &mut OpState, - _args: Value, - _zero_copy: &mut [ZeroCopyBuf], -) -> Result { - let start_time = state.borrow::(); + state: Rc>, + // Arguments are discarded + _sync: bool, + _x: i32, + zero_copy: BufVec, +) -> MinimalOp { + match zero_copy.len() { + 0 => return MinimalOp::Sync(Err(type_error("no buffer specified"))), + 1 => {} + _ => panic!("Invalid number of arguments"), + } + + let op_state = state.borrow(); + let start_time = op_state.borrow::(); let seconds = start_time.elapsed().as_secs(); - let mut subsec_nanos = start_time.elapsed().subsec_nanos(); - let reduced_time_precision = 2_000_000; // 2ms in nanoseconds + let mut subsec_nanos = start_time.elapsed().subsec_nanos() as f64; + let reduced_time_precision = 2_000_000 as f64; // 2ms in nanoseconds // If the permission is not enabled // Round the nano result on 2 milliseconds // see: https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp#Reduced_time_precision - if state.borrow::().check_hrtime().is_err() { + if op_state.borrow::().check_hrtime().is_err() { subsec_nanos -= subsec_nanos % reduced_time_precision; } - Ok(json!({ - "seconds": seconds, - "subsecNanos": subsec_nanos, - })) + let result = (seconds * 1_000) as f64 + (subsec_nanos / 1_000_000 as f64); + println!("{}", &result); + + let mut x = Vec::from(&*zero_copy[0]); + + println!("{}", x.len()); + + x.clone_from_slice(&result.to_be_bytes()); + + MinimalOp::Sync(Ok(1)) } #[derive(Deserialize)] diff --git a/cli/rt/11_timers.js b/cli/rt/11_timers.js index c762c59d83f74..92e010615b173 100644 --- a/cli/rt/11_timers.js +++ b/cli/rt/11_timers.js @@ -3,6 +3,7 @@ ((window) => { const assert = window.__bootstrap.util.assert; const core = window.Deno.core; + const { sendSync } = window.__bootstrap.dispatchMinimal; function opStopGlobalTimer() { core.jsonOpSync("op_global_timer_stop"); @@ -16,8 +17,10 @@ await core.jsonOpAsync("op_global_timer"); } - function opNow() { - return core.jsonOpSync("op_now"); + const now = new Uint8Array; + function opNow(x) { + sendSync("op_now", x, now); + return now; } function sleepSync(millis = 0) { diff --git a/cli/rt/40_performance.js b/cli/rt/40_performance.js index 3d8be60314607..e24bc9aad2372 100644 --- a/cli/rt/40_performance.js +++ b/cli/rt/40_performance.js @@ -43,8 +43,8 @@ } function now() { - const res = opNow(); - return res.seconds * 1e3 + res.subsecNanos / 1e6; + const a = opNow(0); + console.log(a); } class PerformanceEntry { From 39f2ee9ab27f08268cf5907dda8f8ccdc2702174 Mon Sep 17 00:00:00 2001 From: Nicolas Guerrero Date: Fri, 4 Dec 2020 18:04:19 -0500 Subject: [PATCH 2/6] Working --- cli/ops/timers.rs | 13 ++++--------- cli/rt/11_timers.js | 10 +++++++--- cli/rt/40_performance.js | 3 +-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/cli/ops/timers.rs b/cli/ops/timers.rs index 00e463b2f0033..7bfea27c00dbb 100644 --- a/cli/ops/timers.rs +++ b/cli/ops/timers.rs @@ -23,7 +23,7 @@ use deno_core::serde_json::json; use deno_core::serde_json::Value; use deno_core::ZeroCopyBuf; use serde::Deserialize; -use std::cell::RefCell; +use std::{cell::RefCell}; use std::future::Future; use std::pin::Pin; use std::rc::Rc; @@ -146,7 +146,7 @@ fn op_now( // Arguments are discarded _sync: bool, _x: i32, - zero_copy: BufVec, + mut zero_copy: BufVec, ) -> MinimalOp { match zero_copy.len() { 0 => return MinimalOp::Sync(Err(type_error("no buffer specified"))), @@ -168,15 +168,10 @@ fn op_now( } let result = (seconds * 1_000) as f64 + (subsec_nanos / 1_000_000 as f64); - println!("{}", &result); - let mut x = Vec::from(&*zero_copy[0]); + (&mut zero_copy[0]).copy_from_slice(&result.to_be_bytes()); - println!("{}", x.len()); - - x.clone_from_slice(&result.to_be_bytes()); - - MinimalOp::Sync(Ok(1)) + MinimalOp::Sync(Ok(0)) } #[derive(Deserialize)] diff --git a/cli/rt/11_timers.js b/cli/rt/11_timers.js index 92e010615b173..4fb8bb2791a65 100644 --- a/cli/rt/11_timers.js +++ b/cli/rt/11_timers.js @@ -17,10 +17,14 @@ await core.jsonOpAsync("op_global_timer"); } - const now = new Uint8Array; + const nowBytes = new Uint8Array(8); function opNow(x) { - sendSync("op_now", x, now); - return now; + sendSync("op_now", x, nowBytes); + return new DataView( + Uint8Array.from(nowBytes).buffer, + 0 + ) + .getFloat64(); } function sleepSync(millis = 0) { diff --git a/cli/rt/40_performance.js b/cli/rt/40_performance.js index e24bc9aad2372..7caa6c4a20cd4 100644 --- a/cli/rt/40_performance.js +++ b/cli/rt/40_performance.js @@ -43,8 +43,7 @@ } function now() { - const a = opNow(0); - console.log(a); + return opNow(0); } class PerformanceEntry { From 32464f1a140b51b3c62ac9093c824f81ddc3cc25 Mon Sep 17 00:00:00 2001 From: Nicolas Guerrero Date: Fri, 4 Dec 2020 18:21:07 -0500 Subject: [PATCH 3/6] Cleanup, format and lint --- cli/ops/timers.rs | 16 ++++++++-------- cli/rt/11_timers.js | 5 ++--- cli/rt/40_performance.js | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/cli/ops/timers.rs b/cli/ops/timers.rs index 7bfea27c00dbb..2a09d3f6720b2 100644 --- a/cli/ops/timers.rs +++ b/cli/ops/timers.rs @@ -8,30 +8,30 @@ //! only need to be able to start, cancel and await a single timer (or Delay, as Tokio //! calls it) for an entire Isolate. This is what is implemented here. +use super::dispatch_minimal::minimal_op; +use super::dispatch_minimal::MinimalOp; use crate::metrics::metrics_op; use crate::permissions::Permissions; -use deno_core::BufVec; -use deno_core::error::AnyError; use deno_core::error::type_error; +use deno_core::error::AnyError; use deno_core::futures; use deno_core::futures::channel::oneshot; use deno_core::futures::FutureExt; use deno_core::futures::TryFutureExt; -use deno_core::OpState; use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::serde_json::Value; +use deno_core::BufVec; +use deno_core::OpState; use deno_core::ZeroCopyBuf; use serde::Deserialize; -use std::{cell::RefCell}; +use std::cell::RefCell; use std::future::Future; use std::pin::Pin; use std::rc::Rc; use std::thread::sleep; use std::time::Duration; use std::time::Instant; -use super::dispatch_minimal::minimal_op; -use super::dispatch_minimal::MinimalOp; pub type StartTime = Instant; @@ -158,7 +158,7 @@ fn op_now( let start_time = op_state.borrow::(); let seconds = start_time.elapsed().as_secs(); let mut subsec_nanos = start_time.elapsed().subsec_nanos() as f64; - let reduced_time_precision = 2_000_000 as f64; // 2ms in nanoseconds + let reduced_time_precision = 2_000_000.0; // 2ms in nanoseconds // If the permission is not enabled // Round the nano result on 2 milliseconds @@ -167,7 +167,7 @@ fn op_now( subsec_nanos -= subsec_nanos % reduced_time_precision; } - let result = (seconds * 1_000) as f64 + (subsec_nanos / 1_000_000 as f64); + let result = (seconds * 1_000) as f64 + (subsec_nanos / 1_000_000.0); (&mut zero_copy[0]).copy_from_slice(&result.to_be_bytes()); diff --git a/cli/rt/11_timers.js b/cli/rt/11_timers.js index 4fb8bb2791a65..3fc589858e129 100644 --- a/cli/rt/11_timers.js +++ b/cli/rt/11_timers.js @@ -18,11 +18,10 @@ } const nowBytes = new Uint8Array(8); - function opNow(x) { - sendSync("op_now", x, nowBytes); + function opNow() { + sendSync("op_now", 0, nowBytes); return new DataView( Uint8Array.from(nowBytes).buffer, - 0 ) .getFloat64(); } diff --git a/cli/rt/40_performance.js b/cli/rt/40_performance.js index 7caa6c4a20cd4..0a63dc704dfc9 100644 --- a/cli/rt/40_performance.js +++ b/cli/rt/40_performance.js @@ -43,7 +43,7 @@ } function now() { - return opNow(0); + return opNow(); } class PerformanceEntry { From 5f7f9b61797d3aa5fcf1207d4ba13dcf0d53b0e1 Mon Sep 17 00:00:00 2001 From: Nicolas Guerrero Date: Sat, 5 Dec 2020 12:10:38 -0500 Subject: [PATCH 4/6] Cleanup --- cli/ops/timers.rs | 2 +- cli/rt/11_timers.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cli/ops/timers.rs b/cli/ops/timers.rs index 2a09d3f6720b2..ac02b1c717ef7 100644 --- a/cli/ops/timers.rs +++ b/cli/ops/timers.rs @@ -151,7 +151,7 @@ fn op_now( match zero_copy.len() { 0 => return MinimalOp::Sync(Err(type_error("no buffer specified"))), 1 => {} - _ => panic!("Invalid number of arguments"), + _ => return MinimalOp::Sync(Err(type_error("Invalid number of arguments"))), } let op_state = state.borrow(); diff --git a/cli/rt/11_timers.js b/cli/rt/11_timers.js index 3fc589858e129..5a59844a3306b 100644 --- a/cli/rt/11_timers.js +++ b/cli/rt/11_timers.js @@ -20,10 +20,7 @@ const nowBytes = new Uint8Array(8); function opNow() { sendSync("op_now", 0, nowBytes); - return new DataView( - Uint8Array.from(nowBytes).buffer, - ) - .getFloat64(); + return new DataView(nowBytes.buffer).getFloat64(); } function sleepSync(millis = 0) { From 806eb0e9e4f608c1376a5b75cea601113c241090 Mon Sep 17 00:00:00 2001 From: Nicolas Guerrero Date: Sat, 5 Dec 2020 12:15:55 -0500 Subject: [PATCH 5/6] Fmt --- cli/ops/timers.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cli/ops/timers.rs b/cli/ops/timers.rs index ac02b1c717ef7..8037fd6982766 100644 --- a/cli/ops/timers.rs +++ b/cli/ops/timers.rs @@ -151,7 +151,9 @@ fn op_now( match zero_copy.len() { 0 => return MinimalOp::Sync(Err(type_error("no buffer specified"))), 1 => {} - _ => return MinimalOp::Sync(Err(type_error("Invalid number of arguments"))), + _ => { + return MinimalOp::Sync(Err(type_error("Invalid number of arguments"))) + } } let op_state = state.borrow(); From bc186f48887ed8a724d3d27dcda30fd3de02ff20 Mon Sep 17 00:00:00 2001 From: Nicolas Guerrero Date: Sat, 5 Dec 2020 16:35:59 -0500 Subject: [PATCH 6/6] Bump CI