Skip to content
Prev Previous commit
Next Next commit
src: implement native changes for async_hooks
Changes in the native code for the upcoming async_hooks module. These
have been separated to help with review and testing.

Changes include:

* Introduce an async id stack that tracks recursive calls into async
  execution contexts. For performance reasons the id stack is held as a
  double* and assigned to a Float64Array. If the stack grows too large
  it is then placed in it's own stack and replaced with a new double*.
  This should accommodate arbitrarily large stacks.

  I'm not especially happy with the complexity involved with this async
  id stack, but it's also the fastest and most full proof way of
  handling it that I have found.

* Add helper functions in Environment and AsyncWrap to work with the
  async id stack.

* Add AsyncWrap::Reset() to allow AsyncWrap instances that have been
  placed in a resource pool, instead of being released, to be
  reinitialized. AsyncWrap::AsyncWrap() also now uses Reset() for
  initialization.

* AsyncWrap* parent no longer needs to be passed via the constructor.

* Introduce Environment::AsyncHooks class to contain the needed native
  functionality. This includes the pointer to the async id stack, and
  array of v8::Eternal<v8::String>'s that hold the names of all
  providers, mechanisms for storing/retrieving the trigger id, etc.

* Introduce Environment::AsyncHooks::ExecScope as a way to track the
  current id and trigger id of function execution via RAII.

* If the user passes --abort-on-uncaught-exception then instead of
  throwing the application will print a stack trace and abort.
  • Loading branch information
trevnorris authored and addaleax committed May 10, 2017
commit f6183d0a0d0b676b013dd8ff8e194baace51161d
12 changes: 6 additions & 6 deletions src/async-wrap-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,18 @@

namespace node {

inline bool AsyncWrap::ran_init_callback() const {
return static_cast<bool>(bits_ & 1);
inline AsyncWrap::ProviderType AsyncWrap::provider_type() const {
return provider_type_;
}


inline AsyncWrap::ProviderType AsyncWrap::provider_type() const {
return static_cast<ProviderType>(bits_ >> 1);
inline double AsyncWrap::get_id() const {
return async_id_;
}


inline double AsyncWrap::get_id() const {
return id_;
inline double AsyncWrap::get_trigger_id() const {
return trigger_id_;
}


Expand Down
Loading