| OLD | NEW | 
|   1 // Copyright 2016 The Chromium Authors. All rights reserved. |   1 // Copyright 2016 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 "services/service_manager/public/cpp/service_context_ref.h" |   5 #include "services/service_manager/public/cpp/service_context_ref.h" | 
|   6  |   6  | 
|   7 #include "base/bind.h" |   7 #include "base/bind.h" | 
|   8 #include "base/memory/ptr_util.h" |   8 #include "base/memory/ptr_util.h" | 
|   9 #include "base/message_loop/message_loop.h" |   9 #include "base/message_loop/message_loop.h" | 
|  10 #include "base/threading/thread_checker.h" |  10 #include "base/threading/thread_checker.h" | 
|  11 #include "base/threading/thread_task_runner_handle.h" |  11 #include "base/threading/thread_task_runner_handle.h" | 
|  12  |  12  | 
|  13 namespace service_manager { |  13 namespace service_manager { | 
|  14  |  14  | 
|  15 class ServiceContextRefImpl : public ServiceContextRef { |  15 class ServiceContextRefImpl : public ServiceContextRef { | 
|  16  public: |  16  public: | 
|  17   ServiceContextRefImpl( |  17   ServiceContextRefImpl( | 
|  18       base::WeakPtr<ServiceContextRefFactory> factory, |  18       base::WeakPtr<ServiceContextRefFactory> factory, | 
|  19       scoped_refptr<base::SingleThreadTaskRunner> service_task_runner) |  19       scoped_refptr<base::SingleThreadTaskRunner> service_task_runner) | 
|  20       : factory_(factory), |  20       : factory_(factory), service_task_runner_(service_task_runner) { | 
|  21         service_task_runner_(service_task_runner) { |  | 
|  22     // This object is not thread-safe but may be used exclusively on a different |  21     // This object is not thread-safe but may be used exclusively on a different | 
|  23     // thread from the one which constructed it. |  22     // thread from the one which constructed it. | 
|  24     thread_checker_.DetachFromThread(); |  23     thread_checker_.DetachFromThread(); | 
|  25   } |  24   } | 
|  26  |  25  | 
|  27   ~ServiceContextRefImpl() override { |  26   ~ServiceContextRefImpl() override { | 
|  28     DCHECK(thread_checker_.CalledOnValidThread()); |  27     DCHECK(thread_checker_.CalledOnValidThread()); | 
|  29  |  28  | 
|  30     if (service_task_runner_->BelongsToCurrentThread() && factory_) { |  29     if (service_task_runner_->BelongsToCurrentThread() && factory_) { | 
|  31       factory_->Release(); |  30       factory_->Release(); | 
|  32     } else { |  31     } else { | 
|  33       service_task_runner_->PostTask( |  32       service_task_runner_->PostTask( | 
|  34           FROM_HERE, |  33           FROM_HERE, base::Bind(&ServiceContextRefFactory::Release, factory_)); | 
|  35           base::Bind(&ServiceContextRefFactory::Release, factory_)); |  | 
|  36     } |  34     } | 
|  37   } |  35   } | 
|  38  |  36  | 
|  39  private: |  37  private: | 
|  40   // ServiceContextRef: |  38   // ServiceContextRef: | 
|  41   std::unique_ptr<ServiceContextRef> Clone() override { |  39   std::unique_ptr<ServiceContextRef> Clone() override { | 
|  42     DCHECK(thread_checker_.CalledOnValidThread()); |  40     DCHECK(thread_checker_.CalledOnValidThread()); | 
|  43  |  41  | 
|  44     if (service_task_runner_->BelongsToCurrentThread() && factory_) { |  42     if (service_task_runner_->BelongsToCurrentThread() && factory_) { | 
|  45       factory_->AddRef(); |  43       factory_->AddRef(); | 
|  46     } else { |  44     } else { | 
|  47       service_task_runner_->PostTask( |  45       service_task_runner_->PostTask( | 
|  48           FROM_HERE, |  46           FROM_HERE, base::Bind(&ServiceContextRefFactory::AddRef, factory_)); | 
|  49           base::Bind(&ServiceContextRefFactory::AddRef, factory_)); |  | 
|  50     } |  47     } | 
|  51  |  48  | 
|  52     return base::MakeUnique<ServiceContextRefImpl>(factory_, |  49     return base::MakeUnique<ServiceContextRefImpl>(factory_, | 
|  53                                                    service_task_runner_); |  50                                                    service_task_runner_); | 
|  54   } |  51   } | 
|  55  |  52  | 
|  56   base::WeakPtr<ServiceContextRefFactory> factory_; |  53   base::WeakPtr<ServiceContextRefFactory> factory_; | 
|  57   scoped_refptr<base::SingleThreadTaskRunner> service_task_runner_; |  54   scoped_refptr<base::SingleThreadTaskRunner> service_task_runner_; | 
|  58   base::ThreadChecker thread_checker_; |  55   base::ThreadChecker thread_checker_; | 
|  59  |  56  | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|  77 void ServiceContextRefFactory::AddRef() { |  74 void ServiceContextRefFactory::AddRef() { | 
|  78   ++ref_count_; |  75   ++ref_count_; | 
|  79 } |  76 } | 
|  80  |  77  | 
|  81 void ServiceContextRefFactory::Release() { |  78 void ServiceContextRefFactory::Release() { | 
|  82   if (!--ref_count_) |  79   if (!--ref_count_) | 
|  83     quit_closure_.Run(); |  80     quit_closure_.Run(); | 
|  84 } |  81 } | 
|  85  |  82  | 
|  86 }  // namespace service_manager |  83 }  // namespace service_manager | 
| OLD | NEW |