Add process.scheduleCallback.
It will schedule a callback to be executed by pure uv loop.
This commit is contained in:
		
					parent
					
						
							
								a12754f980
							
						
					
				
			
			
				commit
				
					
						d0494024a9
					
				
			
		
					 2 changed files with 30 additions and 3 deletions
				
			
		|  | @ -16,13 +16,29 @@ namespace { | |||
| 
 | ||||
| static int kMaxCallStackSize = 200;  // Same with WebKit.
 | ||||
| 
 | ||||
| static uv_async_t dummy_uv_handle; | ||||
| // Async handle to wake up uv loop.
 | ||||
| static uv_async_t g_dummy_uv_handle; | ||||
| 
 | ||||
| // Async handle to execute the stored v8 callback.
 | ||||
| static uv_async_t g_callback_uv_handle; | ||||
| 
 | ||||
| // Stored v8 callback, to be called by the async handler.
 | ||||
| RefCountedV8Function g_v8_callback; | ||||
| 
 | ||||
| // Dummy class type that used for crashing the program.
 | ||||
| struct DummyClass { bool crash; }; | ||||
| 
 | ||||
| // Dummy async handler that does nothing.
 | ||||
| void UvNoOp(uv_async_t* handle, int status) { | ||||
| } | ||||
| 
 | ||||
| // Async handler to execute the stored v8 callback.
 | ||||
| void UvOnCallback(uv_async_t* handle, int status) { | ||||
|   v8::HandleScope handle_scope(node_isolate); | ||||
|   v8::Handle<v8::Object> global = v8::Context::GetCurrent()->Global(); | ||||
|   g_v8_callback->NewHandle()->Call(global, 0, NULL); | ||||
| } | ||||
| 
 | ||||
| v8::Handle<v8::Object> DumpStackFrame(v8::Handle<v8::StackFrame> stack_frame) { | ||||
|   v8::Local<v8::Object> result = v8::Object::New(); | ||||
|   result->Set(ToV8Value("line"), ToV8Value(stack_frame->GetLineNumber())); | ||||
|  | @ -44,7 +60,8 @@ v8::Handle<v8::Object> DumpStackFrame(v8::Handle<v8::StackFrame> stack_frame) { | |||
| node::node_module_struct* GetBuiltinModule(const char *name, bool is_browser); | ||||
| 
 | ||||
| AtomBindings::AtomBindings() { | ||||
|   uv_async_init(uv_default_loop(), &dummy_uv_handle, UvNoOp); | ||||
|   uv_async_init(uv_default_loop(), &g_dummy_uv_handle, UvNoOp); | ||||
|   uv_async_init(uv_default_loop(), &g_callback_uv_handle, UvOnCallback); | ||||
| } | ||||
| 
 | ||||
| AtomBindings::~AtomBindings() { | ||||
|  | @ -58,6 +75,7 @@ void AtomBindings::BindTo(v8::Handle<v8::Object> process) { | |||
|   NODE_SET_METHOD(process, "activateUvLoop", ActivateUVLoop); | ||||
|   NODE_SET_METHOD(process, "log", Log); | ||||
|   NODE_SET_METHOD(process, "getCurrentStackTrace", GetCurrentStackTrace); | ||||
|   NODE_SET_METHOD(process, "scheduleCallback", ScheduleCallback); | ||||
| 
 | ||||
|   process->Get(v8::String::New("versions"))->ToObject()-> | ||||
|     Set(v8::String::New("atom-shell"), v8::String::New(ATOM_VERSION_STRING)); | ||||
|  | @ -115,7 +133,7 @@ void AtomBindings::Crash(const v8::FunctionCallbackInfo<v8::Value>& args) { | |||
| // static
 | ||||
| void AtomBindings::ActivateUVLoop( | ||||
|     const v8::FunctionCallbackInfo<v8::Value>& args) { | ||||
|   uv_async_send(&dummy_uv_handle); | ||||
|   uv_async_send(&g_dummy_uv_handle); | ||||
| } | ||||
| 
 | ||||
| // static
 | ||||
|  | @ -146,4 +164,12 @@ void AtomBindings::GetCurrentStackTrace( | |||
|   args.GetReturnValue().Set(result); | ||||
| } | ||||
| 
 | ||||
| // static
 | ||||
| void AtomBindings::ScheduleCallback( | ||||
|     const v8::FunctionCallbackInfo<v8::Value>& args) { | ||||
|   if (!FromV8Arguments(args, &g_v8_callback)) | ||||
|     return node::ThrowTypeError("Bad arguments"); | ||||
|   uv_async_send(&g_callback_uv_handle); | ||||
| } | ||||
| 
 | ||||
| }  // namespace atom
 | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ class AtomBindings { | |||
|   static void Log(const v8::FunctionCallbackInfo<v8::Value>& args); | ||||
|   static void GetCurrentStackTrace( | ||||
|       const v8::FunctionCallbackInfo<v8::Value>& args); | ||||
|   static void ScheduleCallback(const v8::FunctionCallbackInfo<v8::Value>& args); | ||||
| 
 | ||||
|   DISALLOW_COPY_AND_ASSIGN(AtomBindings); | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cheng Zhao
				Cheng Zhao