Permalink
Browse files

src: use AliasedBuffer for TickInfo

PR-URL: #17881
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Khaidi Chu <i@2333.moe>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
  • Loading branch information...
apapirovski committed Dec 27, 2017
1 parent 2c94424 commit 58467864244924b705c6cb4e2e5c79ab9e031697
Showing with 17 additions and 31 deletions.
  1. +3 −3 lib/internal/process/next_tick.js
  2. +6 −11 src/env-inl.h
  3. +5 −6 src/env.h
  4. +3 −11 src/node.cc
@@ -29,7 +29,7 @@ function setupNextTick() {
] = process._setupNextTick(_tickCallback);
// *Must* match Environment::TickInfo::Fields in src/env.h.
const kScheduled = 0;
const kHasScheduled = 0;
const nextTickQueue = {
head: null,
@@ -40,7 +40,7 @@ function setupNextTick() {
this.tail.next = entry;
} else {
this.head = entry;
tickInfo[kScheduled] = 1;
tickInfo[kHasScheduled] = 1;
}
this.tail = entry;
},
@@ -50,7 +50,7 @@ function setupNextTick() {
const ret = this.head.data;
if (this.head === this.tail) {
this.head = this.tail = null;
tickInfo[kScheduled] = 0;
tickInfo[kHasScheduled] = 0;
} else {
this.head = this.head.next;
}
View
@@ -217,21 +217,15 @@ inline bool Environment::AsyncCallbackScope::in_makecallback() const {
return env_->makecallback_cntr_ > 1;
}
inline Environment::TickInfo::TickInfo() {
for (int i = 0; i < kFieldsCount; ++i)
fields_[i] = 0;
}
inline Environment::TickInfo::TickInfo(v8::Isolate* isolate)
: fields_(isolate, kFieldsCount) {}
inline uint8_t* Environment::TickInfo::fields() {
inline AliasedBuffer<uint8_t, v8::Uint8Array>& Environment::TickInfo::fields() {
return fields_;
}
inline int Environment::TickInfo::fields_count() const {
return kFieldsCount;
}
inline uint8_t Environment::TickInfo::scheduled() const {
return fields_[kScheduled];
inline bool Environment::TickInfo::has_scheduled() const {
return fields_[kHasScheduled] == 1;
}
inline void Environment::AssignToContext(v8::Local<v8::Context> context,
@@ -269,6 +263,7 @@ inline Environment::Environment(IsolateData* isolate_data,
v8::Local<v8::Context> context)
: isolate_(context->GetIsolate()),
isolate_data_(isolate_data),
tick_info_(context->GetIsolate()),
timer_base_(uv_now(isolate_data->event_loop())),
using_domains_(false),
printed_error_(false),
View
@@ -455,20 +455,19 @@ class Environment {
class TickInfo {
public:
inline uint8_t* fields();
inline int fields_count() const;
inline uint8_t scheduled() const;
inline AliasedBuffer<uint8_t, v8::Uint8Array>& fields();
inline bool has_scheduled() const;
private:
friend class Environment; // So we can call the constructor.
inline TickInfo();
inline explicit TickInfo(v8::Isolate* isolate);
enum Fields {
kScheduled,
kHasScheduled,
kFieldsCount
};
uint8_t fields_[kFieldsCount];
AliasedBuffer<uint8_t, v8::Uint8Array> fields_;
DISALLOW_COPY_AND_ASSIGN(TickInfo);
};
View
@@ -168,7 +168,6 @@ using v8::SealHandleScope;
using v8::String;
using v8::TryCatch;
using v8::Uint32Array;
using v8::Uint8Array;
using v8::Undefined;
using v8::V8;
using v8::Value;
@@ -875,13 +874,6 @@ void SetupNextTick(const FunctionCallbackInfo<Value>& args) {
env->context(),
FIXED_ONE_BYTE_STRING(env->isolate(), "_setupNextTick")).FromJust();
// Values use to cross communicate with processNextTick.
uint8_t* const fields = env->tick_info()->fields();
uint8_t const fields_count = env->tick_info()->fields_count();
Local<ArrayBuffer> array_buffer =
ArrayBuffer::New(env->isolate(), fields, sizeof(*fields) * fields_count);
v8::Local<v8::Function> run_microtasks_fn =
env->NewFunctionTemplate(RunMicrotasks)->GetFunction(env->context())
.ToLocalChecked();
@@ -890,7 +882,7 @@ void SetupNextTick(const FunctionCallbackInfo<Value>& args) {
Local<Array> ret = Array::New(env->isolate(), 2);
ret->Set(env->context(), 0,
Uint8Array::New(array_buffer, 0, fields_count)).FromJust();
env->tick_info()->fields().GetJSArray()).FromJust();
ret->Set(env->context(), 1, run_microtasks_fn).FromJust();
args.GetReturnValue().Set(ret);
@@ -1019,7 +1011,7 @@ void InternalCallbackScope::Close() {
Environment::TickInfo* tick_info = env_->tick_info();
if (tick_info->scheduled() == 0) {
if (!tick_info->has_scheduled()) {
env_->isolate()->RunMicrotasks();
}
@@ -1030,7 +1022,7 @@ void InternalCallbackScope::Close() {
CHECK_EQ(env_->trigger_async_id(), 0);
}
if (tick_info->scheduled() == 0) {
if (!tick_info->has_scheduled()) {
return;
}

0 comments on commit 5846786

Please sign in to comment.