Browse Source

async_wrap: new instances get uid

New instances of AsyncWrap are automatically assigned a unique id. The
value will be used in future commits to communicate additional
information via the async hooks.

While the largest value we can reliably communicate to JS is 2^53, even
if a new AsyncWrap is created every 100ns the uid won't reach its end
for 28.5 years.

PR-URL: https://github.com/nodejs/node/pull/3461
Reviewed-By: Fedor Indutny <fedor@indutny.com>
process-exit-stdio-flushing
Trevor Norris 9 years ago
parent
commit
80a66ba6ae
  1. 8
      src/async-wrap-inl.h
  2. 3
      src/async-wrap.h
  3. 5
      src/env-inl.h
  4. 3
      src/env.h

8
src/async-wrap-inl.h

@ -17,7 +17,8 @@ inline AsyncWrap::AsyncWrap(Environment* env,
v8::Local<v8::Object> object,
ProviderType provider,
AsyncWrap* parent)
: BaseObject(env, object), bits_(static_cast<uint32_t>(provider) << 1) {
: BaseObject(env, object), bits_(static_cast<uint32_t>(provider) << 1),
uid_(env->get_async_wrap_uid()) {
CHECK_NE(provider, PROVIDER_NONE);
CHECK_GE(object->InternalFieldCount(), 1);
@ -66,6 +67,11 @@ inline AsyncWrap::ProviderType AsyncWrap::provider_type() const {
}
inline int64_t AsyncWrap::get_uid() const {
return uid_;
}
inline v8::Local<v8::Value> AsyncWrap::MakeCallback(
const v8::Local<v8::String> symbol,
int argc,

3
src/async-wrap.h

@ -55,6 +55,8 @@ class AsyncWrap : public BaseObject {
inline ProviderType provider_type() const;
inline int64_t get_uid() const;
// Only call these within a valid HandleScope.
v8::Local<v8::Value> MakeCallback(const v8::Local<v8::Function> cb,
int argc,
@ -76,6 +78,7 @@ class AsyncWrap : public BaseObject {
// expected the context object will receive a _asyncQueue object property
// that will be used to call pre/post in MakeCallback.
uint32_t bits_;
const int64_t uid_;
};
void LoadAsyncWrapperInfo(Environment* env);

5
src/env-inl.h

@ -210,6 +210,7 @@ inline Environment::Environment(v8::Local<v8::Context> context,
using_domains_(false),
printed_error_(false),
trace_sync_io_(false),
async_wrap_uid_(0),
debugger_agent_(this),
http_parser_buffer_(nullptr),
context_(context->GetIsolate(), context) {
@ -359,6 +360,10 @@ inline void Environment::set_trace_sync_io(bool value) {
trace_sync_io_ = value;
}
inline int64_t Environment::get_async_wrap_uid() {
return ++async_wrap_uid_;
}
inline uint32_t* Environment::heap_statistics_buffer() const {
CHECK_NE(heap_statistics_buffer_, nullptr);
return heap_statistics_buffer_;

3
src/env.h

@ -446,6 +446,8 @@ class Environment {
void PrintSyncTrace() const;
inline void set_trace_sync_io(bool value);
inline int64_t get_async_wrap_uid();
bool KickNextTick();
inline uint32_t* heap_statistics_buffer() const;
@ -541,6 +543,7 @@ class Environment {
bool using_domains_;
bool printed_error_;
bool trace_sync_io_;
int64_t async_wrap_uid_;
debugger::Agent debugger_agent_;
HandleWrapQueue handle_wrap_queue_;

Loading…
Cancel
Save