summaryrefslogtreecommitdiffstats
path: root/libs/hwui/PathCache.h
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2013-03-11 20:48:31 -0700
committerRomain Guy <romainguy@google.com>2013-03-12 15:06:42 -0700
commit5dc7fa709646799a5207a5d217f70aa02bf4a3aa (patch)
tree3ebf45fa51bd0373f77aa451868df2d6ae1a8a87 /libs/hwui/PathCache.h
parent8818d84a3540de6e53e5d82e2112292102574118 (diff)
downloadframeworks_base-5dc7fa709646799a5207a5d217f70aa02bf4a3aa.zip
frameworks_base-5dc7fa709646799a5207a5d217f70aa02bf4a3aa.tar.gz
frameworks_base-5dc7fa709646799a5207a5d217f70aa02bf4a3aa.tar.bz2
Add TaskManager API
This API can be used to run arbitrary tasks on a pool of worker threads. The number of threads is calculated based on the number of CPU cores available. The API is made of 3 classes: TaskManager Creates and manages the worker threads. Task Describes the work to be done and the type of the output. A task contains a future used to wait for the worker thread to be done computing the result of the task. TaskProcessor The processor dispatches tasks to the TaskManager and is responsible for performing the computation required by each task. A processor will only be asked to process tasks sent to the manager through the processor. A typical use case: class MyTask: Task<MyType> class MyProcessor: TaskProcessor<MyType> TaskManager m = new TaskManager(); MyProcessor p = new MyProcessor(m); MyTask t = new MyTask(); p.add(t); // Waits until the result is available MyType result = t->getResult(); Change-Id: I1fe845ba4c49bb0e1b0627ab147f9a861c8e0749
Diffstat (limited to 'libs/hwui/PathCache.h')
-rw-r--r--libs/hwui/PathCache.h39
1 files changed, 21 insertions, 18 deletions
diff --git a/libs/hwui/PathCache.h b/libs/hwui/PathCache.h
index 1d28ecb..27031a5 100644
--- a/libs/hwui/PathCache.h
+++ b/libs/hwui/PathCache.h
@@ -23,6 +23,8 @@
#include "Debug.h"
#include "ShapeCache.h"
#include "thread/Signal.h"
+#include "thread/Task.h"
+#include "thread/TaskProcessor.h"
class SkPaint;
class SkPath;
@@ -100,32 +102,33 @@ public:
void precache(SkPath* path, SkPaint* paint);
private:
- class PrecacheThread: public Thread {
+ class PathTask: public Task<SkBitmap*> {
public:
- PrecacheThread(): mSignal(Condition::WAKE_UP_ONE) { }
+ PathTask(SkPath* path, SkPaint* paint, PathTexture* texture):
+ path(path), paint(paint), texture(texture) {
+ }
- void addTask(PathTexture* texture, SkPath* path, SkPaint* paint);
- void exit();
+ ~PathTask() {
+ delete future()->get();
+ }
- private:
- struct Task {
- PathTexture* texture;
- SkPath* path;
- SkPaint* paint;
- };
+ SkPath* path;
+ SkPaint* paint;
+ PathTexture* texture;
+ };
- virtual bool threadLoop();
+ class PathProcessor: public TaskProcessor<SkBitmap*> {
+ public:
+ PathProcessor(Caches& caches);
+ ~PathProcessor() { }
- // Lock for the list of tasks
- Mutex mLock;
- Vector<Task> mTasks;
+ virtual void onProcess(const sp<Task<SkBitmap*> >& task);
- // Signal used to wake up the thread when a new
- // task is available in the list
- mutable Signal mSignal;
+ private:
+ uint32_t mMaxTextureSize;
};
- sp<PrecacheThread> mThread;
+ sp<PathProcessor> mProcessor;
Vector<SkPath*> mGarbage;
mutable Mutex mLock;
}; // class PathCache