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_PROCESSOR_H
185dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#define ANDROID_HWUI_TASK_PROCESSOR_H
195dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
205dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include <utils/RefBase.h>
215dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
225dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include "Task.h"
235dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy#include "TaskManager.h"
245dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
255dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guynamespace android {
265dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guynamespace uirenderer {
275dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
281bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckclass TaskProcessorBase : public RefBase {
295dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guypublic:
301bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    TaskProcessorBase() {}
311bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    virtual ~TaskProcessorBase(){};
325dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
335dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    virtual void process(const sp<TaskBase>& task) = 0;
345dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy};
355dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Recktemplate <typename T>
371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckclass TaskProcessor : public TaskProcessorBase {
385dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guypublic:
391bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    explicit TaskProcessor(TaskManager* manager) : mManager(manager) {}
401bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    virtual ~TaskProcessor() {}
415dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
42dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik    void add(const sp<Task<T> >& task) {
43dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik        if (!addImpl(task)) {
44dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik            // fall back to immediate execution
45dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik            process(task);
46dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik        }
47dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik    }
48dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik
49dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik    virtual void onProcess(const sp<Task<T> >& task) = 0;
50dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik
51dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craikprivate:
52dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craik    bool addImpl(const sp<Task<T> >& task);
535dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
54e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik    virtual void process(const sp<TaskBase>& task) override {
551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        sp<Task<T> > realTask = static_cast<Task<T>*>(task.get());
565dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        // This is the right way to do it but sp<> doesn't play nice
575dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        // sp<Task<T> > realTask = static_cast<sp<Task<T> > >(task);
585dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        onProcess(realTask);
595dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    }
605dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
615dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    TaskManager* mManager;
625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy};
635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
641bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Recktemplate <typename T>
65dee66b6d99dec8bc97843542d5388e50ebd0f6eeChris Craikbool TaskProcessor<T>::addImpl(const sp<Task<T> >& task) {
665dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    if (mManager) {
675dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        sp<TaskProcessor<T> > self(this);
685dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        return mManager->addTask(task, self);
695dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    }
705dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    return false;
715dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy}
725dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
731bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};  // namespace uirenderer
741bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};  // namespace android
755dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
761bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#endif  // ANDROID_HWUI_TASK_PROCESSOR_H
77