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#include <utils/Vector.h>
245dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
255dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include "Signal.h"
265dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
275dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guynamespace android {
285dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guynamespace uirenderer {
295dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
305dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guytemplate <typename T>
315dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass Task;
325dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskBase;
335dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
345dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guytemplate <typename T>
355dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskProcessor;
365dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskProcessorBase;
375dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
385dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyclass TaskManager {
395dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guypublic:
405dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    TaskManager();
415dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    ~TaskManager();
425dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
435dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    /**
445dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy     * Returns true if this task  manager can run tasks,
455dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy     * false otherwise. This method will typically return
465dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy     * true on a single CPU core device.
475dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy     */
485dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    bool canRunTasks() const;
495dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
50c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy    /**
51c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy     * Stops all allocated threads. Adding tasks will start
52c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy     * the threads again as necessary.
53c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy     */
54c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy    void stop();
55c5cbee7d78513527e89450e6369a30a04b2d5e7aRomain Guy
565dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guyprivate:
575dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    template <typename T>
585dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    friend class TaskProcessor;
595dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
605dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    template<typename T>
615dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    bool addTask(const sp<Task<T> >& task, const sp<TaskProcessor<T> >& processor) {
625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        return addTaskBase(sp<TaskBase>(task), sp<TaskProcessorBase>(processor));
635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    }
645dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
655dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    bool addTaskBase(const sp<TaskBase>& task, const sp<TaskProcessorBase>& processor);
665dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
675dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    struct TaskWrapper {
685dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        TaskWrapper(): mTask(), mProcessor() { }
695dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
705dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        TaskWrapper(const sp<TaskBase>& task, const sp<TaskProcessorBase>& processor):
715dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy            mTask(task), mProcessor(processor) {
725dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        }
735dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
745dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        sp<TaskBase> mTask;
755dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        sp<TaskProcessorBase> mProcessor;
765dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    };
775dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
785dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    class WorkerThread: public Thread {
795dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    public:
805dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        WorkerThread(const String8 name): mSignal(Condition::WAKE_UP_ONE), mName(name) { }
815dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
825dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        bool addTask(TaskWrapper task);
835dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        size_t getTaskCount() const;
845dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        void exit();
855dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
865dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    private:
875dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        virtual bool threadLoop();
885dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
895dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        // Lock for the list of tasks
905dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        mutable Mutex mLock;
915dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        Vector<TaskWrapper> mTasks;
925dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
935dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        // Signal used to wake up the thread when a new
945dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        // task is available in the list
955dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        mutable Signal mSignal;
965dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
975dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        const String8 mName;
985dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    };
995dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
1005dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    Vector<sp<WorkerThread> > mThreads;
1015dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy};
1025dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
1035dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy}; // namespace uirenderer
1045dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy}; // namespace android
1055dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
1065dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#endif // ANDROID_HWUI_TASK_MANAGER_H
107