| Index: runtime/bin/process_win.cc
|
| diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
|
| index a2d93a4babcc9bc74f89fbd23f01bc6c32cd07a9..c0cb06bb3306030c87574cc66a9a89f83a8227f1 100644
|
| --- a/runtime/bin/process_win.cc
|
| +++ b/runtime/bin/process_win.cc
|
| @@ -714,32 +714,35 @@ class BufferList : public BufferListBase {
|
| // overlapped read.
|
| void DataIsRead(intptr_t size) {
|
| ASSERT(read_pending_ == true);
|
| - data_size_ += size;
|
| - free_size_ -= size;
|
| - ASSERT(free_size_ >= 0);
|
| + set_data_size(data_size() + size);
|
| + set_free_size(free_size() - size);
|
| + ASSERT(free_size() >= 0);
|
| read_pending_ = false;
|
| }
|
|
|
| // The access to the read buffer for overlapped read.
|
| - void GetReadBuffer(uint8_t** buffer, intptr_t* size) {
|
| + bool GetReadBuffer(uint8_t** buffer, intptr_t* size) {
|
| ASSERT(!read_pending_);
|
| - if (free_size_ == 0) {
|
| - Allocate();
|
| + if (free_size() == 0) {
|
| + if (!Allocate()) {
|
| + return false;
|
| + }
|
| }
|
| - ASSERT(free_size_ > 0);
|
| - ASSERT(free_size_ <= kBufferSize);
|
| + ASSERT(free_size() > 0);
|
| + ASSERT(free_size() <= kBufferSize);
|
| *buffer = FreeSpaceAddress();
|
| - *size = free_size_;
|
| + *size = free_size();
|
| read_pending_ = true;
|
| + return true;
|
| }
|
|
|
| - intptr_t GetDataSize() { return data_size_; }
|
| + intptr_t GetDataSize() { return data_size(); }
|
|
|
| uint8_t* GetFirstDataBuffer() {
|
| - ASSERT(head_ != NULL);
|
| - ASSERT(head_ == tail_);
|
| - ASSERT(data_size_ <= kBufferSize);
|
| - return head_->data_;
|
| + ASSERT(head() != NULL);
|
| + ASSERT(head() == tail());
|
| + ASSERT(data_size() <= kBufferSize);
|
| + return head()->data();
|
| }
|
|
|
| void FreeDataBuffer() { Free(); }
|
| @@ -776,7 +779,9 @@ class OverlappedHandle {
|
| ClearOverlapped();
|
| uint8_t* buffer;
|
| intptr_t buffer_size;
|
| - buffer_.GetReadBuffer(&buffer, &buffer_size);
|
| + if (!buffer_.GetReadBuffer(&buffer, &buffer_size)) {
|
| + return false;
|
| + }
|
| BOOL ok = ReadFile(handle_, buffer, buffer_size, NULL, &overlapped_);
|
| if (!ok) {
|
| return (GetLastError() == ERROR_IO_PENDING);
|
| @@ -793,6 +798,10 @@ class OverlappedHandle {
|
|
|
| void FreeDataBuffer() { return buffer_.FreeDataBuffer(); }
|
|
|
| +#if defined(DEBUG)
|
| + bool IsEmpty() const { return buffer_.IsEmpty(); }
|
| +#endif
|
| +
|
| void Close() {
|
| CloseHandle(handle_);
|
| CloseHandle(event_);
|
| @@ -882,6 +891,8 @@ bool Process::Wait(intptr_t pid,
|
| // All handles closed and all data read.
|
| result->set_stdout_data(oh[0].GetData());
|
| result->set_stderr_data(oh[1].GetData());
|
| + DEBUG_ASSERT(oh[0].IsEmpty());
|
| + DEBUG_ASSERT(oh[1].IsEmpty());
|
|
|
| // Calculate the exit code.
|
| ASSERT(oh[2].GetDataSize() == 8);
|
|
|