Index: base/process.cc |
=================================================================== |
--- base/process.cc (revision 3009) |
+++ base/process.cc (working copy) |
@@ -1,110 +0,0 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/process.h" |
-#include "base/logging.h" |
-#include "base/process_util.h" |
-#include "base/scoped_ptr.h" |
- |
-bool Process::IsProcessBackgrounded() { |
- DCHECK(process_); |
- DWORD priority = GetPriorityClass(process_); |
- if (priority == 0) |
- return false; // Failure case. |
- return priority == BELOW_NORMAL_PRIORITY_CLASS; |
-} |
- |
-bool Process::SetProcessBackgrounded(bool value) { |
- DCHECK(process_); |
- DWORD priority = value ? BELOW_NORMAL_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS; |
- return (SetPriorityClass(process_, priority) != 0); |
-} |
- |
-// According to MSDN, these are the default values which XP |
-// uses to govern working set soft limits. |
-// http://msdn.microsoft.com/en-us/library/ms686234.aspx |
-static const int kWinDefaultMinSet = 50 * 4096; |
-static const int kWinDefaultMaxSet = 345 * 4096; |
-static const int kDampingFactor = 2; |
- |
-bool Process::ReduceWorkingSet() { |
- if (!process_) |
- return false; |
- // The idea here is that when we the process' working set has gone |
- // down, we want to release those pages to the OS quickly. However, |
- // when it is not going down, we want to be careful not to release |
- // too much back to the OS, as it could cause additional paging. |
- |
- // We use a damping function to lessen the working set over time. |
- // As the process grows/shrinks, this algorithm will lag with |
- // working set reduction. |
- // |
- // The intended algorithm is: |
- // TargetWorkingSetSize = (LastWorkingSet/2 + CurrentWorkingSet) /2 |
- |
- scoped_ptr<process_util::ProcessMetrics> metrics( |
- process_util::ProcessMetrics::CreateProcessMetrics(process_)); |
- process_util::WorkingSetKBytes working_set; |
- if (!metrics->GetWorkingSetKBytes(&working_set)) |
- return false; |
- |
- |
- // We want to compute the amount of working set that the process |
- // needs to keep in memory. Since other processes contain the |
- // pages which are shared, we don't need to reserve them in our |
- // process, the system already has them tagged. Keep in mind, we |
- // don't get to control *which* pages get released, but if we |
- // assume reasonable distribution of pages, this should generally |
- // be the right value. |
- size_t current_working_set_size = working_set.priv + |
- working_set.shareable; |
- |
- size_t max_size = current_working_set_size; |
- if (last_working_set_size_) |
- max_size = (max_size + last_working_set_size_) / 2; // Average. |
- max_size *= 1024; // Convert to KBytes. |
- last_working_set_size_ = current_working_set_size / kDampingFactor; |
- |
- BOOL rv = SetProcessWorkingSetSize(process_, kWinDefaultMinSet, max_size); |
- return rv == TRUE; |
-} |
- |
-bool Process::UnReduceWorkingSet() { |
- if (!process_) |
- return false; |
- |
- if (!last_working_set_size_) |
- return true; // There was nothing to undo. |
- |
- // We've had a reduced working set. Make sure we have lots of |
- // headroom now that we're active again. |
- size_t limit = last_working_set_size_ * kDampingFactor * 2 * 1024; |
- BOOL rv = SetProcessWorkingSetSize(process_, kWinDefaultMinSet, limit); |
- return rv == TRUE; |
-} |
- |
-bool Process::EmptyWorkingSet() { |
- if (!process_) |
- return false; |
- |
- BOOL rv = SetProcessWorkingSetSize(process_, -1, -1); |
- return rv == TRUE; |
-} |
- |
-int32 Process::pid() const { |
- if (process_ == 0) |
- return 0; |
- |
- return process_util::GetProcId(process_); |
-} |
- |
-bool Process::is_current() const { |
- return process_ == GetCurrentProcess(); |
-} |
- |
-// static |
-Process Process::Current() { |
- return Process(GetCurrentProcess()); |
-} |
- |