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

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

Issue 2596543002: Fix Process.runSync error handling. (Closed)
Patch Set: Address comments Created 3 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 | « runtime/bin/process_android.cc ('k') | runtime/bin/process_linux.cc » ('j') | 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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_FUCHSIA) 8 #if defined(TARGET_OS_FUCHSIA)
9 9
10 #include "bin/process.h" 10 #include "bin/process.h"
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 int e = errno; 434 int e = errno;
435 VOID_NO_RETRY_EXPECTED(close(out)); 435 VOID_NO_RETRY_EXPECTED(close(out));
436 VOID_NO_RETRY_EXPECTED(close(err)); 436 VOID_NO_RETRY_EXPECTED(close(err));
437 VOID_NO_RETRY_EXPECTED(close(exit_event)); 437 VOID_NO_RETRY_EXPECTED(close(exit_event));
438 VOID_NO_RETRY_EXPECTED(close(epoll_fd)); 438 VOID_NO_RETRY_EXPECTED(close(epoll_fd));
439 errno = e; 439 errno = e;
440 return false; 440 return false;
441 } 441 }
442 442
443 443
444 class BufferList : public BufferListBase {
445 public:
446 BufferList() {}
447
448 bool Read(int fd, intptr_t available) {
449 // Read all available bytes.
450 while (available > 0) {
451 if (free_size_ == 0) {
452 Allocate();
453 }
454 ASSERT(free_size_ > 0);
455 ASSERT(free_size_ <= kBufferSize);
456 intptr_t block_size = dart::Utils::Minimum(free_size_, available);
457 intptr_t bytes = NO_RETRY_EXPECTED(
458 read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
459 if (bytes < 0) {
460 return false;
461 }
462 data_size_ += bytes;
463 free_size_ -= bytes;
464 available -= bytes;
465 }
466 return true;
467 }
468
469 private:
470 DISALLOW_COPY_AND_ASSIGN(BufferList);
471 };
472
473
474 bool Process::Wait(intptr_t pid, 444 bool Process::Wait(intptr_t pid,
475 intptr_t in, 445 intptr_t in,
476 intptr_t out, 446 intptr_t out,
477 intptr_t err, 447 intptr_t err,
478 intptr_t exit_event, 448 intptr_t exit_event,
479 ProcessResult* result) { 449 ProcessResult* result) {
480 VOID_NO_RETRY_EXPECTED(close(in)); 450 VOID_NO_RETRY_EXPECTED(close(in));
481 451
482 // There is no return from this function using Dart_PropagateError 452 // There is no return from this function using Dart_PropagateError
483 // as memory used by the buffer lists is freed through their 453 // as memory used by the buffer lists is freed through their
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 VOID_NO_RETRY_EXPECTED( 533 VOID_NO_RETRY_EXPECTED(
564 epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL)); 534 epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL));
565 } 535 }
566 } 536 }
567 } 537 }
568 VOID_NO_RETRY_EXPECTED(close(epoll_fd)); 538 VOID_NO_RETRY_EXPECTED(close(epoll_fd));
569 539
570 // All handles closed and all data read. 540 // All handles closed and all data read.
571 result->set_stdout_data(out_data.GetData()); 541 result->set_stdout_data(out_data.GetData());
572 result->set_stderr_data(err_data.GetData()); 542 result->set_stderr_data(err_data.GetData());
543 DEBUG_ASSERT(out_data.IsEmpty());
544 DEBUG_ASSERT(err_data.IsEmpty());
573 545
574 // Calculate the exit code. 546 // Calculate the exit code.
575 intptr_t exit_code = exit_code_data.ints[0]; 547 intptr_t exit_code = exit_code_data.ints[0];
576 intptr_t negative = exit_code_data.ints[1]; 548 intptr_t negative = exit_code_data.ints[1];
577 if (negative != 0) { 549 if (negative != 0) {
578 exit_code = -exit_code; 550 exit_code = -exit_code;
579 } 551 }
580 result->set_exit_code(exit_code); 552 result->set_exit_code(exit_code);
581 553
582 return true; 554 return true;
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 void Process::ClearSignalHandler(intptr_t signal) { 812 void Process::ClearSignalHandler(intptr_t signal) {
841 UNIMPLEMENTED(); 813 UNIMPLEMENTED();
842 } 814 }
843 815
844 } // namespace bin 816 } // namespace bin
845 } // namespace dart 817 } // namespace dart
846 818
847 #endif // defined(TARGET_OS_FUCHSIA) 819 #endif // defined(TARGET_OS_FUCHSIA)
848 820
849 #endif // !defined(DART_IO_DISABLED) 821 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/process_android.cc ('k') | runtime/bin/process_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698