| OLD | NEW |
| 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(HOST_OS_FUCHSIA) | 8 #if defined(HOST_OS_FUCHSIA) |
| 9 | 9 |
| 10 #include "bin/process.h" | 10 #include "bin/process.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 void set_next(ProcessInfo* info) { next_ = info; } | 73 void set_next(ProcessInfo* info) { next_ = info; } |
| 74 | 74 |
| 75 private: | 75 private: |
| 76 mx_handle_t process_; | 76 mx_handle_t process_; |
| 77 intptr_t exit_pipe_fd_; | 77 intptr_t exit_pipe_fd_; |
| 78 ProcessInfo* next_; | 78 ProcessInfo* next_; |
| 79 | 79 |
| 80 DISALLOW_COPY_AND_ASSIGN(ProcessInfo); | 80 DISALLOW_COPY_AND_ASSIGN(ProcessInfo); |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 | |
| 84 // Singly-linked list of ProcessInfo objects for all active processes | 83 // Singly-linked list of ProcessInfo objects for all active processes |
| 85 // started from Dart. | 84 // started from Dart. |
| 86 class ProcessInfoList { | 85 class ProcessInfoList { |
| 87 public: | 86 public: |
| 88 static void AddProcess(mx_handle_t process, intptr_t fd) { | 87 static void AddProcess(mx_handle_t process, intptr_t fd) { |
| 89 MutexLocker locker(mutex_); | 88 MutexLocker locker(mutex_); |
| 90 ProcessInfo* info = new ProcessInfo(process, fd); | 89 ProcessInfo* info = new ProcessInfo(process, fd); |
| 91 info->set_next(active_processes_); | 90 info->set_next(active_processes_); |
| 92 active_processes_ = info; | 91 active_processes_ = info; |
| 93 } | 92 } |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 | 420 |
| 422 bool ExitCodeHandler::do_shutdown_ = false; | 421 bool ExitCodeHandler::do_shutdown_ = false; |
| 423 bool ExitCodeHandler::running_ = false; | 422 bool ExitCodeHandler::running_ = false; |
| 424 bool ExitCodeHandler::terminate_done_ = false; | 423 bool ExitCodeHandler::terminate_done_ = false; |
| 425 Monitor* ExitCodeHandler::monitor_ = new Monitor(); | 424 Monitor* ExitCodeHandler::monitor_ = new Monitor(); |
| 426 | 425 |
| 427 void Process::TerminateExitCodeHandler() { | 426 void Process::TerminateExitCodeHandler() { |
| 428 ExitCodeHandler::Terminate(); | 427 ExitCodeHandler::Terminate(); |
| 429 } | 428 } |
| 430 | 429 |
| 431 | |
| 432 intptr_t Process::CurrentProcessId() { | 430 intptr_t Process::CurrentProcessId() { |
| 433 return static_cast<intptr_t>(getpid()); | 431 return static_cast<intptr_t>(getpid()); |
| 434 } | 432 } |
| 435 | 433 |
| 436 | |
| 437 int64_t Process::CurrentRSS() { | 434 int64_t Process::CurrentRSS() { |
| 438 mx_info_task_stats_t task_stats; | 435 mx_info_task_stats_t task_stats; |
| 439 mx_handle_t process = mx_process_self(); | 436 mx_handle_t process = mx_process_self(); |
| 440 mx_status_t status = mx_object_get_info( | 437 mx_status_t status = mx_object_get_info( |
| 441 process, MX_INFO_TASK_STATS, &task_stats, sizeof(task_stats), NULL, NULL); | 438 process, MX_INFO_TASK_STATS, &task_stats, sizeof(task_stats), NULL, NULL); |
| 442 if (status != MX_OK) { | 439 if (status != MX_OK) { |
| 443 // TODO(zra): Translate this to a Unix errno. | 440 // TODO(zra): Translate this to a Unix errno. |
| 444 errno = status; | 441 errno = status; |
| 445 return -1; | 442 return -1; |
| 446 } | 443 } |
| 447 return task_stats.mem_private_bytes + task_stats.mem_shared_bytes; | 444 return task_stats.mem_private_bytes + task_stats.mem_shared_bytes; |
| 448 } | 445 } |
| 449 | 446 |
| 450 | |
| 451 int64_t Process::MaxRSS() { | 447 int64_t Process::MaxRSS() { |
| 452 // There is currently no way to get the high watermark value on Fuchsia, so | 448 // There is currently no way to get the high watermark value on Fuchsia, so |
| 453 // just return the current RSS value. | 449 // just return the current RSS value. |
| 454 return CurrentRSS(); | 450 return CurrentRSS(); |
| 455 } | 451 } |
| 456 | 452 |
| 457 | |
| 458 class IOHandleScope { | 453 class IOHandleScope { |
| 459 public: | 454 public: |
| 460 explicit IOHandleScope(IOHandle* io_handle) : io_handle_(io_handle) {} | 455 explicit IOHandleScope(IOHandle* io_handle) : io_handle_(io_handle) {} |
| 461 ~IOHandleScope() { | 456 ~IOHandleScope() { |
| 462 io_handle_->Close(); | 457 io_handle_->Close(); |
| 463 io_handle_->Release(); | 458 io_handle_->Release(); |
| 464 } | 459 } |
| 465 | 460 |
| 466 private: | 461 private: |
| 467 IOHandle* io_handle_; | 462 IOHandle* io_handle_; |
| 468 | 463 |
| 469 DISALLOW_ALLOCATION(); | 464 DISALLOW_ALLOCATION(); |
| 470 DISALLOW_COPY_AND_ASSIGN(IOHandleScope); | 465 DISALLOW_COPY_AND_ASSIGN(IOHandleScope); |
| 471 }; | 466 }; |
| 472 | 467 |
| 473 | |
| 474 bool Process::Wait(intptr_t pid, | 468 bool Process::Wait(intptr_t pid, |
| 475 intptr_t in, | 469 intptr_t in, |
| 476 intptr_t out, | 470 intptr_t out, |
| 477 intptr_t err, | 471 intptr_t err, |
| 478 intptr_t exit_event, | 472 intptr_t exit_event, |
| 479 ProcessResult* result) { | 473 ProcessResult* result) { |
| 480 // input not needed. | 474 // input not needed. |
| 481 IOHandle* in_iohandle = reinterpret_cast<IOHandle*>(in); | 475 IOHandle* in_iohandle = reinterpret_cast<IOHandle*>(in); |
| 482 in_iohandle->Close(); | 476 in_iohandle->Close(); |
| 483 in_iohandle->Release(); | 477 in_iohandle->Release(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 exit_code = -exit_code; | 600 exit_code = -exit_code; |
| 607 } | 601 } |
| 608 result->set_exit_code(exit_code); | 602 result->set_exit_code(exit_code); |
| 609 | 603 |
| 610 // Close the process handle. | 604 // Close the process handle. |
| 611 mx_handle_t process = static_cast<mx_handle_t>(pid); | 605 mx_handle_t process = static_cast<mx_handle_t>(pid); |
| 612 mx_handle_close(process); | 606 mx_handle_close(process); |
| 613 return true; | 607 return true; |
| 614 } | 608 } |
| 615 | 609 |
| 616 | |
| 617 bool Process::Kill(intptr_t id, int signal) { | 610 bool Process::Kill(intptr_t id, int signal) { |
| 618 LOG_INFO("Sending signal %d to process with id %ld\n", signal, id); | 611 LOG_INFO("Sending signal %d to process with id %ld\n", signal, id); |
| 619 // mx_task_kill is definitely going to kill the process. | 612 // mx_task_kill is definitely going to kill the process. |
| 620 if ((signal != SIGTERM) && (signal != SIGKILL)) { | 613 if ((signal != SIGTERM) && (signal != SIGKILL)) { |
| 621 LOG_ERR("Signal %d not supported\n", signal); | 614 LOG_ERR("Signal %d not supported\n", signal); |
| 622 errno = ENOSYS; | 615 errno = ENOSYS; |
| 623 return false; | 616 return false; |
| 624 } | 617 } |
| 625 // We can only use mx_task_kill if we know id is a process handle, and we only | 618 // We can only use mx_task_kill if we know id is a process handle, and we only |
| 626 // know that for sure if it's in our list. | 619 // know that for sure if it's in our list. |
| 627 mx_handle_t process = static_cast<mx_handle_t>(id); | 620 mx_handle_t process = static_cast<mx_handle_t>(id); |
| 628 if (!ProcessInfoList::Exists(process)) { | 621 if (!ProcessInfoList::Exists(process)) { |
| 629 LOG_ERR("Process %ld wasn't in the ProcessInfoList\n", id); | 622 LOG_ERR("Process %ld wasn't in the ProcessInfoList\n", id); |
| 630 errno = ESRCH; // No such process. | 623 errno = ESRCH; // No such process. |
| 631 return false; | 624 return false; |
| 632 } | 625 } |
| 633 mx_status_t status = mx_task_kill(process); | 626 mx_status_t status = mx_task_kill(process); |
| 634 if (status != MX_OK) { | 627 if (status != MX_OK) { |
| 635 LOG_ERR("mx_task_kill failed: %s\n", mx_status_get_string(status)); | 628 LOG_ERR("mx_task_kill failed: %s\n", mx_status_get_string(status)); |
| 636 errno = EPERM; // TODO(zra): Figure out what it really should be. | 629 errno = EPERM; // TODO(zra): Figure out what it really should be. |
| 637 return false; | 630 return false; |
| 638 } | 631 } |
| 639 LOG_INFO("Signal %d sent successfully to process %ld\n", signal, id); | 632 LOG_INFO("Signal %d sent successfully to process %ld\n", signal, id); |
| 640 return true; | 633 return true; |
| 641 } | 634 } |
| 642 | 635 |
| 643 | |
| 644 class ProcessStarter { | 636 class ProcessStarter { |
| 645 public: | 637 public: |
| 646 ProcessStarter(const char* path, | 638 ProcessStarter(const char* path, |
| 647 char* arguments[], | 639 char* arguments[], |
| 648 intptr_t arguments_length, | 640 intptr_t arguments_length, |
| 649 const char* working_directory, | 641 const char* working_directory, |
| 650 char* environment[], | 642 char* environment[], |
| 651 intptr_t environment_length, | 643 intptr_t environment_length, |
| 652 ProcessStartMode mode, | 644 ProcessStartMode mode, |
| 653 intptr_t* in, | 645 intptr_t* in, |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 intptr_t* out_; | 822 intptr_t* out_; |
| 831 intptr_t* err_; | 823 intptr_t* err_; |
| 832 intptr_t* id_; | 824 intptr_t* id_; |
| 833 intptr_t* exit_event_; | 825 intptr_t* exit_event_; |
| 834 char** os_error_message_; | 826 char** os_error_message_; |
| 835 | 827 |
| 836 DISALLOW_ALLOCATION(); | 828 DISALLOW_ALLOCATION(); |
| 837 DISALLOW_IMPLICIT_CONSTRUCTORS(ProcessStarter); | 829 DISALLOW_IMPLICIT_CONSTRUCTORS(ProcessStarter); |
| 838 }; | 830 }; |
| 839 | 831 |
| 840 | |
| 841 int Process::Start(const char* path, | 832 int Process::Start(const char* path, |
| 842 char* arguments[], | 833 char* arguments[], |
| 843 intptr_t arguments_length, | 834 intptr_t arguments_length, |
| 844 const char* working_directory, | 835 const char* working_directory, |
| 845 char* environment[], | 836 char* environment[], |
| 846 intptr_t environment_length, | 837 intptr_t environment_length, |
| 847 ProcessStartMode mode, | 838 ProcessStartMode mode, |
| 848 intptr_t* in, | 839 intptr_t* in, |
| 849 intptr_t* out, | 840 intptr_t* out, |
| 850 intptr_t* err, | 841 intptr_t* err, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 868 } | 859 } |
| 869 | 860 |
| 870 void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) {} | 861 void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) {} |
| 871 | 862 |
| 872 } // namespace bin | 863 } // namespace bin |
| 873 } // namespace dart | 864 } // namespace dart |
| 874 | 865 |
| 875 #endif // defined(HOST_OS_FUCHSIA) | 866 #endif // defined(HOST_OS_FUCHSIA) |
| 876 | 867 |
| 877 #endif // !defined(DART_IO_DISABLED) | 868 #endif // !defined(DART_IO_DISABLED) |
| OLD | NEW |