Home | History | Annotate | Download | only in lib
      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_LIB_SYNC_HANDLE_REGISTRY_H_
      6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_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 namespace internal {
     18 
     19 // SyncHandleRegistry is a thread-local storage to register handles that want to
     20 // be watched together.
     21 //
     22 // This class is not thread safe.
     23 class SyncHandleRegistry : public base::RefCounted<SyncHandleRegistry> {
     24  public:
     25   // Returns a thread-local object.
     26   static scoped_refptr<SyncHandleRegistry> current();
     27 
     28   using HandleCallback = base::Callback<void(MojoResult)>;
     29   bool RegisterHandle(const Handle& handle,
     30                       MojoHandleSignals handle_signals,
     31                       const HandleCallback& callback);
     32 
     33   void UnregisterHandle(const Handle& handle);
     34 
     35   // Waits on all the registered handles and runs callbacks synchronously for
     36   // those ready handles.
     37   // The method:
     38   //   - returns true when any element of |should_stop| is set to true;
     39   //   - returns false when any error occurs.
     40   bool WatchAllHandles(const bool* should_stop[], size_t count);
     41 
     42  private:
     43   friend class base::RefCounted<SyncHandleRegistry>;
     44 
     45   struct HandleHasher {
     46     size_t operator()(const Handle& handle) const {
     47       return std::hash<uint32_t>()(static_cast<uint32_t>(handle.value()));
     48     }
     49   };
     50   using HandleMap = std::unordered_map<Handle, HandleCallback, HandleHasher>;
     51 
     52   SyncHandleRegistry();
     53   ~SyncHandleRegistry();
     54 
     55   HandleMap handles_;
     56 
     57   ScopedHandle wait_set_handle_;
     58 
     59   base::ThreadChecker thread_checker_;
     60 
     61   DISALLOW_COPY_AND_ASSIGN(SyncHandleRegistry);
     62 };
     63 
     64 }  // namespace internal
     65 }  // namespace mojo
     66 
     67 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SYNC_HANDLE_REGISTRY_H_
     68