domain: Properly exit() on domain disposal #4045

Merged
merged 1 commit into from Sep 21, 2012

Projects

None yet

1 participant

@isaacs
isaacs commented Sep 21, 2012

This addresses #4034. There are two problems happening:

  1. The domain is not exited automatically when calling dispose() on it.
    Then, since the domain is disposed, attempting to exit it again will do
    nothing.
  2. The active domain is stored on process.domain. Since thrown errors
    call process.emit('uncaughtException', er), and the process is an
    event emitter with a .domain member, it re-enters the domain a second
    time before calling the error handler, pushing it onto the stack again.

Thus, if the handler calls domain.dispose(), then the domain is now on
the stack twice, and cannot be exited properly. Since the domain is
disposed, any subsequent IO will be no-op'ed, since we've declared that
this context is done and best forgotten.

The solution here is twofold:

  1. In EventEmitter.emit, do not enter the domain if this===process.
  2. Automatically exit the domain when calling domain.dispose().
@isaacs isaacs domain: Properly exit() on domain disposal
This addresses #4034.  There are two problems happening:

1. The domain is not exited automatically when calling dispose() on it.
Then, since the domain is disposed, attempting to exit it again will do
nothing.

2. The active domain is stored on process.domain.  Since thrown errors
call `process.emit('uncaughtException', er)`, and the process is an
event emitter with a `.domain` member, it re-enters the domain a second
time before calling the error handler, pushing it onto the stack again.

Thus, if the handler calls `domain.dispose()`, then the domain is now on
the stack twice, and cannot be exited properly.  Since the domain is
disposed, any subsequent IO will be no-op'ed, since we've declared that
this context is done and best forgotten.

The solution here is twofold:

1. In EventEmitter.emit, do not enter the domain if `this===process`.
2. Automatically exit the domain when calling `domain.dispose()`.
0400571
@isaacs isaacs merged commit 0400571 into nodejs:v0.8 Sep 21, 2012
@isaacs
isaacs commented Sep 21, 2012

landed in v0.8. +1'd by @piscisaureus

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment