+#elif PLATFORM(EFL)
+
+static const double sweepTimeSlice = .01; // seconds
+static const double sweepTimeTotal = .10;
+static const double sweepTimeMultiplier = 1.0 / sweepTimeTotal;
+
+IncrementalSweeper::IncrementalSweeper(JSGlobalData* globalData)
+ : HeapTimer(globalData)
+ , m_enabled(WTF::isMainThread())
+ , m_structuresCanBeSwept(false)
+{
+}
+
+void IncrementalSweeper::doWork()
+{
+ double startTime = WTF::monotonicallyIncreasingTime();
+ while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) {
+ sweepNextBlock();
+
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - startTime;
+ if (elapsedTime < sweepTimeSlice)
+ continue;
+
+ scheduleTimer();
+ return;
+ }
+ m_blocksToSweep.clear();
+ cancelTimer();
+}
+
+void IncrementalSweeper::scheduleTimer()
+{
+ cancelTimer();
+ m_timer = add(sweepTimeSlice * sweepTimeMultiplier, this);
+}
+
+void IncrementalSweeper::cancelTimer()
+{
+ stop();
+}
+
+IncrementalSweeper* IncrementalSweeper::create(Heap* heap)
+{
+ return new IncrementalSweeper(heap->globalData());
+}
+
+void IncrementalSweeper::sweepNextBlock()
+{
+ while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) {
+ MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++];
+ if (block->onlyContainsStructures())
+ m_structuresCanBeSwept = true;
+ else
+ ASSERT(!m_structuresCanBeSwept);
+
+ if (!block->needsSweeping())
+ continue;
+
+ block->sweep();
+ m_globalData->heap.objectSpace().freeOrShrinkBlock(block);
+ return;
+ }
+}
+
+void IncrementalSweeper::startSweeping(const HashSet<MarkedBlock*>& blockSnapshot)
+{
+ if (!isEnabled())
+ return;
+
+ m_blocksToSweep.resize(blockSnapshot.size());
+ CopyFunctor functor(m_blocksToSweep);
+ m_globalData->heap.objectSpace().forEachBlock(functor);
+ m_currentBlockToSweepIndex = 0;
+ m_structuresCanBeSwept = false;
+ scheduleTimer();
+}
+
+void IncrementalSweeper::willFinishSweeping()
+{
+ m_currentBlockToSweepIndex = 0;
+ m_structuresCanBeSwept = true;
+ m_blocksToSweep.clear();
+ if (m_globalData)
+ cancelTimer();
+}