summaryrefslogtreecommitdiff
path: root/cli/ops/performance.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops/performance.rs')
-rw-r--r--cli/ops/performance.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/cli/ops/performance.rs b/cli/ops/performance.rs
new file mode 100644
index 000000000..ae2a0b860
--- /dev/null
+++ b/cli/ops/performance.rs
@@ -0,0 +1,49 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+use crate::msg;
+use crate::ops::ok_buf;
+use crate::ops::serialize_response;
+use crate::ops::CliOpResult;
+use crate::state::ThreadSafeState;
+use deno::*;
+use flatbuffers::FlatBufferBuilder;
+
+// Returns a milliseconds and nanoseconds subsec
+// since the start time of the deno runtime.
+// If the High precision flag is not set, the
+// nanoseconds are rounded on 2ms.
+pub fn op_now(
+ state: &ThreadSafeState,
+ base: &msg::Base<'_>,
+ data: Option<PinnedBuf>,
+) -> CliOpResult {
+ assert!(data.is_none());
+ let seconds = state.start_time.elapsed().as_secs();
+ let mut subsec_nanos = state.start_time.elapsed().subsec_nanos();
+ let reduced_time_precision = 2_000_000; // 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.permissions.allows_hrtime() {
+ subsec_nanos -= subsec_nanos % reduced_time_precision
+ }
+
+ let builder = &mut FlatBufferBuilder::new();
+ let inner = msg::NowRes::create(
+ builder,
+ &msg::NowResArgs {
+ seconds,
+ subsec_nanos,
+ },
+ );
+
+ ok_buf(serialize_response(
+ base.cmd_id(),
+ builder,
+ msg::BaseArgs {
+ inner: Some(inner.as_union_value()),
+ inner_type: msg::Any::NowRes,
+ ..Default::default()
+ },
+ ))
+}