| OLD | NEW |
| 1 | 1 |
| 2 #if !defined(ADBLOCK_PLUS_JS_ENGINE_INTERNAL_H) | 2 #if !defined(ADBLOCK_PLUS_JS_ENGINE_INTERNAL_H) |
| 3 #define ADBLOCK_PLUS_JS_ENGINE_INTERNAL_H | 3 #define ADBLOCK_PLUS_JS_ENGINE_INTERNAL_H |
| 4 | 4 |
| 5 #include <AdblockPlus/JsEngine.h> | 5 #include <AdblockPlus/JsEngine.h> |
| 6 #include <v8.h> | 6 #include <v8.h> |
| 7 #include <array> | 7 #include <array> |
| 8 #include "AllocatedArray.h" | 8 #include "AllocatedArray.h" |
| 9 #include "Scheduler.h" |
| 9 #include "V8Upgrade.h" | 10 #include "V8Upgrade.h" |
| 10 | 11 |
| 11 class PersistentValueArray | 12 class PersistentValueArray |
| 12 : public AllocatedArray<V8PersistentNG<v8::Value>> | 13 : public AllocatedArray<V8PersistentNG<v8::Value>> |
| 13 { | 14 { |
| 14 typedef AllocatedArray<V8PersistentNG<v8::Value>> Base; | 15 typedef AllocatedArray<V8PersistentNG<v8::Value>> Base; |
| 15 /** | 16 /** |
| 16 * Copy constructor deleted. Allocation is unique to single object. | 17 * Copy constructor deleted. Allocation is unique to single object. |
| 17 */ | 18 */ |
| 18 PersistentValueArray(const PersistentValueArray&); // = delete; | 19 PersistentValueArray(const PersistentValueArray&); // = delete; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 const auto length = Base::Size(); | 54 const auto length = Base::Size(); |
| 54 AllocatedArray<v8::Local<v8::Value>> locals(length); | 55 AllocatedArray<v8::Local<v8::Value>> locals(length); |
| 55 for (size_t i = 0; i < length; ++i) | 56 for (size_t i = 0; i < length; ++i) |
| 56 { | 57 { |
| 57 locals[i] = (*this)[i].Get(isolate); | 58 locals[i] = (*this)[i].Get(isolate); |
| 58 } | 59 } |
| 59 return std::move(locals); | 60 return std::move(locals); |
| 60 } | 61 } |
| 61 }; | 62 }; |
| 62 | 63 |
| 64 struct ImmediateSingleUseThreadType {}; ///< Marker class for scheduling policy |
| 65 extern const ImmediateSingleUseThreadType ImmediateSingleUseThread; ///< Dummy c
onstant for scheduling policy |
| 66 |
| 63 /** | 67 /** |
| 64 * \par Implementation Notes | 68 * \par Implementation Notes |
| 65 */ | 69 */ |
| 66 class JsEngineInternal | 70 class JsEngineInternal |
| 67 : public AdblockPlus::JsEngine | 71 : public AdblockPlus::JsEngine |
| 68 { | 72 { |
| 69 /** | 73 /** |
| 70 * Unique context associated with this isolate. | 74 * Unique context associated with this isolate. |
| 71 */ | 75 */ |
| 72 v8::Persistent<v8::Context> context; | 76 v8::Persistent<v8::Context> context; |
| 73 | 77 |
| 78 /** |
| 79 * A task within our scheduler. |
| 80 * |
| 81 * TODO: Move this class into the scheduler proper. |
| 82 */ |
| 83 class Task |
| 84 { |
| 85 /** |
| 86 * Shared pointer to our engine keeps it in existence |
| 87 * for the duration of the execution of this task. |
| 88 */ |
| 89 AdblockPlus::JsEnginePtr engine; |
| 90 /** |
| 91 * The body of the task, containing its main function. |
| 92 * This is the class where tasks are heap-allocated for polymorphism. |
| 93 */ |
| 94 std::shared_ptr<TaskFunctionInterface> body; |
| 95 |
| 96 public: |
| 97 /** |
| 98 * Constructor makes a new shared pointer to the engine |
| 99 * but copies the task body. |
| 100 */ |
| 101 Task(JsEngineInternal* engine, std::shared_ptr<TaskFunctionInterface>&& body
) |
| 102 : engine(engine->shared_from_this()), body(body) |
| 103 {} |
| 104 |
| 105 /* |
| 106 * Call operator allows conversion to std::function<void()> so that |
| 107 * we don't have to change the scheduler just yet. |
| 108 */ |
| 109 void operator()() |
| 110 { |
| 111 if (body) |
| 112 { |
| 113 body->operator()(); |
| 114 } |
| 115 } |
| 116 }; |
| 117 |
| 118 /** |
| 119 * Scheduler for tasks executed under the current engine. |
| 120 */ |
| 121 SchedulerT<SingleUseWorker> scheduler; |
| 122 |
| 123 /** |
| 124 * Schedule a task, internal version. |
| 125 * |
| 126 * This version relies upon the external version of this function |
| 127 * to allocate a shared pointer to the task. |
| 128 * |
| 129 * @param task |
| 130 * Task to execute. All v8 handles must refer to the present engine. |
| 131 * @param ImmediateSingleUseThreadType |
| 132 * The schedule policy--create a new thread and discard it afterwards. |
| 133 */ |
| 134 void ScheduleTaskInternal(std::shared_ptr<TaskFunctionInterface>&& body); |
| 135 |
| 74 public: | 136 public: |
| 75 JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolate); | 137 JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolate); |
| 76 | 138 |
| 77 /** | 139 /** |
| 78 * Retrieve our persistent v8 context as a local handle. | 140 * Retrieve our persistent v8 context as a local handle. |
| 79 */ | 141 */ |
| 80 v8::Local<v8::Context> GetContextAsLocal() const; | 142 v8::Local<v8::Context> GetContextAsLocal() const; |
| 81 | 143 |
| 82 /** | 144 /** |
| 83 * Retrieve the global object of our context. | 145 * Retrieve the global object of our context. |
| 84 */ | 146 */ |
| 85 v8::Local<v8::Object> GetGlobalObject(); | 147 v8::Local<v8::Object> GetGlobalObject(); |
| 86 | 148 |
| 87 /** | 149 /** |
| 150 * Schedule a task with these policies: |
| 151 * - timing policy: start execution immediately. |
| 152 * - threading policy: run the task in a single-use thread. |
| 153 * |
| 154 * @param task |
| 155 * Task to execute. All v8 handles must refer to the present engine. |
| 156 * @param ImmediateSingleUseThreadType |
| 157 * The schedule policy--create a new thread and discard it afterwards. |
| 158 */ |
| 159 template<class T> |
| 160 void ScheduleTask(T&& task, ImmediateSingleUseThreadType) |
| 161 { |
| 162 ScheduleTaskInternal(std::static_pointer_cast<TaskFunctionInterface>(std::ma
ke_shared<T>(task))); |
| 163 } |
| 164 |
| 165 /** |
| 166 * Block until there are no more tasks running in the scheduler. |
| 167 * |
| 168 * Note: this function does not prevent new tasks from being scheduled. |
| 169 */ |
| 170 void WaitForQuietScheduler(); |
| 171 |
| 172 /** |
| 88 * Create a JavaScript function that binds to a C++ callback. | 173 * Create a JavaScript function that binds to a C++ callback. |
| 89 * | 174 * |
| 90 * We save a copy of a pointer to the present instance when we | 175 * We save a copy of a pointer to the present instance when we |
| 91 * create the JS function inside the v8 isolate. | 176 * create the JS function inside the v8 isolate. |
| 92 * This pointer is accessible through the `v8::Arguments` class, | 177 * This pointer is accessible through the `v8::Arguments` class, |
| 93 * which is the argument of the callback function. | 178 * which is the argument of the callback function. |
| 94 * The isolate pointer is already available; | 179 * The isolate pointer is already available; |
| 95 * the engine pointer is available if its services are needed. | 180 * the engine pointer is available if its services are needed. |
| 96 * | 181 * |
| 97 * @param callback C++ callback to invoke. | 182 * @param callback C++ callback to invoke. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 */ | 252 */ |
| 168 const v8::HandleScope handleScope; | 253 const v8::HandleScope handleScope; |
| 169 const v8::Context::Scope contextScope; | 254 const v8::Context::Scope contextScope; |
| 170 public: | 255 public: |
| 171 V8ExecutionScope(JsEngineInternal* engine); | 256 V8ExecutionScope(JsEngineInternal* engine); |
| 172 }; | 257 }; |
| 173 | 258 |
| 174 | 259 |
| 175 | 260 |
| 176 #endif | 261 #endif |
| OLD | NEW |