* commit 'af6eaf656ec0de5fcbea03968daffe2c845e2089': Fix ANR caused by hwuiTask thread
This commit is contained in:
@@ -493,7 +493,9 @@ void PathCache::precache(const SkPath* path, const SkPaint* paint) {
|
|||||||
if (mProcessor == NULL) {
|
if (mProcessor == NULL) {
|
||||||
mProcessor = new PathProcessor(Caches::getInstance());
|
mProcessor = new PathProcessor(Caches::getInstance());
|
||||||
}
|
}
|
||||||
mProcessor->add(task);
|
if (!mProcessor->add(task)) {
|
||||||
|
mProcessor->process(task);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -385,7 +385,9 @@ void TessellationCache::precacheShadows(const Matrix4* drawTransform, const Rect
|
|||||||
if (mShadowProcessor == NULL) {
|
if (mShadowProcessor == NULL) {
|
||||||
mShadowProcessor = new ShadowProcessor(Caches::getInstance());
|
mShadowProcessor = new ShadowProcessor(Caches::getInstance());
|
||||||
}
|
}
|
||||||
mShadowProcessor->add(task);
|
if (!mShadowProcessor->add(task)) {
|
||||||
|
mShadowProcessor->process(task);
|
||||||
|
}
|
||||||
|
|
||||||
task->incStrong(NULL); // not using sp<>s, so manually ref while in the cache
|
task->incStrong(NULL); // not using sp<>s, so manually ref while in the cache
|
||||||
mShadowCache.put(key, task.get());
|
mShadowCache.put(key, task.get());
|
||||||
@@ -421,7 +423,9 @@ TessellationCache::Buffer* TessellationCache::getOrCreateBuffer(
|
|||||||
if (mProcessor == NULL) {
|
if (mProcessor == NULL) {
|
||||||
mProcessor = new TessellationProcessor(Caches::getInstance());
|
mProcessor = new TessellationProcessor(Caches::getInstance());
|
||||||
}
|
}
|
||||||
mProcessor->add(task);
|
if (!mProcessor->add(task)) {
|
||||||
|
mProcessor->process(task);
|
||||||
|
}
|
||||||
mCache.put(entry, buffer);
|
mCache.put(entry, buffer);
|
||||||
}
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
|
|||||||
@@ -105,6 +105,8 @@ bool TaskManager::WorkerThread::threadLoop() {
|
|||||||
bool TaskManager::WorkerThread::addTask(TaskWrapper task) {
|
bool TaskManager::WorkerThread::addTask(TaskWrapper task) {
|
||||||
if (!isRunning()) {
|
if (!isRunning()) {
|
||||||
run(mName.string(), PRIORITY_DEFAULT);
|
run(mName.string(), PRIORITY_DEFAULT);
|
||||||
|
} else if (exitPending()) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex::Autolock l(mLock);
|
Mutex::Autolock l(mLock);
|
||||||
@@ -120,10 +122,6 @@ size_t TaskManager::WorkerThread::getTaskCount() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TaskManager::WorkerThread::exit() {
|
void TaskManager::WorkerThread::exit() {
|
||||||
{
|
|
||||||
Mutex::Autolock l(mLock);
|
|
||||||
mTasks.clear();
|
|
||||||
}
|
|
||||||
requestExit();
|
requestExit();
|
||||||
mSignal.signal();
|
mSignal.signal();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,9 +30,6 @@ public:
|
|||||||
TaskProcessorBase() { }
|
TaskProcessorBase() { }
|
||||||
virtual ~TaskProcessorBase() { };
|
virtual ~TaskProcessorBase() { };
|
||||||
|
|
||||||
private:
|
|
||||||
friend class TaskManager;
|
|
||||||
|
|
||||||
virtual void process(const sp<TaskBase>& task) = 0;
|
virtual void process(const sp<TaskBase>& task) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -44,9 +41,6 @@ public:
|
|||||||
|
|
||||||
bool add(const sp<Task<T> >& task);
|
bool add(const sp<Task<T> >& task);
|
||||||
|
|
||||||
virtual void onProcess(const sp<Task<T> >& task) = 0;
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual void process(const sp<TaskBase>& task) {
|
virtual void process(const sp<TaskBase>& task) {
|
||||||
sp<Task<T> > realTask = static_cast<Task<T>* >(task.get());
|
sp<Task<T> > realTask = static_cast<Task<T>* >(task.get());
|
||||||
// This is the right way to do it but sp<> doesn't play nice
|
// This is the right way to do it but sp<> doesn't play nice
|
||||||
@@ -54,6 +48,8 @@ private:
|
|||||||
onProcess(realTask);
|
onProcess(realTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void onProcess(const sp<Task<T> >& task) = 0;
|
||||||
|
|
||||||
TaskManager* mManager;
|
TaskManager* mManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user