• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The Chromium 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 MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
7 
8 #include <unordered_map>
9 
10 #include "base/callback.h"
11 #include "base/macros.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/threading/thread_checker.h"
14 #include "mojo/public/cpp/system/core.h"
15 
16 namespace mojo {
17 
18 // SyncHandleRegistry is a thread-local storage to register handles that want to
19 // be watched together.
20 //
21 // This class is not thread safe.
22 class SyncHandleRegistry : public base::RefCounted<SyncHandleRegistry> {
23  public:
24   // Returns a thread-local object.
25   static scoped_refptr<SyncHandleRegistry> current();
26 
27   using HandleCallback = base::Callback<void(MojoResult)>;
28   bool RegisterHandle(const Handle& handle,
29                       MojoHandleSignals handle_signals,
30                       const HandleCallback& callback);
31 
32   void UnregisterHandle(const Handle& handle);
33 
34   // Waits on all the registered handles and runs callbacks synchronously for
35   // those ready handles.
36   // The method:
37   //   - returns true when any element of |should_stop| is set to true;
38   //   - returns false when any error occurs.
39   bool WatchAllHandles(const bool* should_stop[], size_t count);
40 
41  private:
42   friend class base::RefCounted<SyncHandleRegistry>;
43 
44   struct HandleHasher {
operatorHandleHasher45     size_t operator()(const Handle& handle) const {
46       return std::hash<uint32_t>()(static_cast<uint32_t>(handle.value()));
47     }
48   };
49   using HandleMap = std::unordered_map<Handle, HandleCallback, HandleHasher>;
50 
51   SyncHandleRegistry();
52   ~SyncHandleRegistry();
53 
54   HandleMap handles_;
55 
56   ScopedHandle wait_set_handle_;
57 
58   base::ThreadChecker thread_checker_;
59 
60   DISALLOW_COPY_AND_ASSIGN(SyncHandleRegistry);
61 };
62 
63 }  // namespace mojo
64 
65 #endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
66