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

Side by Side Diff: mojo/public/cpp/bindings/lib/multiplex_router.cc

Issue 2100683002: Mojo C++ Bindings: Extract AssociatedGroupController from MultiplexRouter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: oops more gyp ugh Created 4 years, 5 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #include "mojo/public/cpp/bindings/lib/multiplex_router.h" 5 #include "mojo/public/cpp/bindings/lib/multiplex_router.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/single_thread_task_runner.h" 15 #include "base/single_thread_task_runner.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/threading/thread_task_runner_handle.h" 17 #include "base/threading/thread_task_runner_handle.h"
18 #include "mojo/public/cpp/bindings/associated_group.h" 18 #include "mojo/public/cpp/bindings/associated_group.h"
19 #include "mojo/public/cpp/bindings/lib/interface_endpoint_client.h" 19 #include "mojo/public/cpp/bindings/interface_endpoint_client.h"
20 #include "mojo/public/cpp/bindings/lib/interface_endpoint_controller.h" 20 #include "mojo/public/cpp/bindings/interface_endpoint_controller.h"
21 #include "mojo/public/cpp/bindings/lib/sync_handle_watcher.h" 21 #include "mojo/public/cpp/bindings/lib/sync_handle_watcher.h"
22 22
23 namespace mojo { 23 namespace mojo {
24 namespace internal { 24 namespace internal {
25 25
26 // InterfaceEndpoint stores the information of an interface endpoint registered 26 // InterfaceEndpoint stores the information of an interface endpoint registered
27 // with the router. 27 // with the router.
28 // No one other than the router's |endpoints_| and |tasks_| should hold refs to 28 // No one other than the router's |endpoints_| and |tasks_| should hold refs to
29 // this object. 29 // this object.
30 class MultiplexRouter::InterfaceEndpoint 30 class MultiplexRouter::InterfaceEndpoint
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 Type type; 278 Type type;
279 279
280 private: 280 private:
281 explicit Task(Type in_type) : type(in_type) {} 281 explicit Task(Type in_type) : type(in_type) {}
282 }; 282 };
283 283
284 MultiplexRouter::MultiplexRouter( 284 MultiplexRouter::MultiplexRouter(
285 bool set_interface_id_namesapce_bit, 285 bool set_interface_id_namesapce_bit,
286 ScopedMessagePipeHandle message_pipe, 286 ScopedMessagePipeHandle message_pipe,
287 scoped_refptr<base::SingleThreadTaskRunner> runner) 287 scoped_refptr<base::SingleThreadTaskRunner> runner)
288 : RefCountedDeleteOnMessageLoop(base::ThreadTaskRunnerHandle::Get()), 288 : AssociatedGroupController(base::ThreadTaskRunnerHandle::Get()),
289 set_interface_id_namespace_bit_(set_interface_id_namesapce_bit), 289 set_interface_id_namespace_bit_(set_interface_id_namesapce_bit),
290 header_validator_(this), 290 header_validator_(this),
291 connector_(std::move(message_pipe), 291 connector_(std::move(message_pipe),
292 Connector::MULTI_THREADED_SEND, 292 Connector::MULTI_THREADED_SEND,
293 std::move(runner)), 293 std::move(runner)),
294 control_message_handler_(this), 294 control_message_handler_(this),
295 control_message_proxy_(&connector_), 295 control_message_proxy_(&connector_),
296 next_interface_id_value_(1), 296 next_interface_id_value_(1),
297 posted_to_process_tasks_(false), 297 posted_to_process_tasks_(false),
298 encountered_error_(false), 298 encountered_error_(false),
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 id = next_interface_id_value_++; 344 id = next_interface_id_value_++;
345 if (set_interface_id_namespace_bit_) 345 if (set_interface_id_namespace_bit_)
346 id |= kInterfaceIdNamespaceMask; 346 id |= kInterfaceIdNamespaceMask;
347 } while (ContainsKey(endpoints_, id)); 347 } while (ContainsKey(endpoints_, id));
348 348
349 InterfaceEndpoint* endpoint = new InterfaceEndpoint(this, id); 349 InterfaceEndpoint* endpoint = new InterfaceEndpoint(this, id);
350 endpoints_[id] = endpoint; 350 endpoints_[id] = endpoint;
351 if (encountered_error_) 351 if (encountered_error_)
352 UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED); 352 UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
353 353
354 *local_endpoint = ScopedInterfaceEndpointHandle(id, true, this); 354 *local_endpoint = CreateScopedInterfaceEndpointHandle(id, true);
355 *remote_endpoint = ScopedInterfaceEndpointHandle(id, false, this); 355 *remote_endpoint = CreateScopedInterfaceEndpointHandle(id, false);
356 } 356 }
357 357
358 ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle( 358 ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle(
359 InterfaceId id) { 359 InterfaceId id) {
360 if (!IsValidInterfaceId(id)) 360 if (!IsValidInterfaceId(id))
361 return ScopedInterfaceEndpointHandle(); 361 return ScopedInterfaceEndpointHandle();
362 362
363 base::AutoLock locker(lock_); 363 base::AutoLock locker(lock_);
364 bool inserted = false; 364 bool inserted = false;
365 InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted); 365 InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
366 if (inserted) { 366 if (inserted) {
367 if (encountered_error_) 367 if (encountered_error_)
368 UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED); 368 UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
369 } else { 369 } else {
370 // If the endpoint already exist, it is because we have received a 370 // If the endpoint already exist, it is because we have received a
371 // notification that the peer endpoint has closed. 371 // notification that the peer endpoint has closed.
372 CHECK(!endpoint->closed()); 372 CHECK(!endpoint->closed());
373 CHECK(endpoint->peer_closed()); 373 CHECK(endpoint->peer_closed());
374 } 374 }
375 return ScopedInterfaceEndpointHandle(id, true, this); 375 return CreateScopedInterfaceEndpointHandle(id, true);
376 } 376 }
377 377
378 void MultiplexRouter::CloseEndpointHandle(InterfaceId id, bool is_local) { 378 void MultiplexRouter::CloseEndpointHandle(InterfaceId id, bool is_local) {
379 if (!IsValidInterfaceId(id)) 379 if (!IsValidInterfaceId(id))
380 return; 380 return;
381 381
382 base::AutoLock locker(lock_); 382 base::AutoLock locker(lock_);
383 383
384 if (!is_local) { 384 if (!is_local) {
385 DCHECK(ContainsKey(endpoints_, id)); 385 DCHECK(ContainsKey(endpoints_, id));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 440
441 void MultiplexRouter::RaiseError() { 441 void MultiplexRouter::RaiseError() {
442 if (task_runner_->BelongsToCurrentThread()) { 442 if (task_runner_->BelongsToCurrentThread()) {
443 connector_.RaiseError(); 443 connector_.RaiseError();
444 } else { 444 } else {
445 task_runner_->PostTask(FROM_HERE, 445 task_runner_->PostTask(FROM_HERE,
446 base::Bind(&MultiplexRouter::RaiseError, this)); 446 base::Bind(&MultiplexRouter::RaiseError, this));
447 } 447 }
448 } 448 }
449 449
450 std::unique_ptr<AssociatedGroup> MultiplexRouter::CreateAssociatedGroup() {
451 std::unique_ptr<AssociatedGroup> group(new AssociatedGroup);
452 group->router_ = this;
453 return group;
454 }
455
456 // static
457 MultiplexRouter* MultiplexRouter::GetRouter(AssociatedGroup* associated_group) {
458 return associated_group->router_.get();
459 }
460
461 void MultiplexRouter::CloseMessagePipe() { 450 void MultiplexRouter::CloseMessagePipe() {
462 DCHECK(thread_checker_.CalledOnValidThread()); 451 DCHECK(thread_checker_.CalledOnValidThread());
463 connector_.CloseMessagePipe(); 452 connector_.CloseMessagePipe();
464 // CloseMessagePipe() above won't trigger connection error handler. 453 // CloseMessagePipe() above won't trigger connection error handler.
465 // Explicitly call OnPipeConnectionError() so that associated endpoints will 454 // Explicitly call OnPipeConnectionError() so that associated endpoints will
466 // get notified. 455 // get notified.
467 OnPipeConnectionError(); 456 OnPipeConnectionError();
468 } 457 }
469 458
470 bool MultiplexRouter::HasAssociatedEndpoints() const { 459 bool MultiplexRouter::HasAssociatedEndpoints() const {
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 *inserted = true; 840 *inserted = true;
852 } else { 841 } else {
853 endpoint = iter->second.get(); 842 endpoint = iter->second.get();
854 } 843 }
855 844
856 return endpoint; 845 return endpoint;
857 } 846 }
858 847
859 } // namespace internal 848 } // namespace internal
860 } // namespace mojo 849 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/lib/multiplex_router.h ('k') | mojo/public/cpp/bindings/lib/pipe_control_message_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698