TaskManager.h revision b251a2f51e636d036598ad27473b9cc55fdac1d7
15dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy/* 25dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * Copyright (C) 2013 The Android Open Source Project 35dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * 45dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 55dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * you may not use this file except in compliance with the License. 65dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * You may obtain a copy of the License at 75dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * 85dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 95dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * 105dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * Unless required by applicable law or agreed to in writing, software 115dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 125dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * See the License for the specific language governing permissions and 145dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * limitations under the License. 155dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy */ 165dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 175dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#ifndef ANDROID_HWUI_TASK_MANAGER_H 185dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#define ANDROID_HWUI_TASK_MANAGER_H 195dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 205dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include <utils/Mutex.h> 215dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include <utils/String8.h> 225dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include <utils/Thread.h> 235dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 245dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include "Signal.h" 255dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 26272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector> 27272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck 285dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guynamespace android { 295dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guynamespace uirenderer { 305dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 315dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guytemplate <typename T> 325dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass Task; 335dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskBase; 345dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 355dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guytemplate <typename T> 365dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskProcessor; 375dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskProcessorBase; 385dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 395dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskManager { 405dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guypublic: 415dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy TaskManager(); 425dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy ~TaskManager(); 435dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 445dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy /** 455dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * Returns true if this task manager can run tasks, 465dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy * false otherwise. This method will typically return 4778dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy * false on a single CPU core device. 485dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy */ 495dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy bool canRunTasks() const; 505dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 51c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy /** 52c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy * Stops all allocated threads. Adding tasks will start 53c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy * the threads again as necessary. 54c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy */ 55c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy void stop(); 56c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy 575dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyprivate: 585dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy template <typename T> 595dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy friend class TaskProcessor; 605dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 615dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy template<typename T> 625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy bool addTask(const sp<Task<T> >& task, const sp<TaskProcessor<T> >& processor) { 635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy return addTaskBase(sp<TaskBase>(task), sp<TaskProcessorBase>(processor)); 645dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy } 655dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 665dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy bool addTaskBase(const sp<TaskBase>& task, const sp<TaskProcessorBase>& processor); 675dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 685dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy struct TaskWrapper { 695dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy TaskWrapper(): mTask(), mProcessor() { } 705dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 715dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy TaskWrapper(const sp<TaskBase>& task, const sp<TaskProcessorBase>& processor): 725dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy mTask(task), mProcessor(processor) { 735dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy } 745dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 755dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy sp<TaskBase> mTask; 765dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy sp<TaskProcessorBase> mProcessor; 775dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy }; 785dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 795dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy class WorkerThread: public Thread { 805dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy public: 815dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy WorkerThread(const String8 name): mSignal(Condition::WAKE_UP_ONE), mName(name) { } 825dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 83b251a2f51e636d036598ad27473b9cc55fdac1d7Chris Craik bool addTask(const TaskWrapper& task); 845dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy size_t getTaskCount() const; 855dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy void exit(); 865dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 875dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy private: 88e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual status_t readyToRun() override; 89e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual bool threadLoop() override; 905dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 915dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy // Lock for the list of tasks 925dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy mutable Mutex mLock; 93272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck std::vector<TaskWrapper> mTasks; 945dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 955dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy // Signal used to wake up the thread when a new 965dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy // task is available in the list 975dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy mutable Signal mSignal; 985dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 995dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy const String8 mName; 1005dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy }; 1015dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 102272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck std::vector<sp<WorkerThread> > mThreads; 1035dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy}; 1045dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 1055dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy}; // namespace uirenderer 1065dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy}; // namespace android 1075dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy 1085dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#endif // ANDROID_HWUI_TASK_MANAGER_H 109