Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: mojo/system/dispatcher.h

Issue 216893005: Mojo: Move the handle table details out of CoreImpl into its own class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix compile assert Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/system/core_impl.cc ('k') | mojo/system/dispatcher.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/public/c/system/core.h" 17 #include "mojo/public/c/system/core.h"
18 // TODO(vtl): We need this since we can't forward declare 18 // TODO(vtl): We need this since we can't forward declare
19 // |RawSharedBuffer::Mapping|. Maybe fix this. 19 // |RawSharedBuffer::Mapping|. Maybe fix this.
20 #include "mojo/system/raw_shared_buffer.h" 20 #include "mojo/system/raw_shared_buffer.h"
21 #include "mojo/system/system_impl_export.h" 21 #include "mojo/system/system_impl_export.h"
22 22
23 namespace mojo { 23 namespace mojo {
24 namespace system { 24 namespace system {
25 25
26 class Channel; 26 class Channel;
27 class CoreImpl; 27 class CoreImpl;
28 class Dispatcher; 28 class Dispatcher;
29 class DispatcherTransport; 29 class DispatcherTransport;
30 class HandleTable;
30 class LocalMessagePipeEndpoint; 31 class LocalMessagePipeEndpoint;
31 class MessageInTransit; 32 class MessageInTransit;
32 class ProxyMessagePipeEndpoint; 33 class ProxyMessagePipeEndpoint;
33 class Waiter; 34 class Waiter;
34 35
35 namespace test { 36 namespace test {
36 37
37 // Test helper. We need to declare it here so we can friend it. 38 // Test helper. We need to declare it here so we can friend it.
38 MOJO_SYSTEM_IMPL_EXPORT DispatcherTransport DispatcherTryStartTransport( 39 MOJO_SYSTEM_IMPL_EXPORT DispatcherTransport DispatcherTryStartTransport(
39 Dispatcher* dispatcher); 40 Dispatcher* dispatcher);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 // - |MOJO_RESULT_ALREADY_EXISTS| if |flags| is already satisfied; 120 // - |MOJO_RESULT_ALREADY_EXISTS| if |flags| is already satisfied;
120 // - |MOJO_RESULT_INVALID_ARGUMENT| if the dispatcher has been closed; and 121 // - |MOJO_RESULT_INVALID_ARGUMENT| if the dispatcher has been closed; and
121 // - |MOJO_RESULT_FAILED_PRECONDITION| if it is not (or no longer) possible 122 // - |MOJO_RESULT_FAILED_PRECONDITION| if it is not (or no longer) possible
122 // that |flags| will ever be satisfied. 123 // that |flags| will ever be satisfied.
123 MojoResult AddWaiter(Waiter* waiter, 124 MojoResult AddWaiter(Waiter* waiter,
124 MojoWaitFlags flags, 125 MojoWaitFlags flags,
125 MojoResult wake_result); 126 MojoResult wake_result);
126 void RemoveWaiter(Waiter* waiter); 127 void RemoveWaiter(Waiter* waiter);
127 128
128 // A dispatcher must be put into a special state in order to be sent across a 129 // A dispatcher must be put into a special state in order to be sent across a
129 // message pipe. Outside of tests, only |CoreImplAccess| is allowed to do 130 // message pipe. Outside of tests, only |HandleTableAccess| is allowed to do
130 // this, since there are requirements on the handle table (see below). 131 // this, since there are requirements on the handle table (see below).
131 // 132 //
132 // In this special state, only a restricted set of operations is allowed. 133 // In this special state, only a restricted set of operations is allowed.
133 // These are the ones available as |DispatcherTransport| methods. Other 134 // These are the ones available as |DispatcherTransport| methods. Other
134 // |Dispatcher| methods must not be called until |DispatcherTransport::End()| 135 // |Dispatcher| methods must not be called until |DispatcherTransport::End()|
135 // has been called. 136 // has been called.
136 class CoreImplAccess { 137 class HandleTableAccess {
137 private: 138 private:
138 friend class CoreImpl; 139 friend class CoreImpl;
140 friend class HandleTable;
139 // Tests also need this, to avoid needing |CoreImpl|. 141 // Tests also need this, to avoid needing |CoreImpl|.
140 friend DispatcherTransport test::DispatcherTryStartTransport(Dispatcher*); 142 friend DispatcherTransport test::DispatcherTryStartTransport(Dispatcher*);
141 143
142 // This must be called under the handle table lock and only if the handle 144 // This must be called under the handle table lock and only if the handle
143 // table entry is not marked busy. The caller must maintain a reference to 145 // table entry is not marked busy. The caller must maintain a reference to
144 // |dispatcher| until |DispatcherTransport::End()| is called. 146 // |dispatcher| until |DispatcherTransport::End()| is called.
145 static DispatcherTransport TryStartTransport(Dispatcher* dispatcher); 147 static DispatcherTransport TryStartTransport(Dispatcher* dispatcher);
146 }; 148 };
147 149
148 // A |MessageInTransit| may serialize dispatchers that are attached to it to a 150 // A |MessageInTransit| may serialize dispatchers that are attached to it to a
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 295
294 // This protects the following members as well as any state added by 296 // This protects the following members as well as any state added by
295 // subclasses. 297 // subclasses.
296 mutable base::Lock lock_; 298 mutable base::Lock lock_;
297 bool is_closed_; 299 bool is_closed_;
298 300
299 DISALLOW_COPY_AND_ASSIGN(Dispatcher); 301 DISALLOW_COPY_AND_ASSIGN(Dispatcher);
300 }; 302 };
301 303
302 // Wrapper around a |Dispatcher| pointer, while it's being processed to be 304 // Wrapper around a |Dispatcher| pointer, while it's being processed to be
303 // passed in a message pipe. See the comment about |Dispatcher::CoreImplAccess| 305 // passed in a message pipe. See the comment about
304 // for more details. 306 // |Dispatcher::HandleTableAccess| for more details.
305 // 307 //
306 // Note: This class is deliberately "thin" -- no more expensive than a 308 // Note: This class is deliberately "thin" -- no more expensive than a
307 // |Dispatcher*|. 309 // |Dispatcher*|.
308 class MOJO_SYSTEM_IMPL_EXPORT DispatcherTransport { 310 class MOJO_SYSTEM_IMPL_EXPORT DispatcherTransport {
309 public: 311 public:
310 DispatcherTransport() : dispatcher_(NULL) {} 312 DispatcherTransport() : dispatcher_(NULL) {}
311 313
312 void End(); 314 void End();
313 315
314 Dispatcher::Type GetType() const { return dispatcher_->GetType(); } 316 Dispatcher::Type GetType() const { return dispatcher_->GetType(); }
315 bool IsBusy() const { return dispatcher_->IsBusyNoLock(); } 317 bool IsBusy() const { return dispatcher_->IsBusyNoLock(); }
316 void Close() { dispatcher_->CloseNoLock(); } 318 void Close() { dispatcher_->CloseNoLock(); }
317 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndClose() { 319 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndClose() {
318 return dispatcher_->CreateEquivalentDispatcherAndCloseNoLock(); 320 return dispatcher_->CreateEquivalentDispatcherAndCloseNoLock();
319 } 321 }
320 322
321 bool is_valid() const { return !!dispatcher_; } 323 bool is_valid() const { return !!dispatcher_; }
322 324
323 protected: 325 protected:
324 Dispatcher* dispatcher() { return dispatcher_; } 326 Dispatcher* dispatcher() { return dispatcher_; }
325 327
326 private: 328 private:
327 friend class Dispatcher::CoreImplAccess; 329 friend class Dispatcher::HandleTableAccess;
328 330
329 explicit DispatcherTransport(Dispatcher* dispatcher) 331 explicit DispatcherTransport(Dispatcher* dispatcher)
330 : dispatcher_(dispatcher) {} 332 : dispatcher_(dispatcher) {}
331 333
332 Dispatcher* dispatcher_; 334 Dispatcher* dispatcher_;
333 335
334 // Copy and assign allowed. 336 // Copy and assign allowed.
335 }; 337 };
336 338
337 } // namespace system 339 } // namespace system
338 } // namespace mojo 340 } // namespace mojo
339 341
340 #endif // MOJO_SYSTEM_DISPATCHER_H_ 342 #endif // MOJO_SYSTEM_DISPATCHER_H_
OLDNEW
« no previous file with comments | « mojo/system/core_impl.cc ('k') | mojo/system/dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698