Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MOJO_SYSTEM_HANDLE_TABLE_H_ | 5 #ifndef MOJO_SYSTEM_HANDLE_TABLE_H_ |
| 6 #define MOJO_SYSTEM_HANDLE_TABLE_H_ | 6 #define MOJO_SYSTEM_HANDLE_TABLE_H_ |
| 7 | 7 |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 14 #include "mojo/public/c/system/core.h" | 14 #include "mojo/public/c/system/core.h" |
| 15 #include "mojo/system/system_impl_export.h" | 15 #include "mojo/system/system_impl_export.h" |
| 16 | 16 |
| 17 namespace mojo { | 17 namespace mojo { |
| 18 namespace system { | 18 namespace system { |
| 19 | 19 |
| 20 class CoreImpl; | 20 class Core; |
| 21 class Dispatcher; | 21 class Dispatcher; |
| 22 class DispatcherTransport; | 22 class DispatcherTransport; |
| 23 | 23 |
| 24 // Test-only function (defined/used in embedder/test_embedder.cc). Declared here | 24 // Test-only function (defined/used in embedder/test_embedder.cc). Declared here |
| 25 // so it can be friended. | 25 // so it can be friended. |
| 26 namespace internal { | 26 namespace internal { |
| 27 bool ShutdownCheckNoLeaks(CoreImpl*); | 27 bool ShutdownCheckNoLeaks(Core*); |
| 28 } | 28 } |
| 29 | 29 |
| 30 // This class provides the (global) handle table (owned by |CoreImpl|), which | 30 // This class provides the (global) handle table (owned by |Core|), which |
|
viettrungluu
2014/04/09 20:26:52
Nit: Please re-wrap this paragraph, and the next o
DaveMoore
2014/04/09 22:49:08
Done.
| |
| 31 // maps (valid) |MojoHandle|s to |Dispatcher|s. This is abstracted so that, | 31 // maps (valid) |MojoHandle|s to |Dispatcher|s. This is abstracted so that, |
| 32 // e.g., caching may be added. | 32 // e.g., caching may be added. |
| 33 // | 33 // |
| 34 // This class is NOT thread-safe; locking is left to |CoreImpl| (since it may | 34 // This class is NOT thread-safe; locking is left to |Core| (since it may |
| 35 // need to make several changes -- "atomically" or in rapid successsion, in | 35 // need to make several changes -- "atomically" or in rapid successsion, in |
| 36 // which case the extra locking/unlocking would be unnecessary overhead). | 36 // which case the extra locking/unlocking would be unnecessary overhead). |
| 37 | 37 |
| 38 class MOJO_SYSTEM_IMPL_EXPORT HandleTable { | 38 class MOJO_SYSTEM_IMPL_EXPORT HandleTable { |
| 39 public: | 39 public: |
| 40 HandleTable(); | 40 HandleTable(); |
| 41 ~HandleTable(); | 41 ~HandleTable(); |
| 42 | 42 |
| 43 // Gets the dispatcher for a given handle (which should not be | 43 // Gets the dispatcher for a given handle (which should not be |
| 44 // |MOJO_HANDLE_INVALID|). Returns null if there's no dispatcher for the given | 44 // |MOJO_HANDLE_INVALID|). Returns null if there's no dispatcher for the given |
| 45 // handle. | 45 // handle. |
| 46 // WARNING: For efficiency, this returns a dumb pointer. If you're going to | 46 // WARNING: For efficiency, this returns a dumb pointer. If you're going to |
| 47 // use the result outside |CoreImpl|'s lock, you MUST take a reference (e.g., | 47 // use the result outside |Core|'s lock, you MUST take a reference (e.g., |
|
viettrungluu
2014/04/09 20:26:52
"
DaveMoore
2014/04/09 22:49:08
Done.
| |
| 48 // by storing the result inside a |scoped_refptr|). | 48 // by storing the result inside a |scoped_refptr|). |
| 49 Dispatcher* GetDispatcher(MojoHandle handle); | 49 Dispatcher* GetDispatcher(MojoHandle handle); |
| 50 | 50 |
| 51 // On success, gets the dispatcher for a given handle (which should not be | 51 // On success, gets the dispatcher for a given handle (which should not be |
| 52 // |MOJO_HANDLE_INVALID|) and removes it. (On failure, returns an appropriate | 52 // |MOJO_HANDLE_INVALID|) and removes it. (On failure, returns an appropriate |
| 53 // result (and leaves |dispatcher| alone), namely | 53 // result (and leaves |dispatcher| alone), namely |
| 54 // |MOJO_RESULT_INVALID_ARGUMENT| if there's no dispatcher for the given | 54 // |MOJO_RESULT_INVALID_ARGUMENT| if there's no dispatcher for the given |
| 55 // handle or |MOJO_RESULT_BUSY| if the handle is marked as busy.) | 55 // handle or |MOJO_RESULT_BUSY| if the handle is marked as busy.) |
| 56 MojoResult GetAndRemoveDispatcher(MojoHandle handle, | 56 MojoResult GetAndRemoveDispatcher(MojoHandle handle, |
| 57 scoped_refptr<Dispatcher>* dispatcher); | 57 scoped_refptr<Dispatcher>* dispatcher); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 // Remove the given handles, which must all be present and which should have | 91 // Remove the given handles, which must all be present and which should have |
| 92 // previously been marked busy by |MarkBusyAndStartTransport()|. | 92 // previously been marked busy by |MarkBusyAndStartTransport()|. |
| 93 void RemoveBusyHandles(const MojoHandle* handles, uint32_t num_handles); | 93 void RemoveBusyHandles(const MojoHandle* handles, uint32_t num_handles); |
| 94 | 94 |
| 95 // Restores the given handles, which must all be present and which should have | 95 // Restores the given handles, which must all be present and which should have |
| 96 // previously been marked busy by |MarkBusyAndStartTransport()|, to a non-busy | 96 // previously been marked busy by |MarkBusyAndStartTransport()|, to a non-busy |
| 97 // state. | 97 // state. |
| 98 void RestoreBusyHandles(const MojoHandle* handles, uint32_t num_handles); | 98 void RestoreBusyHandles(const MojoHandle* handles, uint32_t num_handles); |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 friend bool internal::ShutdownCheckNoLeaks(CoreImpl*); | 101 friend bool internal::ShutdownCheckNoLeaks(Core*); |
| 102 | 102 |
| 103 struct Entry { | 103 struct Entry { |
| 104 Entry(); | 104 Entry(); |
| 105 explicit Entry(const scoped_refptr<Dispatcher>& dispatcher); | 105 explicit Entry(const scoped_refptr<Dispatcher>& dispatcher); |
| 106 ~Entry(); | 106 ~Entry(); |
| 107 | 107 |
| 108 scoped_refptr<Dispatcher> dispatcher; | 108 scoped_refptr<Dispatcher> dispatcher; |
| 109 bool busy; | 109 bool busy; |
| 110 }; | 110 }; |
| 111 typedef base::hash_map<MojoHandle, Entry> HandleToEntryMap; | 111 typedef base::hash_map<MojoHandle, Entry> HandleToEntryMap; |
| 112 | 112 |
| 113 // Adds the given dispatcher to the handle table, not doing any size checks. | 113 // Adds the given dispatcher to the handle table, not doing any size checks. |
| 114 MojoHandle AddDispatcherNoSizeCheck( | 114 MojoHandle AddDispatcherNoSizeCheck( |
| 115 const scoped_refptr<Dispatcher>& dispatcher); | 115 const scoped_refptr<Dispatcher>& dispatcher); |
| 116 | 116 |
| 117 HandleToEntryMap handle_to_entry_map_; | 117 HandleToEntryMap handle_to_entry_map_; |
| 118 MojoHandle next_handle_; // Invariant: never |MOJO_HANDLE_INVALID|. | 118 MojoHandle next_handle_; // Invariant: never |MOJO_HANDLE_INVALID|. |
| 119 | 119 |
| 120 DISALLOW_COPY_AND_ASSIGN(HandleTable); | 120 DISALLOW_COPY_AND_ASSIGN(HandleTable); |
| 121 }; | 121 }; |
| 122 | 122 |
| 123 } // namespace system | 123 } // namespace system |
| 124 } // namespace mojo | 124 } // namespace mojo |
| 125 | 125 |
| 126 #endif // MOJO_SYSTEM_HANDLE_TABLE_H_ | 126 #endif // MOJO_SYSTEM_HANDLE_TABLE_H_ |
| OLD | NEW |