#include "config.h"
#include "core/dom/Microtask.h"
-#include "bindings/v8/V8PerIsolateData.h"
-#include "wtf/Vector.h"
+#include "bindings/core/v8/V8PerIsolateData.h"
+#include "platform/Task.h"
+#include "public/platform/WebThread.h"
+#include <v8.h>
-namespace WebCore {
-
-typedef Vector<MicrotaskCallback> MicrotaskQueue;
-
-static MicrotaskQueue& microtaskQueue()
-{
- DEFINE_STATIC_LOCAL(MicrotaskQueue, microtaskQueue, ());
- return microtaskQueue;
-}
+namespace blink {
void Microtask::performCheckpoint()
{
- V8PerIsolateData* isolateData = V8PerIsolateData::current();
+ v8::Isolate* isolate = v8::Isolate::GetCurrent();
+ V8PerIsolateData* isolateData = V8PerIsolateData::from(isolate);
ASSERT(isolateData);
if (isolateData->recursionLevel() || isolateData->performingMicrotaskCheckpoint())
return;
isolateData->setPerformingMicrotaskCheckpoint(true);
+ isolate->RunMicrotasks();
+ isolateData->setPerformingMicrotaskCheckpoint(false);
+}
- while (!microtaskQueue().isEmpty()) {
- Vector<MicrotaskCallback> microtasks;
- microtasks.swap(microtaskQueue());
- for (size_t i = 0; i < microtasks.size(); ++i) {
- microtasks[i]();
- }
- }
+static void microtaskFunctionCallback(void* data)
+{
+ OwnPtr<WebThread::Task> task = adoptPtr(static_cast<WebThread::Task*>(data));
+ task->run();
+}
- isolateData->setPerformingMicrotaskCheckpoint(false);
+void Microtask::enqueueMicrotask(PassOwnPtr<WebThread::Task> callback)
+{
+ v8::Isolate* isolate = v8::Isolate::GetCurrent();
+ isolate->EnqueueMicrotask(µtaskFunctionCallback, callback.leakPtr());
}
-void Microtask::enqueueMicrotask(MicrotaskCallback callback)
+void Microtask::enqueueMicrotask(const Closure& callback)
{
- microtaskQueue().append(callback);
+ enqueueMicrotask(adoptPtr(new Task(callback)));
}
-} // namespace WebCore
+} // namespace blink