OLD | NEW |
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 #include "mojo/edk/system/raw_channel.h" | 5 #include "mojo/edk/system/raw_channel.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
9 #include <sys/uio.h> | 9 #include <sys/uio.h> |
10 #include <unistd.h> | 10 #include <unistd.h> |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 | 362 |
363 if (!pending_read_) { | 363 if (!pending_read_) { |
364 NOTREACHED(); | 364 NOTREACHED(); |
365 return; | 365 return; |
366 } | 366 } |
367 | 367 |
368 pending_read_ = false; | 368 pending_read_ = false; |
369 size_t bytes_read = 0; | 369 size_t bytes_read = 0; |
370 IOResult io_result = Read(&bytes_read); | 370 IOResult io_result = Read(&bytes_read); |
371 if (io_result != IO_PENDING) { | 371 if (io_result != IO_PENDING) { |
372 OnReadCompleted(io_result, bytes_read); | 372 base::AutoLock locker(read_lock()); |
| 373 OnReadCompletedNoLock(io_result, bytes_read); |
373 // TODO(vtl): If we weren't destroyed, we'd like to do | 374 // TODO(vtl): If we weren't destroyed, we'd like to do |
374 // | 375 // |
375 // DCHECK(!read_watcher_ || pending_read_); | 376 // DCHECK(!read_watcher_ || pending_read_); |
376 // | 377 // |
377 // On failure, |read_watcher_| must have been reset; on success, we assume | 378 // On failure, |read_watcher_| must have been reset; on success, we assume |
378 // that |OnReadCompleted()| always schedules another read. Otherwise, we | 379 // that |OnReadCompleted()| always schedules another read. Otherwise, we |
379 // could end up spinning -- getting |OnFileCanReadWithoutBlocking()| again | 380 // could end up spinning -- getting |OnFileCanReadWithoutBlocking()| again |
380 // and again but not doing any actual read. | 381 // and again but not doing any actual read. |
381 // TODO(yzshen): An alternative is to stop watching if RawChannel doesn't | 382 // TODO(yzshen): An alternative is to stop watching if RawChannel doesn't |
382 // schedule a new read. But that code won't be reached under the current | 383 // schedule a new read. But that code won't be reached under the current |
(...skipping 14 matching lines...) Expand all Loading... |
397 { | 398 { |
398 base::AutoLock locker(write_lock()); | 399 base::AutoLock locker(write_lock()); |
399 | 400 |
400 DCHECK(pending_write_); | 401 DCHECK(pending_write_); |
401 | 402 |
402 pending_write_ = false; | 403 pending_write_ = false; |
403 io_result = WriteNoLock(&platform_handles_written, &bytes_written); | 404 io_result = WriteNoLock(&platform_handles_written, &bytes_written); |
404 } | 405 } |
405 | 406 |
406 if (io_result != IO_PENDING) { | 407 if (io_result != IO_PENDING) { |
407 OnWriteCompleted(io_result, platform_handles_written, bytes_written); | 408 base::AutoLock locker(write_lock()); |
408 return; // |this| may have been destroyed in |OnWriteCompleted()|. | 409 OnWriteCompletedNoLock(io_result, platform_handles_written, bytes_written); |
| 410 return; |
409 } | 411 } |
410 } | 412 } |
411 | 413 |
412 RawChannel::IOResult RawChannelPosix::ReadImpl(size_t* bytes_read) { | 414 RawChannel::IOResult RawChannelPosix::ReadImpl(size_t* bytes_read) { |
413 char* buffer = nullptr; | 415 char* buffer = nullptr; |
414 size_t bytes_to_read = 0; | 416 size_t bytes_to_read = 0; |
415 read_buffer()->GetBuffer(&buffer, &bytes_to_read); | 417 read_buffer()->GetBuffer(&buffer, &bytes_to_read); |
416 | 418 |
417 size_t old_num_platform_handles = read_platform_handles_.size(); | 419 size_t old_num_platform_handles = read_platform_handles_.size(); |
418 ssize_t read_result = PlatformChannelRecvmsg( | 420 ssize_t read_result = PlatformChannelRecvmsg( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 } | 458 } |
457 | 459 |
458 void RawChannelPosix::WaitToWrite() { | 460 void RawChannelPosix::WaitToWrite() { |
459 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io()); | 461 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io()); |
460 | 462 |
461 DCHECK(write_watcher_); | 463 DCHECK(write_watcher_); |
462 | 464 |
463 if (!message_loop_for_io()->WatchFileDescriptor( | 465 if (!message_loop_for_io()->WatchFileDescriptor( |
464 fd_.get().fd, false, base::MessageLoopForIO::WATCH_WRITE, | 466 fd_.get().fd, false, base::MessageLoopForIO::WATCH_WRITE, |
465 write_watcher_.get(), this)) { | 467 write_watcher_.get(), this)) { |
466 { | 468 base::AutoLock locker(write_lock()); |
467 base::AutoLock locker(write_lock()); | 469 DCHECK(pending_write_); |
468 | 470 pending_write_ = false; |
469 DCHECK(pending_write_); | 471 OnWriteCompletedNoLock(IO_FAILED_UNKNOWN, 0, 0); |
470 pending_write_ = false; | 472 return; |
471 } | |
472 OnWriteCompleted(IO_FAILED_UNKNOWN, 0, 0); | |
473 return; // |this| may have been destroyed in |OnWriteCompleted()|. | |
474 } | 473 } |
475 } | 474 } |
476 | 475 |
477 } // namespace | 476 } // namespace |
478 | 477 |
479 // ----------------------------------------------------------------------------- | 478 // ----------------------------------------------------------------------------- |
480 | 479 |
481 // Static factory method declared in raw_channel.h. | 480 // Static factory method declared in raw_channel.h. |
482 // static | 481 // static |
483 RawChannel* RawChannel::Create(ScopedPlatformHandle handle) { | 482 RawChannel* RawChannel::Create(ScopedPlatformHandle handle) { |
(...skipping 13 matching lines...) Expand all Loading... |
497 struct stat stat1, stat2; | 496 struct stat stat1, stat2; |
498 if (fstat(this_handle.fd, &stat1) < 0) | 497 if (fstat(this_handle.fd, &stat1) < 0) |
499 return false; | 498 return false; |
500 if (fstat(other_handle.fd, &stat2) < 0) | 499 if (fstat(other_handle.fd, &stat2) < 0) |
501 return false; | 500 return false; |
502 return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino); | 501 return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino); |
503 } | 502 } |
504 | 503 |
505 } // namespace edk | 504 } // namespace edk |
506 } // namespace mojo | 505 } // namespace mojo |
OLD | NEW |