OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_CORE_IMPL_H_ | 5 #ifndef MOJO_SYSTEM_CORE_IMPL_H_ |
6 #define MOJO_SYSTEM_CORE_IMPL_H_ | 6 #define MOJO_SYSTEM_CORE_IMPL_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/synchronization/lock.h" | 12 #include "base/synchronization/lock.h" |
13 #include "mojo/public/system/core_private.h" | 13 #include "mojo/public/system/core_private.h" |
14 #include "mojo/system/system_impl_export.h" | 14 #include "mojo/system/system_impl_export.h" |
15 | 15 |
16 namespace mojo { | 16 namespace mojo { |
17 | 17 |
18 namespace embedder { | |
19 void Init(); // So it can be friended. | |
20 } | |
21 | |
22 namespace system { | 18 namespace system { |
23 | 19 |
24 class CoreImpl; | 20 class CoreImpl; |
25 class Dispatcher; | 21 class Dispatcher; |
26 | 22 |
27 namespace test { | |
28 class CoreTestBase; | |
29 } | |
30 | |
31 // |CoreImpl| is a singleton object that implements the Mojo system calls. All | 23 // |CoreImpl| is a singleton object that implements the Mojo system calls. All |
32 // public methods are thread-safe. | 24 // public methods are thread-safe. |
33 class MOJO_SYSTEM_IMPL_EXPORT CoreImpl : public Core { | 25 class MOJO_SYSTEM_IMPL_EXPORT CoreImpl : public Core { |
34 public: | 26 public: |
35 static void Init(); | 27 // These methods are only to be used by via the embedder API. |
| 28 CoreImpl(); |
| 29 virtual ~CoreImpl(); |
| 30 MojoHandle AddDispatcher(const scoped_refptr<Dispatcher>& dispatcher); |
36 | 31 |
37 // |CorePrivate| implementation: | 32 // |CorePrivate| implementation: |
38 virtual MojoTimeTicks GetTimeTicksNow() OVERRIDE; | 33 virtual MojoTimeTicks GetTimeTicksNow() OVERRIDE; |
39 virtual MojoResult Close(MojoHandle handle) OVERRIDE; | 34 virtual MojoResult Close(MojoHandle handle) OVERRIDE; |
40 virtual MojoResult Wait(MojoHandle handle, | 35 virtual MojoResult Wait(MojoHandle handle, |
41 MojoWaitFlags flags, | 36 MojoWaitFlags flags, |
42 MojoDeadline deadline) OVERRIDE; | 37 MojoDeadline deadline) OVERRIDE; |
43 virtual MojoResult WaitMany(const MojoHandle* handles, | 38 virtual MojoResult WaitMany(const MojoHandle* handles, |
44 const MojoWaitFlags* flags, | 39 const MojoWaitFlags* flags, |
45 uint32_t num_handles, | 40 uint32_t num_handles, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 uint32_t* num_bytes, | 73 uint32_t* num_bytes, |
79 MojoReadDataFlags flags) OVERRIDE; | 74 MojoReadDataFlags flags) OVERRIDE; |
80 virtual MojoResult BeginReadData(MojoHandle data_pipe_consumer_handle, | 75 virtual MojoResult BeginReadData(MojoHandle data_pipe_consumer_handle, |
81 const void** buffer, | 76 const void** buffer, |
82 uint32_t* buffer_num_bytes, | 77 uint32_t* buffer_num_bytes, |
83 MojoReadDataFlags flags) OVERRIDE; | 78 MojoReadDataFlags flags) OVERRIDE; |
84 virtual MojoResult EndReadData(MojoHandle data_pipe_consumer_handle, | 79 virtual MojoResult EndReadData(MojoHandle data_pipe_consumer_handle, |
85 uint32_t num_bytes_read) OVERRIDE; | 80 uint32_t num_bytes_read) OVERRIDE; |
86 | 81 |
87 private: | 82 private: |
88 friend void embedder::Init(); | |
89 friend class test::CoreTestBase; | |
90 | |
91 // The |busy| member is used only to deal with functions (in particular | 83 // The |busy| member is used only to deal with functions (in particular |
92 // |WriteMessage()|) that want to hold on to a dispatcher and later remove it | 84 // |WriteMessage()|) that want to hold on to a dispatcher and later remove it |
93 // from the handle table, without holding on to the handle table lock. | 85 // from the handle table, without holding on to the handle table lock. |
94 // | 86 // |
95 // For example, if |WriteMessage()| is called with a handle to be sent, (under | 87 // For example, if |WriteMessage()| is called with a handle to be sent, (under |
96 // the handle table lock) it must first check that that handle is not busy (if | 88 // the handle table lock) it must first check that that handle is not busy (if |
97 // it is busy, then it fails with |MOJO_RESULT_BUSY|) and then marks it as | 89 // it is busy, then it fails with |MOJO_RESULT_BUSY|) and then marks it as |
98 // busy. To avoid deadlock, it should also try to acquire the locks for all | 90 // busy. To avoid deadlock, it should also try to acquire the locks for all |
99 // the dispatchers for the handles that it is sending (and fail with | 91 // the dispatchers for the handles that it is sending (and fail with |
100 // |MOJO_RESULT_BUSY| if the attempt fails). At this point, it can release the | 92 // |MOJO_RESULT_BUSY| if the attempt fails). At this point, it can release the |
(...skipping 15 matching lines...) Expand all Loading... |
116 struct HandleTableEntry { | 108 struct HandleTableEntry { |
117 HandleTableEntry(); | 109 HandleTableEntry(); |
118 explicit HandleTableEntry(const scoped_refptr<Dispatcher>& dispatcher); | 110 explicit HandleTableEntry(const scoped_refptr<Dispatcher>& dispatcher); |
119 ~HandleTableEntry(); | 111 ~HandleTableEntry(); |
120 | 112 |
121 scoped_refptr<Dispatcher> dispatcher; | 113 scoped_refptr<Dispatcher> dispatcher; |
122 bool busy; | 114 bool busy; |
123 }; | 115 }; |
124 typedef base::hash_map<MojoHandle, HandleTableEntry> HandleTableMap; | 116 typedef base::hash_map<MojoHandle, HandleTableEntry> HandleTableMap; |
125 | 117 |
126 CoreImpl(); | |
127 virtual ~CoreImpl(); | |
128 | |
129 // Looks up the dispatcher for the given handle. Returns null if the handle is | 118 // Looks up the dispatcher for the given handle. Returns null if the handle is |
130 // invalid. | 119 // invalid. |
131 scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle); | 120 scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle); |
132 | 121 |
133 // Assigns a new handle for the given dispatcher (which must be valid); | 122 // Assigns a new handle for the given dispatcher (which must be valid); |
134 // returns |MOJO_HANDLE_INVALID| on failure (due to hitting resource limits). | 123 // returns |MOJO_HANDLE_INVALID| on failure (due to hitting resource limits). |
135 // Must be called under |handle_table_lock_|. | 124 // Must be called under |handle_table_lock_|. |
136 MojoHandle AddDispatcherNoLock(const scoped_refptr<Dispatcher>& dispatcher); | 125 MojoHandle AddDispatcherNoLock(const scoped_refptr<Dispatcher>& dispatcher); |
137 | 126 |
138 // Internal implementation of |Wait()| and |WaitMany()|; doesn't do basic | 127 // Internal implementation of |Wait()| and |WaitMany()|; doesn't do basic |
(...skipping 14 matching lines...) Expand all Loading... |
153 // --------------------------------------------------------------------------- | 142 // --------------------------------------------------------------------------- |
154 | 143 |
155 DISALLOW_COPY_AND_ASSIGN(CoreImpl); | 144 DISALLOW_COPY_AND_ASSIGN(CoreImpl); |
156 }; | 145 }; |
157 | 146 |
158 } // namespace system | 147 } // namespace system |
159 | 148 |
160 } // namespace mojo | 149 } // namespace mojo |
161 | 150 |
162 #endif // MOJO_SYSTEM_CORE_IMPL_H_ | 151 #endif // MOJO_SYSTEM_CORE_IMPL_H_ |
OLD | NEW |