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_DISPATCHER_H_ | 5 #ifndef MOJO_SYSTEM_DISPATCHER_H_ |
6 #define MOJO_SYSTEM_DISPATCHER_H_ | 6 #define MOJO_SYSTEM_DISPATCHER_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/synchronization/lock.h" | 16 #include "base/synchronization/lock.h" |
17 #include "mojo/embedder/platform_handle.h" | 17 #include "mojo/embedder/platform_handle.h" |
18 #include "mojo/public/c/system/core.h" | 18 #include "mojo/public/c/system/core.h" |
19 #include "mojo/system/system_impl_export.h" | 19 #include "mojo/system/system_impl_export.h" |
20 | 20 |
21 namespace mojo { | 21 namespace mojo { |
22 namespace system { | 22 namespace system { |
23 | 23 |
24 class Channel; | 24 class Channel; |
25 class Core; | 25 class Core; |
26 class Dispatcher; | 26 class Dispatcher; |
27 class DispatcherTransport; | 27 class DispatcherTransport; |
28 class HandleTable; | 28 class HandleTable; |
29 class LocalMessagePipeEndpoint; | 29 class LocalMessagePipeEndpoint; |
30 class MessageInTransit; | |
31 class ProxyMessagePipeEndpoint; | 30 class ProxyMessagePipeEndpoint; |
32 class RawSharedBufferMapping; | 31 class RawSharedBufferMapping; |
| 32 class TransportData; |
33 class Waiter; | 33 class Waiter; |
34 | 34 |
35 namespace test { | 35 namespace test { |
36 | 36 |
37 // Test helper. We need to declare it here so we can friend it. | 37 // Test helper. We need to declare it here so we can friend it. |
38 MOJO_SYSTEM_IMPL_EXPORT DispatcherTransport DispatcherTryStartTransport( | 38 MOJO_SYSTEM_IMPL_EXPORT DispatcherTransport DispatcherTryStartTransport( |
39 Dispatcher* dispatcher); | 39 Dispatcher* dispatcher); |
40 | 40 |
41 } // namespace test | 41 } // namespace test |
42 | 42 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 friend class HandleTable; | 139 friend class HandleTable; |
140 // Tests also need this, to avoid needing |Core|. | 140 // Tests also need this, to avoid needing |Core|. |
141 friend DispatcherTransport test::DispatcherTryStartTransport(Dispatcher*); | 141 friend DispatcherTransport test::DispatcherTryStartTransport(Dispatcher*); |
142 | 142 |
143 // This must be called under the handle table lock and only if the handle | 143 // This must be called under the handle table lock and only if the handle |
144 // table entry is not marked busy. The caller must maintain a reference to | 144 // table entry is not marked busy. The caller must maintain a reference to |
145 // |dispatcher| until |DispatcherTransport::End()| is called. | 145 // |dispatcher| until |DispatcherTransport::End()| is called. |
146 static DispatcherTransport TryStartTransport(Dispatcher* dispatcher); | 146 static DispatcherTransport TryStartTransport(Dispatcher* dispatcher); |
147 }; | 147 }; |
148 | 148 |
149 // A |MessageInTransit| may serialize dispatchers that are attached to it to a | 149 // A |TransportData| may serialize dispatchers that are given to it (and which |
150 // given |Channel| and then (probably in a different process) deserialize. | 150 // were previously attached to the |MessageInTransit| that is creating it) to |
| 151 // a given |Channel| and then (probably in a different process) deserialize. |
151 // Note that the |MessageInTransit| "owns" (i.e., has the only ref to) these | 152 // Note that the |MessageInTransit| "owns" (i.e., has the only ref to) these |
152 // dispatchers, so there are no locking issues. (There's no lock ordering | 153 // dispatchers, so there are no locking issues. (There's no lock ordering |
153 // issue, and in fact no need to take dispatcher locks at all.) | 154 // issue, and in fact no need to take dispatcher locks at all.) |
154 // TODO(vtl): Consider making another wrapper similar to |DispatcherTransport| | 155 // TODO(vtl): Consider making another wrapper similar to |DispatcherTransport| |
155 // (but with an owning, unique reference), and having | 156 // (but with an owning, unique reference), and having |
156 // |CreateEquivalentDispatcherAndCloseImplNoLock()| return that wrapper (and | 157 // |CreateEquivalentDispatcherAndCloseImplNoLock()| return that wrapper (and |
157 // |MessageInTransit| only holding on to such wrappers). | 158 // |MessageInTransit|, etc. only holding on to such wrappers). |
158 class MessageInTransitAccess { | 159 class TransportDataAccess { |
159 private: | 160 private: |
160 friend class MessageInTransit; | 161 friend class TransportData; |
161 | 162 |
162 // Serialization API. These functions may only be called on such | 163 // Serialization API. These functions may only be called on such |
163 // dispatchers. (|channel| is the |Channel| to which the dispatcher is to be | 164 // dispatchers. (|channel| is the |Channel| to which the dispatcher is to be |
164 // serialized.) See the |Dispatcher| methods of the same names for more | 165 // serialized.) See the |Dispatcher| methods of the same names for more |
165 // details. | 166 // details. |
166 static void StartSerialize(Dispatcher* dispatcher, | 167 static void StartSerialize(Dispatcher* dispatcher, |
167 Channel* channel, | 168 Channel* channel, |
168 size_t* max_size, | 169 size_t* max_size, |
169 size_t* max_platform_handles); | 170 size_t* max_platform_handles); |
170 static bool EndSerializeAndClose( | 171 static bool EndSerializeAndClose( |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 void CloseNoLock(); | 280 void CloseNoLock(); |
280 | 281 |
281 // Creates an equivalent dispatcher -- representing the same resource as this | 282 // Creates an equivalent dispatcher -- representing the same resource as this |
282 // dispatcher -- and close (i.e., disable) this dispatcher. I.e., this | 283 // dispatcher -- and close (i.e., disable) this dispatcher. I.e., this |
283 // dispatcher will look as though it was closed, but the resource it | 284 // dispatcher will look as though it was closed, but the resource it |
284 // represents will be assigned to the new dispatcher. This must be called | 285 // represents will be assigned to the new dispatcher. This must be called |
285 // under the dispatcher's lock. | 286 // under the dispatcher's lock. |
286 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseNoLock(); | 287 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseNoLock(); |
287 | 288 |
288 // API to serialize dispatchers to a |Channel|, exposed to only | 289 // API to serialize dispatchers to a |Channel|, exposed to only |
289 // |MessageInTransit| (via |MessageInTransitAccess|). They may only be called | 290 // |TransportData| (via |TransportData|). They may only be called on a |
290 // on a dispatcher attached to a |MessageInTransit| (and in particular not in | 291 // dispatcher attached to a |MessageInTransit| (and in particular not in |
291 // |CoreImpl|'s handle table). | 292 // |CoreImpl|'s handle table). |
292 // | 293 // |
293 // Starts the serialization. Returns (via the two "out" parameters) the | 294 // Starts the serialization. Returns (via the two "out" parameters) the |
294 // maximum amount of space that may be needed to serialize this dispatcher to | 295 // maximum amount of space that may be needed to serialize this dispatcher to |
295 // the given |Channel| (no more than | 296 // the given |Channel| (no more than |
296 // |MessageInTransit::kMaxSerializedDispatcherSize|) and the maximum number of | 297 // |TransportData::kMaxSerializedDispatcherSize|) and the maximum number of |
297 // |PlatformHandle|s that may need to be attached (no more than | 298 // |PlatformHandle|s that may need to be attached (no more than |
298 // |MessageInTransit::kMaxSerializedDispatcherPlatformHandles|). If this | 299 // |TransportData::kMaxSerializedDispatcherPlatformHandles|). If this |
299 // dispatcher cannot be serialized to the given |Channel|, |*max_size| and | 300 // dispatcher cannot be serialized to the given |Channel|, |*max_size| and |
300 // |*max_platform_handles| should be set to zero. A call to this method will | 301 // |*max_platform_handles| should be set to zero. A call to this method will |
301 // ALWAYS be followed by a call to |EndSerializeAndClose()| (even if this | 302 // ALWAYS be followed by a call to |EndSerializeAndClose()| (even if this |
302 // dispatcher cannot be serialized to the given |Channel|). | 303 // dispatcher cannot be serialized to the given |Channel|). |
303 void StartSerialize(Channel* channel, | 304 void StartSerialize(Channel* channel, |
304 size_t* max_size, | 305 size_t* max_size, |
305 size_t* max_platform_handles); | 306 size_t* max_platform_handles); |
306 // Completes the serialization of this dispatcher to the given |Channel| and | 307 // Completes the serialization of this dispatcher to the given |Channel| and |
307 // closes it. (This call will always follow an earlier call to | 308 // closes it. (This call will always follow an earlier call to |
308 // |StartSerialize()|, with the same |Channel|.) This does so by writing to | 309 // |StartSerialize()|, with the same |Channel|.) This does so by writing to |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 | 361 |
361 Dispatcher* dispatcher_; | 362 Dispatcher* dispatcher_; |
362 | 363 |
363 // Copy and assign allowed. | 364 // Copy and assign allowed. |
364 }; | 365 }; |
365 | 366 |
366 } // namespace system | 367 } // namespace system |
367 } // namespace mojo | 368 } // namespace mojo |
368 | 369 |
369 #endif // MOJO_SYSTEM_DISPATCHER_H_ | 370 #endif // MOJO_SYSTEM_DISPATCHER_H_ |
OLD | NEW |