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

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

Issue 1175603003: Revert and fix more of the mac change. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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 | tests/standalone/standalone.status » ('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) 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 #include "platform/globals.h" 5 #include "platform/globals.h"
6 #if defined(TARGET_OS_MACOS) 6 #if defined(TARGET_OS_MACOS)
7 7
8 #include "bin/process.h" 8 #include "bin/process.h"
9 9
10 #include <crt_externs.h> // NOLINT 10 #include <crt_externs.h> // NOLINT
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 if (TEMP_FAILURE_RETRY(dup2(read_err_[1], STDERR_FILENO)) == -1) { 445 if (TEMP_FAILURE_RETRY(dup2(read_err_[1], STDERR_FILENO)) == -1) {
446 ReportChildError(); 446 ReportChildError();
447 } 447 }
448 448
449 if (working_directory_ != NULL && 449 if (working_directory_ != NULL &&
450 TEMP_FAILURE_RETRY(chdir(working_directory_)) == -1) { 450 TEMP_FAILURE_RETRY(chdir(working_directory_)) == -1) {
451 ReportChildError(); 451 ReportChildError();
452 } 452 }
453 453
454 if (program_environment_ != NULL) { 454 if (program_environment_ != NULL) {
455 environ = program_environment_; 455 // On MacOS you have to do a bit of magic to get to the
456 // environment strings.
457 char*** environ = _NSGetEnviron();
458 *environ = program_environment_;
456 } 459 }
457 460
458 VOID_TEMP_FAILURE_RETRY( 461 VOID_TEMP_FAILURE_RETRY(
459 execvp(path_, const_cast<char* const*>(program_arguments_))); 462 execvp(path_, const_cast<char* const*>(program_arguments_)));
460 463
461 ReportChildError(); 464 ReportChildError();
462 } 465 }
463 466
464 467
465 void ExecDetachedProcess() { 468 void ExecDetachedProcess() {
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 // If CleanupAndReturnError is called without an actual errno make 649 // If CleanupAndReturnError is called without an actual errno make
647 // sure to return an error anyway. 650 // sure to return an error anyway.
648 if (actual_errno == 0) actual_errno = EPERM; 651 if (actual_errno == 0) actual_errno = EPERM;
649 SetChildOsErrorMessage(); 652 SetChildOsErrorMessage();
650 CloseAllPipes(); 653 CloseAllPipes();
651 return actual_errno; 654 return actual_errno;
652 } 655 }
653 656
654 657
655 void SetChildOsErrorMessage() { 658 void SetChildOsErrorMessage() {
656 const int kBufferSize = 1024; 659 SetOSErrorMessage(errno);
657 char error_message[kBufferSize];
658 strerror_r(errno, error_message, kBufferSize);
659 *os_error_message_ = strdup(error_message);
660 } 660 }
661 661
662 662
663 void ReportChildError() { 663 void ReportChildError() {
664 // In the case of failure in the child process write the errno to the exec 664 // In the case of failure in the child process write the errno to the exec
665 // control pipe and exit. 665 // control pipe and exit.
666 int child_errno = errno; 666 int child_errno = errno;
667 FDUtils::WriteToBlocking( 667 FDUtils::WriteToBlocking(
668 exec_control_[1], &child_errno, sizeof(child_errno)); 668 exec_control_[1], &child_errno, sizeof(child_errno));
669 _exit(1); 669 _exit(1);
670 } 670 }
671 671
672 672
673 void ReportPid(int pid) { 673 void ReportPid(int pid) {
674 // In the case of starting a detached process the actual pid of that process 674 // In the case of starting a detached process the actual pid of that process
675 // is communicated using the exec control pipe. 675 // is communicated using the exec control pipe.
676 int bytes_written = 676 int bytes_written =
677 FDUtils::WriteToBlocking(exec_control_[1], &pid, sizeof(pid)); 677 FDUtils::WriteToBlocking(exec_control_[1], &pid, sizeof(pid));
678 ASSERT(bytes_written == sizeof(int)); 678 ASSERT(bytes_written == sizeof(int));
679 USE(bytes_written); 679 USE(bytes_written);
680 } 680 }
681 681
682 682
683 void SetOSErrorMessage(int child_errno) { 683 void SetOSErrorMessage(int child_errno) {
684 const int kMaxMessageSize = 256; 684 const int kBufferSize = 1024;
685 char* message = static_cast<char*>(calloc(kMaxMessageSize, 0)); 685 char error_message[kBufferSize];
686 strerror_r(child_errno, message, kMaxMessageSize - 1); 686 strerror_r(child_errno, error_message, kBufferSize);
687 *os_error_message_ = message; 687 *os_error_message_ = strdup(error_message);
688 } 688 }
689 689
690 690
691 void ClosePipe(int* fds) { 691 void ClosePipe(int* fds) {
692 for (int i = 0; i < 2; i++) { 692 for (int i = 0; i < 2; i++) {
693 if (fds[i] != -1) { 693 if (fds[i] != -1) {
694 VOID_TEMP_FAILURE_RETRY(close(fds[i])); 694 VOID_TEMP_FAILURE_RETRY(close(fds[i]));
695 fds[i] = -1; 695 fds[i] = -1;
696 } 696 }
697 } 697 }
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 bzero(&act, sizeof(act)); 1042 bzero(&act, sizeof(act));
1043 act.sa_handler = SIG_DFL; 1043 act.sa_handler = SIG_DFL;
1044 VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL)); 1044 VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
1045 } 1045 }
1046 } 1046 }
1047 1047
1048 } // namespace bin 1048 } // namespace bin
1049 } // namespace dart 1049 } // namespace dart
1050 1050
1051 #endif // defined(TARGET_OS_MACOS) 1051 #endif // defined(TARGET_OS_MACOS)
OLDNEW
« no previous file with comments | « no previous file | tests/standalone/standalone.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698