OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "base/process.h" | 5 #include "base/process.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/process_util.h" | 8 #include "base/process_util.h" |
| 9 #include "base/win/windows_version.h" |
9 | 10 |
10 namespace base { | 11 namespace base { |
11 | 12 |
12 void Process::Close() { | 13 void Process::Close() { |
13 if (!process_) | 14 if (!process_) |
14 return; | 15 return; |
15 ::CloseHandle(process_); | 16 // Don't call CloseHandle on a pseudo-handle. |
| 17 if (process_ != ::GetCurrentProcess()) |
| 18 ::CloseHandle(process_); |
16 process_ = NULL; | 19 process_ = NULL; |
17 } | 20 } |
18 | 21 |
19 void Process::Terminate(int result_code) { | 22 void Process::Terminate(int result_code) { |
20 if (!process_) | 23 if (!process_) |
21 return; | 24 return; |
22 ::TerminateProcess(process_, result_code); | 25 ::TerminateProcess(process_, result_code); |
23 } | 26 } |
24 | 27 |
25 bool Process::IsProcessBackgrounded() const { | 28 bool Process::IsProcessBackgrounded() const { |
26 if (!process_) | 29 if (!process_) |
27 return false; // Failure case. | 30 return false; // Failure case. |
28 DWORD priority = GetPriority(); | 31 DWORD priority = GetPriority(); |
29 if (priority == 0) | 32 if (priority == 0) |
30 return false; // Failure case. | 33 return false; // Failure case. |
31 return priority == BELOW_NORMAL_PRIORITY_CLASS; | 34 return ((priority == BELOW_NORMAL_PRIORITY_CLASS) || |
| 35 (priority == IDLE_PRIORITY_CLASS)); |
32 } | 36 } |
33 | 37 |
34 bool Process::SetProcessBackgrounded(bool value) { | 38 bool Process::SetProcessBackgrounded(bool value) { |
35 if (!process_) | 39 if (!process_) |
36 return false; | 40 return false; |
37 DWORD priority = value ? BELOW_NORMAL_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS; | 41 // Vista and above introduce a real background mode, which not only |
38 return (SetPriorityClass(process_, priority) != 0); | 42 // sets the priority class on the threads but also on the IO generated |
| 43 // by it. Unfortunately it can only be set for the calling process. |
| 44 DWORD priority; |
| 45 if ((base::win::GetVersion() >= base::win::VERSION_VISTA) && |
| 46 (process_ == ::GetCurrentProcess())) { |
| 47 priority = value ? PROCESS_MODE_BACKGROUND_BEGIN : |
| 48 PROCESS_MODE_BACKGROUND_END; |
| 49 } else { |
| 50 priority = value ? BELOW_NORMAL_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS; |
| 51 } |
| 52 |
| 53 return (::SetPriorityClass(process_, priority) != 0); |
39 } | 54 } |
40 | 55 |
41 ProcessId Process::pid() const { | 56 ProcessId Process::pid() const { |
42 if (process_ == 0) | 57 if (process_ == 0) |
43 return 0; | 58 return 0; |
44 | 59 |
45 return GetProcId(process_); | 60 return GetProcId(process_); |
46 } | 61 } |
47 | 62 |
48 bool Process::is_current() const { | 63 bool Process::is_current() const { |
49 return process_ == GetCurrentProcess(); | 64 return process_ == GetCurrentProcess(); |
50 } | 65 } |
51 | 66 |
52 // static | 67 // static |
53 Process Process::Current() { | 68 Process Process::Current() { |
54 return Process(GetCurrentProcess()); | 69 return Process(::GetCurrentProcess()); |
55 } | 70 } |
56 | 71 |
57 int Process::GetPriority() const { | 72 int Process::GetPriority() const { |
58 DCHECK(process_); | 73 DCHECK(process_); |
59 return GetPriorityClass(process_); | 74 return ::GetPriorityClass(process_); |
60 } | 75 } |
61 | 76 |
62 } // namespace base | 77 } // namespace base |
OLD | NEW |