• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_DART_PKG_ZIRCON_SDK_EXT_HANDLE_WAITER_H_
6 #define FLUTTER_SHELL_PLATFORM_FUCHSIA_DART_PKG_ZIRCON_SDK_EXT_HANDLE_WAITER_H_
7 
8 #include <lib/async/cpp/wait.h>
9 #include <lib/zx/handle.h>
10 
11 #include "flutter/fml/memory/ref_counted.h"
12 #include "third_party/tonic/dart_wrappable.h"
13 
14 namespace tonic {
15 class DartLibraryNatives;
16 }  // namespace tonic
17 
18 namespace zircon {
19 namespace dart {
20 
21 class Handle;
22 
23 class HandleWaiter : public fml::RefCountedThreadSafe<HandleWaiter>,
24                      public tonic::DartWrappable {
25   DEFINE_WRAPPERTYPEINFO();
26   FML_FRIEND_REF_COUNTED_THREAD_SAFE(HandleWaiter);
27   FML_FRIEND_MAKE_REF_COUNTED(HandleWaiter);
28 
29  public:
30   static fml::RefPtr<HandleWaiter> Create(Handle* handle,
31                                           zx_signals_t signals,
32                                           Dart_Handle callback);
33 
34   void Cancel();
35 
is_pending()36   bool is_pending() { return wait_.is_pending(); }
37 
38   static void RegisterNatives(tonic::DartLibraryNatives* natives);
39 
40  private:
41   explicit HandleWaiter(Handle* handle,
42                         zx_signals_t signals,
43                         Dart_Handle callback);
44   ~HandleWaiter();
45 
46   void OnWaitComplete(async_dispatcher_t* dispatcher,
47                       async::WaitBase* wait,
48                       zx_status_t status,
49                       const zx_packet_signal_t* signal);
50 
RetainDartWrappableReference()51   void RetainDartWrappableReference() const override { AddRef(); }
52 
ReleaseDartWrappableReference()53   void ReleaseDartWrappableReference() const override { Release(); }
54 
55   async::WaitMethod<HandleWaiter, &HandleWaiter::OnWaitComplete> wait_;
56   Handle* handle_;
57   tonic::DartPersistentValue callback_;
58 };
59 
60 }  // namespace dart
61 }  // namespace zircon
62 
63 #endif  // FLUTTER_SHELL_PLATFORM_FUCHSIA_DART_PKG_ZIRCON_SDK_EXT_HANDLE_WAITER_H_
64