action_processor.h revision aea4c1cea20dda7ae7e85fc8924a2d784f70d806
1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2011 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 1649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 17cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#ifndef UPDATE_ENGINE_ACTION_PROCESSOR_H_ 18cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#define UPDATE_ENGINE_ACTION_PROCESSOR_H_ 1949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <deque> 2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 2205735a1879a553153458aae0a25fa5d42e3e408fBen Chan#include <base/macros.h> 2349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 24a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen#include "update_engine/error_code.h" 25a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen 2649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// The structure of these classes (Action, ActionPipe, ActionProcessor, etc.) 2749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// is based on the KSAction* classes from the Google Update Engine code at 2849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// http://code.google.com/p/update-engine/ . The author of this file sends 2949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// a big thanks to that team for their high quality design, implementation, 3049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// and documentation. 3149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 32072359ca138504065e1e0c1189eb38c09576d324Alex Vakulenko// See action.h for an overview of this class and other Action* classes. 3349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// An ActionProcessor keeps a queue of Actions and processes them in order. 3549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine { 3749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass AbstractAction; 3949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass ActionProcessorDelegate; 4049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 4149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass ActionProcessor { 4249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 4349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ActionProcessor(); 4449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 45f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov virtual ~ActionProcessor(); 4649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 4749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Starts processing the first Action in the queue. If there's a delegate, 4849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // when all processing is complete, ProcessingDone() will be called on the 4949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // delegate. 50f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov virtual void StartProcessing(); 5149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Aborts processing. If an Action is running, it will have 5349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // TerminateProcessing() called on it. The Action that was running 5449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // will be lost and must be re-enqueued if this Processor is to use it. 5549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com void StopProcessing(); 5649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Returns true iff an Action is currently processing. 5888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko bool IsRunning() const { return nullptr != current_action_; } 5949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 6049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Adds another Action to the end of the queue. 61f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov virtual void EnqueueAction(AbstractAction* action); 6249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 6388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko // Sets/gets the current delegate. Set to null to remove a delegate. 64f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov ActionProcessorDelegate* delegate() const { return delegate_; } 6549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com void set_delegate(ActionProcessorDelegate *delegate) { 6649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com delegate_ = delegate; 6749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 6849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 6949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Returns a pointer to the current Action that's processing. 7049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com AbstractAction* current_action() const { 7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com return current_action_; 7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com } 7349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 7449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Called by an action to notify processor that it's done. Caller passes self. 75a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen void ActionComplete(AbstractAction* actionptr, ErrorCode code); 7649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 7749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com private: 7849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Actions that have not yet begun processing, in the order in which 7949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // they'll be processed. 8049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com std::deque<AbstractAction*> actions_; 8149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 82072359ca138504065e1e0c1189eb38c09576d324Alex Vakulenko // A pointer to the currently processing Action, if any. 8349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com AbstractAction* current_action_; 8449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 8588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko // A pointer to the delegate, or null if none. 8649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com ActionProcessorDelegate *delegate_; 8749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com DISALLOW_COPY_AND_ASSIGN(ActionProcessor); 8849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 8949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 9049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// A delegate object can be used to be notified of events that happen 9149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// in an ActionProcessor. An instance of this class can be passed to an 9249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// ActionProcessor to register itself. 9349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass ActionProcessorDelegate { 9449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public: 95e89487039d0eca8130d822cabf75a729609509e0Alex Deymo virtual ~ActionProcessorDelegate() = default; 96e89487039d0eca8130d822cabf75a729609509e0Alex Deymo 9749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Called when all processing in an ActionProcessor has completed. A pointer 98c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov // to the ActionProcessor is passed. |code| is set to the exit code of the 99c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov // last completed action. 100c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov virtual void ProcessingDone(const ActionProcessor* processor, 101a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode code) {} 10249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 10349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Called when processing has stopped. Does not mean that all Actions have 10449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // completed. If/when all Actions complete, ProcessingDone() will be called. 10549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com virtual void ProcessingStopped(const ActionProcessor* processor) {} 10649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 10749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // Called whenever an action has finished processing, either successfully 10849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com // or otherwise. 109c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com virtual void ActionCompleted(ActionProcessor* processor, 110c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com AbstractAction* action, 111a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode code) {} 11249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}; 11349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 11449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} // namespace chromeos_update_engine 11549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 116cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#endif // UPDATE_ENGINE_ACTION_PROCESSOR_H_ 117