| // Copyright 2018 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef BASE_MESSAGE_PUMP_UI_STARBOARD_H_ |
| #define BASE_MESSAGE_PUMP_UI_STARBOARD_H_ |
| |
| #include <set> |
| |
| #include "base/base_export.h" |
| #include "base/message_loop/message_pump.h" |
| #include "base/run_loop.h" |
| #include "base/synchronization/lock.h" |
| #include "base/time/time.h" |
| #include "starboard/event.h" |
| |
| namespace base { |
| |
| // MessagePump that integrates with the Starboard message pump. Starboard has |
| // its own main loop, so the MessagePumpUIStarboard just piggybacks on that |
| // rather than implementing its own pump. |
| // |
| // To adopt Starboard's message pump, one simply has to create a MessageLoop of |
| // TYPE_UI from the Starboard message pump thread. A traditional place to do |
| // this would be in the kSbEventStart event handler. One has to be sure to keep |
| // the MessageLoop alive for as long as the application wants to use the |
| // Starboard message pump as a MessageLoop. That would typically be for the |
| // entire lifetime of the application, and in that case, the MessageLoop would |
| // traditionally be deleted in the kSbEventStop handler. |
| class BASE_EXPORT MessagePumpUIStarboard : public MessagePump { |
| public: |
| MessagePumpUIStarboard(); |
| virtual ~MessagePumpUIStarboard() {} |
| |
| // Runs one iteration of the run loop, and reschedules another call, if |
| // necessary. |
| void RunOneAndReschedule(bool delayed); |
| |
| // --- MessagePump Implementation --- |
| |
| virtual void Run(Delegate* delegate) override; |
| virtual void Quit() override; |
| virtual void ScheduleWork() override; |
| virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override; |
| virtual void Start(Delegate* delegate); |
| |
| private: |
| // Cancels all outstanding scheduled callback events, if any. |
| void CancelAll(); |
| |
| // Cancels immediate schedule callback events. |
| void CancelImmediate(); |
| |
| // Cancels delayed schedule callback events. |
| void CancelDelayed(); |
| |
| // Cancel workhorse that assumes |outstanding_events_lock_| is locked. |
| void CancelImmediateLocked(); |
| |
| // Cancel delayed workhorse that assumes |outstanding_events_lock_| is locked. |
| void CancelDelayedLocked(); |
| |
| // Runs one iteration of the run loop, returning whether to schedule another |
| // iteration or not. Places the delay, if any, in |out_delayed_work_time|. |
| bool RunOne(base::TimeTicks* out_delayed_work_time); |
| |
| // The top-level RunLoop for the MessageLoopForUI. A MessageLoop needs a |
| // top-level RunLoop to be considered "running." |
| std::unique_ptr<base::RunLoop> run_loop_; |
| |
| // The MessagePump::Delegate configured in Start(). |
| Delegate* delegate_; |
| |
| // Lock protecting outstanding scheduled callback events. |
| base::Lock outstanding_events_lock_; |
| |
| // A set of scheduled callback event IDs. |
| typedef std::set<SbEventId> SbEventIdSet; |
| |
| // The set of outstanding scheduled callback events for immediate work. |
| SbEventIdSet outstanding_events_; |
| |
| // The set of outstanding scheduled callback events for delayed work. |
| SbEventIdSet outstanding_delayed_events_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessagePumpUIStarboard); |
| }; |
| |
| using MessagePumpForUI = MessagePumpUIStarboard; |
| |
| } // namespace base |
| |
| #endif // BASE_MESSAGE_PUMP_UI_STARBOARD_H_ |