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

Side by Side Diff: runtime/bin/process_win.cc

Issue 2596543002: Fix Process.runSync error handling. (Closed)
Patch Set: Address comments Created 4 years 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 | « runtime/bin/process_macos.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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "platform/globals.h" 7 #include "platform/globals.h"
8 #if defined(TARGET_OS_WINDOWS) 8 #if defined(TARGET_OS_WINDOWS)
9 9
10 #include "bin/process.h" 10 #include "bin/process.h"
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 707
708 708
709 class BufferList : public BufferListBase { 709 class BufferList : public BufferListBase {
710 public: 710 public:
711 BufferList() : read_pending_(true) {} 711 BufferList() : read_pending_(true) {}
712 712
713 // Indicate that data has been read into the buffer provided to 713 // Indicate that data has been read into the buffer provided to
714 // overlapped read. 714 // overlapped read.
715 void DataIsRead(intptr_t size) { 715 void DataIsRead(intptr_t size) {
716 ASSERT(read_pending_ == true); 716 ASSERT(read_pending_ == true);
717 data_size_ += size; 717 set_data_size(data_size() + size);
718 free_size_ -= size; 718 set_free_size(free_size() - size);
719 ASSERT(free_size_ >= 0); 719 ASSERT(free_size() >= 0);
720 read_pending_ = false; 720 read_pending_ = false;
721 } 721 }
722 722
723 // The access to the read buffer for overlapped read. 723 // The access to the read buffer for overlapped read.
724 void GetReadBuffer(uint8_t** buffer, intptr_t* size) { 724 bool GetReadBuffer(uint8_t** buffer, intptr_t* size) {
725 ASSERT(!read_pending_); 725 ASSERT(!read_pending_);
726 if (free_size_ == 0) { 726 if (free_size() == 0) {
727 Allocate(); 727 if (!Allocate()) {
728 return false;
729 }
728 } 730 }
729 ASSERT(free_size_ > 0); 731 ASSERT(free_size() > 0);
730 ASSERT(free_size_ <= kBufferSize); 732 ASSERT(free_size() <= kBufferSize);
731 *buffer = FreeSpaceAddress(); 733 *buffer = FreeSpaceAddress();
732 *size = free_size_; 734 *size = free_size();
733 read_pending_ = true; 735 read_pending_ = true;
736 return true;
734 } 737 }
735 738
736 intptr_t GetDataSize() { return data_size_; } 739 intptr_t GetDataSize() { return data_size(); }
737 740
738 uint8_t* GetFirstDataBuffer() { 741 uint8_t* GetFirstDataBuffer() {
739 ASSERT(head_ != NULL); 742 ASSERT(head() != NULL);
740 ASSERT(head_ == tail_); 743 ASSERT(head() == tail());
741 ASSERT(data_size_ <= kBufferSize); 744 ASSERT(data_size() <= kBufferSize);
742 return head_->data_; 745 return head()->data();
743 } 746 }
744 747
745 void FreeDataBuffer() { Free(); } 748 void FreeDataBuffer() { Free(); }
746 749
747 private: 750 private:
748 bool read_pending_; 751 bool read_pending_;
749 752
750 DISALLOW_COPY_AND_ASSIGN(BufferList); 753 DISALLOW_COPY_AND_ASSIGN(BufferList);
751 }; 754 };
752 755
(...skipping 16 matching lines...) Expand all
769 buffer_.DataIsRead(overlapped_.InternalHigh); 772 buffer_.DataIsRead(overlapped_.InternalHigh);
770 } else { 773 } else {
771 buffer_.DataIsRead(0); 774 buffer_.DataIsRead(0);
772 } 775 }
773 776
774 // Keep reading until error or pending operation. 777 // Keep reading until error or pending operation.
775 while (true) { 778 while (true) {
776 ClearOverlapped(); 779 ClearOverlapped();
777 uint8_t* buffer; 780 uint8_t* buffer;
778 intptr_t buffer_size; 781 intptr_t buffer_size;
779 buffer_.GetReadBuffer(&buffer, &buffer_size); 782 if (!buffer_.GetReadBuffer(&buffer, &buffer_size)) {
783 return false;
784 }
780 BOOL ok = ReadFile(handle_, buffer, buffer_size, NULL, &overlapped_); 785 BOOL ok = ReadFile(handle_, buffer, buffer_size, NULL, &overlapped_);
781 if (!ok) { 786 if (!ok) {
782 return (GetLastError() == ERROR_IO_PENDING); 787 return (GetLastError() == ERROR_IO_PENDING);
783 } 788 }
784 buffer_.DataIsRead(overlapped_.InternalHigh); 789 buffer_.DataIsRead(overlapped_.InternalHigh);
785 } 790 }
786 } 791 }
787 792
788 Dart_Handle GetData() { return buffer_.GetData(); } 793 Dart_Handle GetData() { return buffer_.GetData(); }
789 794
790 intptr_t GetDataSize() { return buffer_.GetDataSize(); } 795 intptr_t GetDataSize() { return buffer_.GetDataSize(); }
791 796
792 uint8_t* GetFirstDataBuffer() { return buffer_.GetFirstDataBuffer(); } 797 uint8_t* GetFirstDataBuffer() { return buffer_.GetFirstDataBuffer(); }
793 798
794 void FreeDataBuffer() { return buffer_.FreeDataBuffer(); } 799 void FreeDataBuffer() { return buffer_.FreeDataBuffer(); }
795 800
801 #if defined(DEBUG)
802 bool IsEmpty() const { return buffer_.IsEmpty(); }
803 #endif
804
796 void Close() { 805 void Close() {
797 CloseHandle(handle_); 806 CloseHandle(handle_);
798 CloseHandle(event_); 807 CloseHandle(event_);
799 handle_ = INVALID_HANDLE_VALUE; 808 handle_ = INVALID_HANDLE_VALUE;
800 overlapped_.hEvent = INVALID_HANDLE_VALUE; 809 overlapped_.hEvent = INVALID_HANDLE_VALUE;
801 } 810 }
802 811
803 private: 812 private:
804 void ClearOverlapped() { 813 void ClearOverlapped() {
805 memset(&overlapped_, 0, sizeof(overlapped_)); 814 memset(&overlapped_, 0, sizeof(overlapped_));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 } 884 }
876 } 885 }
877 break; 886 break;
878 } 887 }
879 } 888 }
880 } 889 }
881 890
882 // All handles closed and all data read. 891 // All handles closed and all data read.
883 result->set_stdout_data(oh[0].GetData()); 892 result->set_stdout_data(oh[0].GetData());
884 result->set_stderr_data(oh[1].GetData()); 893 result->set_stderr_data(oh[1].GetData());
894 DEBUG_ASSERT(oh[0].IsEmpty());
895 DEBUG_ASSERT(oh[1].IsEmpty());
885 896
886 // Calculate the exit code. 897 // Calculate the exit code.
887 ASSERT(oh[2].GetDataSize() == 8); 898 ASSERT(oh[2].GetDataSize() == 8);
888 uint32_t exit_codes[2]; 899 uint32_t exit_codes[2];
889 memmove(&exit_codes, oh[2].GetFirstDataBuffer(), sizeof(exit_codes)); 900 memmove(&exit_codes, oh[2].GetFirstDataBuffer(), sizeof(exit_codes));
890 oh[2].FreeDataBuffer(); 901 oh[2].FreeDataBuffer();
891 intptr_t exit_code = exit_codes[0]; 902 intptr_t exit_code = exit_codes[0];
892 intptr_t negative = exit_codes[1]; 903 intptr_t negative = exit_codes[1];
893 if (negative != 0) { 904 if (negative != 0) {
894 exit_code = -exit_code; 905 exit_code = -exit_code;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 } 1041 }
1031 delete handler; 1042 delete handler;
1032 } 1043 }
1033 1044
1034 } // namespace bin 1045 } // namespace bin
1035 } // namespace dart 1046 } // namespace dart
1036 1047
1037 #endif // defined(TARGET_OS_WINDOWS) 1048 #endif // defined(TARGET_OS_WINDOWS)
1038 1049
1039 #endif // !defined(DART_IO_DISABLED) 1050 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/process_macos.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698