OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #define _CRT_SECURE_NO_WARNINGS | 5 #define _CRT_SECURE_NO_WARNINGS |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include <limits> | 10 #include <limits> |
8 | 11 |
9 #include "base/command_line.h" | 12 #include "base/command_line.h" |
10 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
11 #include "base/debug/stack_trace.h" | 14 #include "base/debug/stack_trace.h" |
12 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
13 #include "base/files/file_util.h" | 16 #include "base/files/file_util.h" |
14 #include "base/files/scoped_file.h" | 17 #include "base/files/scoped_file.h" |
15 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/macros.h" |
16 #include "base/memory/scoped_ptr.h" | 20 #include "base/memory/scoped_ptr.h" |
17 #include "base/path_service.h" | 21 #include "base/path_service.h" |
18 #include "base/posix/eintr_wrapper.h" | 22 #include "base/posix/eintr_wrapper.h" |
19 #include "base/process/kill.h" | 23 #include "base/process/kill.h" |
20 #include "base/process/launch.h" | 24 #include "base/process/launch.h" |
21 #include "base/process/memory.h" | 25 #include "base/process/memory.h" |
22 #include "base/process/process.h" | 26 #include "base/process/process.h" |
23 #include "base/process/process_metrics.h" | 27 #include "base/process/process_metrics.h" |
24 #include "base/strings/string_number_conversions.h" | 28 #include "base/strings/string_number_conversions.h" |
25 #include "base/strings/utf_string_conversions.h" | 29 #include "base/strings/utf_string_conversions.h" |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 } | 420 } |
417 | 421 |
418 static const char kEventToTriggerHandleSwitch[] = "event-to-trigger-handle"; | 422 static const char kEventToTriggerHandleSwitch[] = "event-to-trigger-handle"; |
419 | 423 |
420 MULTIPROCESS_TEST_MAIN(TriggerEventChildProcess) { | 424 MULTIPROCESS_TEST_MAIN(TriggerEventChildProcess) { |
421 std::string handle_value_string = | 425 std::string handle_value_string = |
422 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 426 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
423 kEventToTriggerHandleSwitch); | 427 kEventToTriggerHandleSwitch); |
424 CHECK(!handle_value_string.empty()); | 428 CHECK(!handle_value_string.empty()); |
425 | 429 |
426 uint64 handle_value_uint64; | 430 uint64_t handle_value_uint64; |
427 CHECK(base::StringToUint64(handle_value_string, &handle_value_uint64)); | 431 CHECK(base::StringToUint64(handle_value_string, &handle_value_uint64)); |
428 // Give ownership of the handle to |event|. | 432 // Give ownership of the handle to |event|. |
429 base::WaitableEvent event(base::win::ScopedHandle( | 433 base::WaitableEvent event(base::win::ScopedHandle( |
430 reinterpret_cast<HANDLE>(handle_value_uint64))); | 434 reinterpret_cast<HANDLE>(handle_value_uint64))); |
431 | 435 |
432 event.Signal(); | 436 event.Signal(); |
433 | 437 |
434 return 0; | 438 return 0; |
435 } | 439 } |
436 | 440 |
437 TEST_F(ProcessUtilTest, InheritSpecifiedHandles) { | 441 TEST_F(ProcessUtilTest, InheritSpecifiedHandles) { |
438 // Manually create the event, so that it can be inheritable. | 442 // Manually create the event, so that it can be inheritable. |
439 SECURITY_ATTRIBUTES security_attributes = {}; | 443 SECURITY_ATTRIBUTES security_attributes = {}; |
440 security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes)); | 444 security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes)); |
441 security_attributes.lpSecurityDescriptor = NULL; | 445 security_attributes.lpSecurityDescriptor = NULL; |
442 security_attributes.bInheritHandle = true; | 446 security_attributes.bInheritHandle = true; |
443 | 447 |
444 // Takes ownership of the event handle. | 448 // Takes ownership of the event handle. |
445 base::WaitableEvent event(base::win::ScopedHandle( | 449 base::WaitableEvent event(base::win::ScopedHandle( |
446 CreateEvent(&security_attributes, true, false, NULL))); | 450 CreateEvent(&security_attributes, true, false, NULL))); |
447 base::HandlesToInheritVector handles_to_inherit; | 451 base::HandlesToInheritVector handles_to_inherit; |
448 handles_to_inherit.push_back(event.handle()); | 452 handles_to_inherit.push_back(event.handle()); |
449 base::LaunchOptions options; | 453 base::LaunchOptions options; |
450 options.handles_to_inherit = &handles_to_inherit; | 454 options.handles_to_inherit = &handles_to_inherit; |
451 | 455 |
452 base::CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess"); | 456 base::CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess"); |
453 cmd_line.AppendSwitchASCII(kEventToTriggerHandleSwitch, | 457 cmd_line.AppendSwitchASCII( |
454 base::Uint64ToString(reinterpret_cast<uint64>(event.handle()))); | 458 kEventToTriggerHandleSwitch, |
| 459 base::Uint64ToString(reinterpret_cast<uint64_t>(event.handle()))); |
455 | 460 |
456 // This functionality actually requires Vista or later. Make sure that it | 461 // This functionality actually requires Vista or later. Make sure that it |
457 // fails properly on XP. | 462 // fails properly on XP. |
458 if (base::win::GetVersion() < base::win::VERSION_VISTA) { | 463 if (base::win::GetVersion() < base::win::VERSION_VISTA) { |
459 EXPECT_FALSE(base::LaunchProcess(cmd_line, options).IsValid()); | 464 EXPECT_FALSE(base::LaunchProcess(cmd_line, options).IsValid()); |
460 return; | 465 return; |
461 } | 466 } |
462 | 467 |
463 // Launch the process and wait for it to trigger the event. | 468 // Launch the process and wait for it to trigger the event. |
464 ASSERT_TRUE(base::LaunchProcess(cmd_line, options).IsValid()); | 469 ASSERT_TRUE(base::LaunchProcess(cmd_line, options).IsValid()); |
465 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); | 470 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); |
466 } | 471 } |
467 #endif // defined(OS_WIN) | 472 #endif // defined(OS_WIN) |
468 | 473 |
469 #if defined(OS_POSIX) | 474 #if defined(OS_POSIX) |
470 | 475 |
471 namespace { | 476 namespace { |
472 | 477 |
473 // Returns the maximum number of files that a process can have open. | 478 // Returns the maximum number of files that a process can have open. |
474 // Returns 0 on error. | 479 // Returns 0 on error. |
475 int GetMaxFilesOpenInProcess() { | 480 int GetMaxFilesOpenInProcess() { |
476 struct rlimit rlim; | 481 struct rlimit rlim; |
477 if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { | 482 if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { |
478 return 0; | 483 return 0; |
479 } | 484 } |
480 | 485 |
481 // rlim_t is a uint64 - clip to maxint. We do this since FD #s are ints | 486 // rlim_t is a uint64_t - clip to maxint. We do this since FD #s are ints |
482 // which are all 32 bits on the supported platforms. | 487 // which are all 32 bits on the supported platforms. |
483 rlim_t max_int = static_cast<rlim_t>(std::numeric_limits<int32>::max()); | 488 rlim_t max_int = static_cast<rlim_t>(std::numeric_limits<int32_t>::max()); |
484 if (rlim.rlim_cur > max_int) { | 489 if (rlim.rlim_cur > max_int) { |
485 return max_int; | 490 return max_int; |
486 } | 491 } |
487 | 492 |
488 return rlim.rlim_cur; | 493 return rlim.rlim_cur; |
489 } | 494 } |
490 | 495 |
491 const int kChildPipe = 20; // FD # for write end of pipe in child process. | 496 const int kChildPipe = 20; // FD # for write end of pipe in child process. |
492 | 497 |
493 #if defined(OS_MACOSX) | 498 #if defined(OS_MACOSX) |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1120 options.current_directory = base::FilePath("/dev/null"); | 1125 options.current_directory = base::FilePath("/dev/null"); |
1121 | 1126 |
1122 base::Process process(SpawnChildWithOptions("SimpleChildProcess", options)); | 1127 base::Process process(SpawnChildWithOptions("SimpleChildProcess", options)); |
1123 ASSERT_TRUE(process.IsValid()); | 1128 ASSERT_TRUE(process.IsValid()); |
1124 | 1129 |
1125 int exit_code = kSuccess; | 1130 int exit_code = kSuccess; |
1126 EXPECT_TRUE(process.WaitForExit(&exit_code)); | 1131 EXPECT_TRUE(process.WaitForExit(&exit_code)); |
1127 EXPECT_NE(kSuccess, exit_code); | 1132 EXPECT_NE(kSuccess, exit_code); |
1128 } | 1133 } |
1129 #endif | 1134 #endif |
OLD | NEW |