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

Side by Side Diff: mojo/edk/system/raw_channel.cc

Issue 1549703002: Suppress erronous TSAN errors in new EDK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: revert change to enable new EDK by default Created 4 years, 12 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/message_in_transit.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/edk/system/raw_channel.h" 5 #include "mojo/edk/system/raw_channel.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <string.h> 9 #include <string.h>
10 #include <algorithm> 10 #include <algorithm>
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 DCHECK(!delegate_); 195 DCHECK(!delegate_);
196 delegate_ = delegate; 196 delegate_ = delegate;
197 197
198 if (read_buffer_->num_valid_bytes_ || 198 if (read_buffer_->num_valid_bytes_ ||
199 !write_buffer_->message_queue_.IsEmpty()) { 199 !write_buffer_->message_queue_.IsEmpty()) {
200 LazyInitialize(); 200 LazyInitialize();
201 } 201 }
202 } 202 }
203 203
204 void RawChannel::EnsureLazyInitialized() { 204 void RawChannel::EnsureLazyInitialized() {
205 if (!initialized_) { 205 {
206 internal::g_io_thread_task_runner->PostTask( 206 base::AutoLock locker(write_lock_);
207 FROM_HERE, 207 if (initialized_)
208 base::Bind(&RawChannel::LockAndCallLazyInitialize, 208 return;
209 weak_ptr_factory_.GetWeakPtr()));
210 } 209 }
210
211 internal::g_io_thread_task_runner->PostTask(
212 FROM_HERE,
213 base::Bind(&RawChannel::LockAndCallLazyInitialize,
214 weak_ptr_factory_.GetWeakPtr()));
211 } 215 }
212 216
213 void RawChannel::LockAndCallLazyInitialize() { 217 void RawChannel::LockAndCallLazyInitialize() {
214 base::AutoLock read_locker(read_lock_); 218 base::AutoLock read_locker(read_lock_);
215 base::AutoLock locker(write_lock_); 219 base::AutoLock locker(write_lock_);
216 LazyInitialize(); 220 LazyInitialize();
217 } 221 }
218 222
219 void RawChannel::LazyInitialize() { 223 void RawChannel::LazyInitialize() {
220 read_lock_.AssertAcquired(); 224 read_lock_.AssertAcquired();
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 283
280 // Normally, we want to flush any pending writes before shutting down. This 284 // Normally, we want to flush any pending writes before shutting down. This
281 // doesn't apply when 1) we don't have a handle (for obvious reasons), 285 // doesn't apply when 1) we don't have a handle (for obvious reasons),
282 // 2) we have a read or write error before (doesn't matter which), or 3) when 286 // 2) we have a read or write error before (doesn't matter which), or 3) when
283 // there are no pending messages to be written. 287 // there are no pending messages to be written.
284 if (!IsHandleValid() || error_occurred_ || empty) { 288 if (!IsHandleValid() || error_occurred_ || empty) {
285 { 289 {
286 base::AutoLock read_locker(read_lock_); 290 base::AutoLock read_locker(read_lock_);
287 base::AutoLock locker(write_lock_); 291 base::AutoLock locker(write_lock_);
288 OnShutdownNoLock(std::move(read_buffer_), std::move(write_buffer_)); 292 OnShutdownNoLock(std::move(read_buffer_), std::move(write_buffer_));
293 if (initialized_)
294 base::MessageLoop::current()->RemoveDestructionObserver(this);
289 } 295 }
290 296
291 if (initialized_) {
292 base::MessageLoop::current()->RemoveDestructionObserver(this);
293 }
294 delete this; 297 delete this;
295 return; 298 return;
296 } 299 }
297 300
298 base::AutoLock read_locker(read_lock_); 301 base::AutoLock read_locker(read_lock_);
299 base::AutoLock locker(write_lock_); 302 base::AutoLock locker(write_lock_);
300 DCHECK(read_buffer_->IsEmpty()) << 303 DCHECK(read_buffer_->IsEmpty()) <<
301 "RawChannel::Shutdown called but there is pending data to be read"; 304 "RawChannel::Shutdown called but there is pending data to be read";
302 305
303 write_stopped_ = true; 306 write_stopped_ = true;
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 OnReadCompletedNoLock(io_result, bytes_read); 724 OnReadCompletedNoLock(io_result, bytes_read);
722 } 725 }
723 726
724 void RawChannel::WillDestroyCurrentMessageLoop() { 727 void RawChannel::WillDestroyCurrentMessageLoop() {
725 base::AutoLock locker(read_lock_); 728 base::AutoLock locker(read_lock_);
726 OnReadCompletedNoLock(IO_FAILED_SHUTDOWN, 0); 729 OnReadCompletedNoLock(IO_FAILED_SHUTDOWN, 0);
727 } 730 }
728 731
729 } // namespace edk 732 } // namespace edk
730 } // namespace mojo 733 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/message_in_transit.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698