uv_loop_t* loop)
: isolate_(context->GetIsolate()),
isolate_data_(IsolateData::GetOrCreate(context->GetIsolate(), loop)),
+ timer_base_(uv_now(loop)),
using_smalloc_alloc_cb_(false),
using_domains_(false),
using_abort_on_uncaught_exc_(false),
return &tick_info_;
}
+inline uint64_t Environment::timer_base() const {
+ return timer_base_;
+}
+
inline bool Environment::using_smalloc_alloc_cb() const {
return using_smalloc_alloc_cb_;
}
inline AsyncHooks* async_hooks();
inline DomainFlag* domain_flag();
inline TickInfo* tick_info();
+ inline uint64_t timer_base() const;
static inline Environment* from_cares_timer_handle(uv_timer_t* handle);
inline uv_timer_t* cares_timer_handle();
AsyncHooks async_hooks_;
DomainFlag domain_flag_;
TickInfo tick_info_;
+ const uint64_t timer_base_;
uv_timer_t cares_timer_handle_;
ares_channel cares_channel_;
ares_task_list cares_task_list_;
Environment* env = Environment::GetCurrent(args);
uv_update_time(env->event_loop());
uint64_t now = uv_now(env->event_loop());
+ CHECK(now >= env->timer_base());
+ now -= env->timer_base();
if (now <= 0xfffffff)
args.GetReturnValue().Set(static_cast<uint32_t>(now));
else
--- /dev/null
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+
+// Return value of Timer.now() should easily fit in a SMI right after start-up.
+const Timer = process.binding('timer_wrap').Timer;
+assert(Timer.now() < 0x3ffffff);