// Copyright (c) 2013 GitHub, Inc. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ATOM_COMMON_NODE_BINDINGS_H_ #define ATOM_COMMON_NODE_BINDINGS_H_ #include "base/basictypes.h" #include "base/memory/weak_ptr.h" #include "v8/include/v8.h" #include "vendor/node/deps/uv/include/uv.h" namespace base { class MessageLoop; } namespace node { class Environment; } namespace atom { class NodeBindings { public: static NodeBindings* Create(bool is_browser); virtual ~NodeBindings(); // Setup V8, libuv. virtual void Initialize(); // Create the environment and load node.js. virtual node::Environment* CreateEnvironment(v8::Handle context); // Prepare for message loop integration. virtual void PrepareMessageLoop(); // Do message loop integration. virtual void RunMessageLoop(); protected: explicit NodeBindings(bool is_browser); // Called to poll events in new thread. virtual void PollEvents() = 0; // Run the libuv loop for once. void UvRunOnce(); // Make the main thread run libuv loop. void WakeupMainThread(); // Interrupt the PollEvents. void WakeupEmbedThread(); // Are we running in browser. bool is_browser_; // Main thread's MessageLoop. base::MessageLoop* message_loop_; // Main thread's libuv loop. uv_loop_t* uv_loop_; private: // Thread to poll uv events. static void EmbedThreadRunner(void *arg); // Do idle GC. static void IdleCallback(uv_timer_t*, int); // Whether the libuv loop has ended. bool embed_closed_; // Dummy handle to make uv's loop not quit. uv_async_t dummy_uv_handle_; // Timer to do idle GC. uv_timer_t idle_timer_; // Thread for polling events. uv_thread_t embed_thread_; // Semaphore to wait for main loop in the embed thread. uv_sem_t embed_sem_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(NodeBindings); }; } // namespace atom #endif // ATOM_COMMON_NODE_BINDINGS_H_