TiledPage* m_page;
};
+class OperationFilter
+{
+ public:
+ virtual ~OperationFilter() {}
+ virtual bool check(QueuedOperation* operation) = 0;
+};
+
+class PageFilter : public OperationFilter
+{
+ public:
+ PageFilter(TiledPage* page) : m_page(page) {}
+ virtual bool check(QueuedOperation* operation)
+ {
+ if (operation->page() == m_page)
+ return true;
+ return false;
+ }
+ private:
+ TiledPage* m_page;
+};
+
}
#endif // QueuedOperation_h
void TexturesGenerator::removeOperationsForPage(TiledPage* page)
{
+ removeOperationsForFilter(new PageFilter(page));
+}
+
+void TexturesGenerator::removeOperationsForFilter(OperationFilter* filter)
+{
mRequestedOperationsLock.lock();
- typedef Vector<QueuedOperation*>::const_iterator iterator;
- iterator end = mRequestedOperations.end();
- for (iterator it = mRequestedOperations.begin(); it != end; ++it) {
- QueuedOperation* operation = static_cast<QueuedOperation*>(*it);
- if (operation->page() == page)
- delete *it;
+ for (unsigned int i = 0; i < mRequestedOperations.size();) {
+ QueuedOperation* operation = mRequestedOperations[i];
+ if (filter->check(operation)) {
+ mRequestedOperations.remove(i);
+ delete operation;
+ } else {
+ i++;
+ }
}
+
QueuedOperation* operation = m_currentOperation;
- if (operation && operation->page() != page)
- operation = 0;
- if (operation)
+ if (operation && filter->check(operation))
m_waitForCompletion = true;
+
mRequestedOperationsLock.unlock();
+ delete filter;
- if (!operation)
+ if (!m_waitForCompletion)
return;
// At this point, it means that we are currently painting a operation that
class TexturesGenerator : public Thread {
public:
TexturesGenerator() : Thread()
- , m_waitForCompletion(false) { }
+ , m_waitForCompletion(false)
+ , m_currentOperation(0) { }
virtual ~TexturesGenerator() { }
virtual status_t readyToRun();
void removeOperationsForPage(TiledPage* page);
+ void removeOperationsForFilter(OperationFilter* filter);
void scheduleOperation(QueuedOperation* operation);
android::Condition mRequestedOperationsCond;
android::Mutex m_newRequestLock;
android::Condition m_newRequestCond;
- QueuedOperation* m_currentOperation;
bool m_waitForCompletion;
+ QueuedOperation* m_currentOperation;
};
} // namespace WebCore