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

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

Issue 1943123002: Make it possible to write a message pipe endpoint's peer into it. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « mojo/edk/system/data_pipe_producer_dispatcher.cc ('k') | mojo/edk/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_EDK_SYSTEM_DISPATCHER_H_ 5 #ifndef MOJO_EDK_SYSTEM_DISPATCHER_H_
6 #define MOJO_EDK_SYSTEM_DISPATCHER_H_ 6 #define MOJO_EDK_SYSTEM_DISPATCHER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 17 matching lines...) Expand all
28 #include "mojo/public/cpp/system/macros.h" 28 #include "mojo/public/cpp/system/macros.h"
29 29
30 namespace mojo { 30 namespace mojo {
31 31
32 namespace platform { 32 namespace platform {
33 class PlatformSharedBufferMapping; 33 class PlatformSharedBufferMapping;
34 } 34 }
35 35
36 namespace system { 36 namespace system {
37 37
38 class Awakable;
38 class Channel; 39 class Channel;
39 class Core; 40 class Core;
40 class Dispatcher; 41 class Dispatcher;
41 class DispatcherTransport; 42 class DispatcherTransport;
42 class HandleTable; 43 class HandleTable;
43 class LocalMessagePipeEndpoint; 44 class LocalMessagePipeEndpoint;
45 class MessagePipe;
44 class ProxyMessagePipeEndpoint; 46 class ProxyMessagePipeEndpoint;
45 class TransportData; 47 class TransportData;
46 class Awakable;
47 48
48 using DispatcherVector = std::vector<util::RefPtr<Dispatcher>>; 49 using DispatcherVector = std::vector<util::RefPtr<Dispatcher>>;
49 50
50 namespace test { 51 namespace test {
51 52
52 // Test helper. We need to declare it here so we can friend it. 53 // Test helper. We need to declare it here so we can friend it.
53 DispatcherTransport DispatcherTryStartTransport(Dispatcher* dispatcher); 54 DispatcherTransport DispatcherTryStartTransport(Dispatcher* dispatcher);
54 55
55 } // namespace test 56 } // namespace test
56 57
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 protected: 253 protected:
253 Dispatcher(); 254 Dispatcher();
254 virtual ~Dispatcher(); 255 virtual ~Dispatcher();
255 256
256 // These are to be overridden by subclasses (if necessary). They are called 257 // These are to be overridden by subclasses (if necessary). They are called
257 // exactly once (first |CancelAllAwakablesNoLock()|, then |CloseImplNoLock()|) 258 // exactly once (first |CancelAllAwakablesNoLock()|, then |CloseImplNoLock()|)
258 // when the dispatcher is being closed. 259 // when the dispatcher is being closed.
259 virtual void CancelAllAwakablesNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 260 virtual void CancelAllAwakablesNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
260 virtual void CloseImplNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 261 virtual void CloseImplNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
261 262
262 virtual util::RefPtr<Dispatcher> 263 // This is called by |CreateEquivalentDispatcherAndCloseNoLock()|. It should
263 CreateEquivalentDispatcherAndCloseImplNoLock() 264 // produce "close" this dispatcher and return a new one equivalent to it.
azani 2016/05/03 19:54:27 The meaning of "produce 'close' this dispatcher" i
viettrungluu 2016/05/03 20:28:01 Oops, I meant to s/produce // this before landing.
264 MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_) = 0; 265 // Note: Probably the first thing an implementation should do is call
266 // |CancelAllAwakablesNoLock()| (or equivalent); unlike |CloseNoLock()|,
267 // |CreateEquivalentDispatcherAndCloseNoLock()| does not do this
268 // automatically.
269 virtual util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock(
270 MessagePipe* message_pipe,
271 unsigned port) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_) = 0;
265 272
266 // These are to be overridden by subclasses (if necessary). They are never 273 // These are to be overridden by subclasses (if necessary). They are never
267 // called after the dispatcher has been closed. See the descriptions of the 274 // called after the dispatcher has been closed. See the descriptions of the
268 // methods without the "ImplNoLock" for more information. 275 // methods without the "ImplNoLock" for more information.
269 virtual MojoResult WriteMessageImplNoLock( 276 virtual MojoResult WriteMessageImplNoLock(
270 UserPointer<const void> bytes, 277 UserPointer<const void> bytes,
271 uint32_t num_bytes, 278 uint32_t num_bytes,
272 std::vector<DispatcherTransport>* transports, 279 std::vector<DispatcherTransport>* transports,
273 MojoWriteMessageFlags flags) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 280 MojoWriteMessageFlags flags) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
274 virtual MojoResult ReadMessageImplNoLock(UserPointer<void> bytes, 281 virtual MojoResult ReadMessageImplNoLock(UserPointer<void> bytes,
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 // Closes the dispatcher. This must be done under lock, and unlike |Close()|, 379 // Closes the dispatcher. This must be done under lock, and unlike |Close()|,
373 // the dispatcher must not be closed already. (This is the "equivalent" of 380 // the dispatcher must not be closed already. (This is the "equivalent" of
374 // |CreateEquivalentDispatcherAndCloseNoLock()|, for situations where the 381 // |CreateEquivalentDispatcherAndCloseNoLock()|, for situations where the
375 // dispatcher must be disposed of instead of "transferred".) 382 // dispatcher must be disposed of instead of "transferred".)
376 void CloseNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 383 void CloseNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
377 384
378 // Creates an equivalent dispatcher -- representing the same resource as this 385 // Creates an equivalent dispatcher -- representing the same resource as this
379 // dispatcher -- and close (i.e., disable) this dispatcher. I.e., this 386 // dispatcher -- and close (i.e., disable) this dispatcher. I.e., this
380 // dispatcher will look as though it was closed, but the resource it 387 // dispatcher will look as though it was closed, but the resource it
381 // represents will be assigned to the new dispatcher. This must be called 388 // represents will be assigned to the new dispatcher. This must be called
382 // under the dispatcher's lock. 389 // under the dispatcher's lock. If the resulting dispatcher will be put into a
383 util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndCloseNoLock() 390 // message on a message pipe, then |message_pipe| will be set appropriately
384 MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 391 // (otherwise, it may be null) and |port| will be set to the destination port.
392 util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndCloseNoLock(
393 MessagePipe* message_pipe,
394 unsigned port) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
385 395
386 // API to serialize dispatchers to a |Channel|, exposed to only 396 // API to serialize dispatchers to a |Channel|, exposed to only
387 // |TransportData| (via |TransportData|). They may only be called on a 397 // |TransportData| (via |TransportData|). They may only be called on a
388 // dispatcher attached to a |MessageInTransit| (and in particular not in 398 // dispatcher attached to a |MessageInTransit| (and in particular not in
389 // |CoreImpl|'s handle table). 399 // |CoreImpl|'s handle table).
390 // 400 //
391 // TODO(vtl): The serialization API (and related implementation methods, 401 // TODO(vtl): The serialization API (and related implementation methods,
392 // including |DispatcherTransport|'s methods) is marked 402 // including |DispatcherTransport|'s methods) is marked
393 // |MOJO_NOT_THREAD_SAFE|. This is because the threading requirements are 403 // |MOJO_NOT_THREAD_SAFE|. This is because the threading requirements are
394 // somewhat complicated (e.g., |HandleTableAccess::TryStartTransport()| is 404 // somewhat complicated (e.g., |HandleTableAccess::TryStartTransport()| is
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 443
434 MOJO_DISALLOW_COPY_AND_ASSIGN(Dispatcher); 444 MOJO_DISALLOW_COPY_AND_ASSIGN(Dispatcher);
435 }; 445 };
436 446
437 // Wrapper around a |Dispatcher| pointer, while it's being processed to be 447 // Wrapper around a |Dispatcher| pointer, while it's being processed to be
438 // passed in a message pipe. See the comment about 448 // passed in a message pipe. See the comment about
439 // |Dispatcher::HandleTableAccess| for more details. 449 // |Dispatcher::HandleTableAccess| for more details.
440 // 450 //
441 // Note: This class is deliberately "thin" -- no more expensive than a 451 // Note: This class is deliberately "thin" -- no more expensive than a
442 // |Dispatcher*|. 452 // |Dispatcher*|.
443 class DispatcherTransport { 453 class DispatcherTransport final {
444 public: 454 public:
445 DispatcherTransport() : dispatcher_(nullptr) {} 455 DispatcherTransport() : dispatcher_(nullptr) {}
446 456
447 void End() MOJO_NOT_THREAD_SAFE; 457 void End() MOJO_NOT_THREAD_SAFE;
448 458
449 Dispatcher::Type GetType() const { return dispatcher_->GetType(); } 459 Dispatcher::Type GetType() const { return dispatcher_->GetType(); }
450 bool IsBusy() const MOJO_NOT_THREAD_SAFE { 460 bool IsBusy() const MOJO_NOT_THREAD_SAFE {
451 return dispatcher_->IsBusyNoLock(); 461 return dispatcher_->IsBusyNoLock();
452 } 462 }
453 void Close() MOJO_NOT_THREAD_SAFE { dispatcher_->CloseNoLock(); } 463 void Close() MOJO_NOT_THREAD_SAFE { dispatcher_->CloseNoLock(); }
454 util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndClose() 464 util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndClose(
455 MOJO_NOT_THREAD_SAFE { 465 MessagePipe* message_pipe,
456 return dispatcher_->CreateEquivalentDispatcherAndCloseNoLock(); 466 unsigned port) MOJO_NOT_THREAD_SAFE {
467 return dispatcher_->CreateEquivalentDispatcherAndCloseNoLock(message_pipe,
468 port);
457 } 469 }
458 470
459 bool is_valid() const { return !!dispatcher_; } 471 bool is_valid() const { return !!dispatcher_; }
460 472
461 protected:
462 Dispatcher* dispatcher() { return dispatcher_; }
463
464 private: 473 private:
465 friend class Dispatcher::HandleTableAccess; 474 friend class Dispatcher::HandleTableAccess;
466 475
467 explicit DispatcherTransport(Dispatcher* dispatcher) 476 explicit DispatcherTransport(Dispatcher* dispatcher)
468 : dispatcher_(dispatcher) {} 477 : dispatcher_(dispatcher) {}
469 478
470 Dispatcher* dispatcher_; 479 Dispatcher* dispatcher_;
471 480
472 // Copy and assign allowed. 481 // Copy and assign allowed.
473 }; 482 };
474 483
475 // So logging macros and |DCHECK_EQ()|, etc. work. 484 // So logging macros and |DCHECK_EQ()|, etc. work.
476 inline std::ostream& operator<<(std::ostream& out, Dispatcher::Type type) { 485 inline std::ostream& operator<<(std::ostream& out, Dispatcher::Type type) {
477 return out << static_cast<int>(type); 486 return out << static_cast<int>(type);
478 } 487 }
479 488
480 } // namespace system 489 } // namespace system
481 } // namespace mojo 490 } // namespace mojo
482 491
483 #endif // MOJO_EDK_SYSTEM_DISPATCHER_H_ 492 #endif // MOJO_EDK_SYSTEM_DISPATCHER_H_
OLDNEW
« no previous file with comments | « mojo/edk/system/data_pipe_producer_dispatcher.cc ('k') | mojo/edk/system/dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698