mirror of
https://github.com/nodejs/node-v0.x-archive.git
synced 2026-04-28 03:01:10 -04:00
Domain hooks in ReqWrap<T> and MakeCallback
This commit is contained in:
42
src/node.cc
42
src/node.cc
@@ -109,6 +109,11 @@ static Persistent<String> listeners_symbol;
|
||||
static Persistent<String> uncaught_exception_symbol;
|
||||
static Persistent<String> emit_symbol;
|
||||
|
||||
static Persistent<String> domain_symbol;
|
||||
static Persistent<String> enter_symbol;
|
||||
static Persistent<String> exit_symbol;
|
||||
static Persistent<String> disposed_symbol;
|
||||
|
||||
|
||||
static bool print_eval = false;
|
||||
static bool force_repl = false;
|
||||
@@ -1017,10 +1022,47 @@ MakeCallback(const Handle<Object> object,
|
||||
|
||||
TryCatch try_catch;
|
||||
|
||||
if (domain_symbol.IsEmpty()) {
|
||||
domain_symbol = NODE_PSYMBOL("domain");
|
||||
enter_symbol = NODE_PSYMBOL("enter");
|
||||
exit_symbol = NODE_PSYMBOL("exit");
|
||||
disposed_symbol = NODE_PSYMBOL("_disposed");
|
||||
}
|
||||
|
||||
Local<Value> domain_v = object->Get(domain_symbol);
|
||||
Local<Object> domain;
|
||||
Local<Function> enter;
|
||||
Local<Function> exit;
|
||||
if (!domain_v->IsUndefined()) {
|
||||
domain = domain_v->ToObject();
|
||||
if (domain->Get(disposed_symbol)->BooleanValue()) {
|
||||
// domain has been disposed of.
|
||||
return Undefined();
|
||||
}
|
||||
enter = Local<Function>::Cast(domain->Get(enter_symbol));
|
||||
enter->Call(domain, 0, NULL);
|
||||
}
|
||||
|
||||
if (try_catch.HasCaught()) {
|
||||
FatalException(try_catch);
|
||||
return Undefined();
|
||||
}
|
||||
|
||||
Local<Value> ret = callback->Call(object, argc, argv);
|
||||
|
||||
if (try_catch.HasCaught()) {
|
||||
FatalException(try_catch);
|
||||
return Undefined();
|
||||
}
|
||||
|
||||
if (!domain_v->IsUndefined()) {
|
||||
exit = Local<Function>::Cast(domain->Get(exit_symbol));
|
||||
exit->Call(domain, 0, NULL);
|
||||
}
|
||||
|
||||
if (try_catch.HasCaught()) {
|
||||
FatalException(try_catch);
|
||||
return Undefined();
|
||||
}
|
||||
|
||||
return scope.Close(ret);
|
||||
|
||||
@@ -238,7 +238,10 @@
|
||||
for (var i = 0; i < l; i++) {
|
||||
var tock = q[i];
|
||||
var callback = tock.callback;
|
||||
if (tock.domain) tock.domain.enter();
|
||||
if (tock.domain) {
|
||||
if (tock.domain._disposed) continue;
|
||||
tock.domain.enter();
|
||||
}
|
||||
callback();
|
||||
if (tock.domain) tock.domain.exit();
|
||||
}
|
||||
|
||||
@@ -24,14 +24,35 @@
|
||||
|
||||
namespace node {
|
||||
|
||||
static v8::Persistent<v8::String> process_symbol;
|
||||
static v8::Persistent<v8::String> domain_symbol;
|
||||
|
||||
template <typename T>
|
||||
class ReqWrap {
|
||||
public:
|
||||
ReqWrap() {
|
||||
v8::HandleScope scope;
|
||||
object_ = v8::Persistent<v8::Object>::New(v8::Object::New());
|
||||
|
||||
// TODO: grab a handle to the current process.domain
|
||||
if (process_symbol.IsEmpty()) {
|
||||
process_symbol = NODE_PSYMBOL("process");
|
||||
domain_symbol = NODE_PSYMBOL("domain");
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> domain = v8::Context::GetCurrent()
|
||||
->Global()
|
||||
->Get(process_symbol)
|
||||
->ToObject()
|
||||
->Get(domain_symbol);
|
||||
|
||||
if (!domain->IsUndefined()) {
|
||||
// fprintf(stderr, "setting domain on ReqWrap\n");
|
||||
object_->Set(domain_symbol, domain);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
~ReqWrap() {
|
||||
// Assert that someone has called Dispatched()
|
||||
assert(req_.data == this);
|
||||
|
||||
Reference in New Issue
Block a user