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

Side by Side Diff: mojo/system/raw_channel_win.cc

Issue 616043003: mojo::RawChannelWin: Use GetOverlappedResult() to retrive read bytes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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 | « no previous file | 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 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/system/raw_channel.h" 5 #include "mojo/system/raw_channel.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 364
365 RawChannel::IOResult RawChannelWin::Read(size_t* bytes_read) { 365 RawChannel::IOResult RawChannelWin::Read(size_t* bytes_read) {
366 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io()); 366 DCHECK_EQ(base::MessageLoop::current(), message_loop_for_io());
367 DCHECK(io_handler_); 367 DCHECK(io_handler_);
368 DCHECK(!io_handler_->pending_read()); 368 DCHECK(!io_handler_->pending_read());
369 369
370 char* buffer = nullptr; 370 char* buffer = nullptr;
371 size_t bytes_to_read = 0; 371 size_t bytes_to_read = 0;
372 read_buffer()->GetBuffer(&buffer, &bytes_to_read); 372 read_buffer()->GetBuffer(&buffer, &bytes_to_read);
373 373
374 DWORD bytes_read_dword = 0;
375 BOOL result = ReadFile(io_handler_->handle(), 374 BOOL result = ReadFile(io_handler_->handle(),
376 buffer, 375 buffer,
377 static_cast<DWORD>(bytes_to_read), 376 static_cast<DWORD>(bytes_to_read),
378 &bytes_read_dword, 377 NULL,
viettrungluu 2014/09/30 19:07:40 nullptr
379 &io_handler_->read_context()->overlapped); 378 &io_handler_->read_context()->overlapped);
380 if (!result) { 379 if (!result) {
381 DCHECK_EQ(bytes_read_dword, 0u);
382 DWORD error = GetLastError(); 380 DWORD error = GetLastError();
383 if (error == ERROR_BROKEN_PIPE) 381 if (error == ERROR_BROKEN_PIPE)
384 return IO_FAILED_SHUTDOWN; 382 return IO_FAILED_SHUTDOWN;
385 if (error != ERROR_IO_PENDING) { 383 if (error != ERROR_IO_PENDING) {
386 LOG(WARNING) << "ReadFile: " << logging::SystemErrorCodeToString(error); 384 LOG(WARNING) << "ReadFile: " << logging::SystemErrorCodeToString(error);
387 return IO_FAILED_UNKNOWN; 385 return IO_FAILED_UNKNOWN;
388 } 386 }
389 } 387 }
390 388
391 if (result && skip_completion_port_on_success_) { 389 if (result && skip_completion_port_on_success_) {
390 DWORD bytes_read_dword = 0;
391 BOOL get_size_result =
392 GetOverlappedResult(io_handler_->handle(),
393 &io_handler_->read_context()->overlapped,
394 &bytes_read_dword,
395 FALSE);
396 DPCHECK(get_size_result);
392 *bytes_read = bytes_read_dword; 397 *bytes_read = bytes_read_dword;
393 return IO_SUCCEEDED; 398 return IO_SUCCEEDED;
394 } 399 }
395 400
396 // If the read is pending or the read has succeeded but we don't skip 401 // If the read is pending or the read has succeeded but we don't skip
397 // completion port on success, instruct |io_handler_| to wait for the 402 // completion port on success, instruct |io_handler_| to wait for the
398 // completion packet. 403 // completion packet.
399 // 404 //
400 // TODO(yzshen): It seems there isn't document saying that all error cases 405 // TODO(yzshen): It seems there isn't document saying that all error cases
401 // (other than ERROR_IO_PENDING) are guaranteed to *not* queue a completion 406 // (other than ERROR_IO_PENDING) are guaranteed to *not* queue a completion
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 576
572 // Static factory method declared in raw_channel.h. 577 // Static factory method declared in raw_channel.h.
573 // static 578 // static
574 scoped_ptr<RawChannel> RawChannel::Create( 579 scoped_ptr<RawChannel> RawChannel::Create(
575 embedder::ScopedPlatformHandle handle) { 580 embedder::ScopedPlatformHandle handle) {
576 return make_scoped_ptr(new RawChannelWin(handle.Pass())); 581 return make_scoped_ptr(new RawChannelWin(handle.Pass()));
577 } 582 }
578 583
579 } // namespace system 584 } // namespace system
580 } // namespace mojo 585 } // namespace mojo
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698