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 |