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