| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_FUCHSIA_ASYNC_DISPATCHER_H_ |
| #define BASE_FUCHSIA_ASYNC_DISPATCHER_H_ |
| |
| #include <lib/async/dispatcher.h> |
| #include <lib/async/exception.h> |
| #include <lib/zx/event.h> |
| #include <lib/zx/port.h> |
| #include <lib/zx/timer.h> |
| |
| #include "base/containers/linked_list.h" |
| #include "base/macros.h" |
| #include "base/synchronization/lock.h" |
| #include "base/threading/thread_checker.h" |
| #include "starboard/types.h" |
| |
| namespace base { |
| |
| // Implementation of dispatcher for Fuchsia's async library. It's necessary to |
| // run Fuchsia's library on chromium threads. |
| class BASE_EXPORT AsyncDispatcher : public async_dispatcher_t { |
| public: |
| AsyncDispatcher(); |
| ~AsyncDispatcher(); |
| |
| // Returns after running one or more tasks or waits until |deadline|. |
| // Returns |ZX_OK| if some tasks were executed, |ZX_ERR_TIMED_OUT| - the |
| // deadline expired, |ZX_ERR_CANCELED| - Stop() was called. |
| zx_status_t DispatchOrWaitUntil(zx_time_t deadline); |
| |
| // If Run() is being executed then it will return as soon as possible (e.g. |
| // finishing running the current task), otherwise the following Run() call |
| // will quit immediately instead of waiting until deadline expires. |
| void Stop(); |
| |
| private: |
| class ExceptionState; |
| class WaitState; |
| class TaskState; |
| |
| // ASYNC_OPS_V1 operations. |
| static zx_time_t NowOp(async_dispatcher_t* async); |
| static zx_status_t BeginWaitOp(async_dispatcher_t* async, async_wait_t* wait); |
| static zx_status_t CancelWaitOp(async_dispatcher_t* async, |
| async_wait_t* wait); |
| static zx_status_t PostTaskOp(async_dispatcher_t* async, async_task_t* task); |
| static zx_status_t CancelTaskOp(async_dispatcher_t* async, |
| async_task_t* task); |
| static zx_status_t QueuePacketOp(async_dispatcher_t* async, |
| async_receiver_t* receiver, |
| const zx_packet_user_t* data); |
| static zx_status_t SetGuestBellTrapOp(async_dispatcher_t* async, |
| async_guest_bell_trap_t* trap, |
| zx_handle_t guest, |
| zx_vaddr_t addr, |
| size_t length); |
| |
| // ASYNC_OPS_V2 operations. |
| static zx_status_t BindExceptionPortOp(async_dispatcher_t* dispatcher, |
| async_exception_t* exception); |
| static zx_status_t UnbindExceptionPortOp(async_dispatcher_t* dispatcher, |
| async_exception_t* exception); |
| |
| // async_ops_t implementation. Called by corresponding *Op() methods above. |
| zx_status_t BeginWait(async_wait_t* wait); |
| zx_status_t CancelWait(async_wait_t* wait); |
| zx_status_t PostTask(async_task_t* task); |
| zx_status_t CancelTask(async_task_t* task); |
| zx_status_t BindExceptionPort(async_exception_t* exception); |
| zx_status_t UnbindExceptionPort(async_exception_t* exception); |
| |
| // Runs tasks in |task_list_| that have deadline in the past. |
| void DispatchTasks(); |
| |
| // Must be called while |lock_| is held. |
| void RestartTimerLocked(); |
| |
| THREAD_CHECKER(thread_checker_); |
| |
| zx::port port_; |
| zx::timer timer_; |
| zx::event stop_event_; |
| |
| LinkedList<WaitState> wait_list_; |
| LinkedList<ExceptionState> exception_list_; |
| |
| async_ops_t ops_storage_; |
| |
| // |lock_| must be held when accessing |task_list_|. |
| base::Lock lock_; |
| |
| LinkedList<TaskState> task_list_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AsyncDispatcher); |
| }; |
| |
| } // namespace base |
| |
| #endif // BASE_FUCHSIA_ASYNC_DISPATCHER_H_ |