 Chromium Code Reviews
 Chromium Code Reviews Issue 2889613003:
  Remove unnecessary lock in AOC; use atomic ref count instead.  (Closed)
    
  
    Issue 2889613003:
  Remove unnecessary lock in AOC; use atomic ref count instead.  (Closed) 
  | Index: media/audio/audio_output_controller.cc | 
| diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc | 
| index fbc8efd4ef874102582d85479bbaf28a20ac2e7a..8be7b811912cce7a4036921eb261d0e659a490ca 100644 | 
| --- a/media/audio/audio_output_controller.cc | 
| +++ b/media/audio/audio_output_controller.cc | 
| @@ -34,6 +34,7 @@ AudioOutputController::AudioOutputController( | 
| output_device_id_(output_device_id), | 
| stream_(NULL), | 
| diverting_to_stream_(NULL), | 
| + should_duplicate_(0), | 
| volume_(1.0), | 
| state_(kEmpty), | 
| sync_reader_(sync_reader), | 
| @@ -272,12 +273,7 @@ int AudioOutputController::OnMoreData(base::TimeDelta delay, | 
| sync_reader_->RequestMoreData(delay, delay_timestamp, prior_frames_skipped); | 
| - bool need_to_duplicate = false; | 
| - { | 
| - base::AutoLock lock(duplication_targets_lock_); | 
| - need_to_duplicate = !duplication_targets_.empty(); | 
| - } | 
| - if (need_to_duplicate) { | 
| + if (base::AtomicRefCountIsOne(&should_duplicate_)) { | 
| const base::TimeTicks reference_time = delay_timestamp + delay; | 
| std::unique_ptr<AudioBus> copy(AudioBus::Create(params_)); | 
| 
miu
2017/05/18 03:06:29
BTW--The call to AudioBus::Create() here could als
 | 
| dest->CopyTo(copy.get()); | 
| @@ -443,7 +439,9 @@ void AudioOutputController::DoStartDuplicating(AudioPushSink* to_stream) { | 
| if (state_ == kClosed) | 
| return; | 
| - base::AutoLock lock(duplication_targets_lock_); | 
| + if (duplication_targets_.empty()) | 
| + base::AtomicRefCountInc(&should_duplicate_); | 
| + | 
| duplication_targets_.insert(to_stream); | 
| } | 
| @@ -451,8 +449,11 @@ void AudioOutputController::DoStopDuplicating(AudioPushSink* to_stream) { | 
| DCHECK(message_loop_->BelongsToCurrentThread()); | 
| to_stream->Close(); | 
| - base::AutoLock lock(duplication_targets_lock_); | 
| duplication_targets_.erase(to_stream); | 
| + if (duplication_targets_.empty()) { | 
| + const bool is_nonzero = base::AtomicRefCountDec(&should_duplicate_); | 
| + DCHECK(!is_nonzero); | 
| + } | 
| } | 
| std::pair<float, bool> AudioOutputController::ReadCurrentPowerAndClip() { |