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