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 #include "webkit/glue/webkitplatformsupport_impl.h" | 5 #include "webkit/glue/webkitplatformsupport_impl.h" |
6 | 6 |
7 #if defined(OS_LINUX) | 7 #if defined(OS_LINUX) |
8 #include <malloc.h> | 8 #include <malloc.h> |
9 #endif | 9 #endif |
10 | 10 |
11 #include <math.h> | 11 #include <math.h> |
12 | 12 |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/debug/trace_event.h" | 16 #include "base/debug/trace_event.h" |
17 #include "base/memory/singleton.h" | 17 #include "base/memory/singleton.h" |
18 #include "base/message_loop.h" | 18 #include "base/message_loop.h" |
19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
20 #include "base/metrics/stats_counters.h" | 20 #include "base/metrics/stats_counters.h" |
21 #include "base/platform_file.h" | 21 #include "base/platform_file.h" |
22 #include "base/process_util.h" | 22 #include "base/process_util.h" |
23 #include "base/rand_util.h" | 23 #include "base/rand_util.h" |
24 #include "base/string_number_conversions.h" | 24 #include "base/string_number_conversions.h" |
25 #include "base/string_util.h" | 25 #include "base/string_util.h" |
26 #include "base/synchronization/lock.h" | 26 #include "base/synchronization/lock.h" |
| 27 #include "base/sys_info.h" |
27 #include "base/time.h" | 28 #include "base/time.h" |
28 #include "base/utf_string_conversions.h" | 29 #include "base/utf_string_conversions.h" |
29 #include "grit/webkit_chromium_resources.h" | 30 #include "grit/webkit_chromium_resources.h" |
30 #include "grit/webkit_resources.h" | 31 #include "grit/webkit_resources.h" |
31 #include "grit/webkit_strings.h" | 32 #include "grit/webkit_strings.h" |
32 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrameClient.h" | 33 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrameClient.h" |
33 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginListBuilder.
h" | 34 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginListBuilder.
h" |
34 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" | 35 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" |
35 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCookie.h" | 36 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCookie.h" |
36 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebData.h" | 37 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebData.h" |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 return 0; | 662 return 0; |
662 } | 663 } |
663 | 664 |
664 WebKit::WebString WebKitPlatformSupportImpl::signedPublicKeyAndChallengeString( | 665 WebKit::WebString WebKitPlatformSupportImpl::signedPublicKeyAndChallengeString( |
665 unsigned key_size_index, | 666 unsigned key_size_index, |
666 const WebKit::WebString& challenge, | 667 const WebKit::WebString& challenge, |
667 const WebKit::WebURL& url) { | 668 const WebKit::WebURL& url) { |
668 return WebKit::WebString(""); | 669 return WebKit::WebString(""); |
669 } | 670 } |
670 | 671 |
671 #if defined(OS_LINUX) | 672 #if defined(OS_LINUX) || defined(OS_ANDROID) |
672 static size_t memoryUsageMBLinux() { | 673 static size_t memoryUsageMB() { |
673 struct mallinfo minfo = mallinfo(); | 674 struct mallinfo minfo = mallinfo(); |
674 uint64_t mem_usage = | 675 uint64_t mem_usage = |
675 #if defined(USE_TCMALLOC) | 676 #if defined(USE_TCMALLOC) |
676 minfo.uordblks | 677 minfo.uordblks |
677 #else | 678 #else |
678 (minfo.hblkhd + minfo.arena) | 679 (minfo.hblkhd + minfo.arena) |
679 #endif | 680 #endif |
680 >> 20; | 681 >> 20; |
681 | 682 |
682 v8::HeapStatistics stat; | 683 v8::HeapStatistics stat; |
683 v8::V8::GetHeapStatistics(&stat); | 684 v8::V8::GetHeapStatistics(&stat); |
684 return mem_usage + (static_cast<uint64_t>(stat.total_heap_size()) >> 20); | 685 return mem_usage + (static_cast<uint64_t>(stat.total_heap_size()) >> 20); |
685 } | 686 } |
686 #endif | 687 #elif defined(OS_MACOSX) |
687 | 688 static size_t memoryUsageMB() { |
688 #if defined(OS_MACOSX) | |
689 static size_t memoryUsageMBMac() { | |
690 using base::ProcessMetrics; | 689 using base::ProcessMetrics; |
691 static ProcessMetrics* process_metrics = | 690 static ProcessMetrics* process_metrics = |
692 // The default port provider is sufficient to get data for the current | 691 // The default port provider is sufficient to get data for the current |
693 // process. | 692 // process. |
694 ProcessMetrics::CreateProcessMetrics(base::GetCurrentProcessHandle(), | 693 ProcessMetrics::CreateProcessMetrics(base::GetCurrentProcessHandle(), |
695 NULL); | 694 NULL); |
696 DCHECK(process_metrics); | 695 DCHECK(process_metrics); |
697 return process_metrics->GetWorkingSetSize() >> 20; | 696 return process_metrics->GetWorkingSetSize() >> 20; |
698 } | 697 } |
699 #endif | 698 #else |
700 | 699 static size_t memoryUsageMB() { |
701 #if !defined(OS_LINUX) && !defined(OS_MACOSX) | |
702 static size_t memoryUsageMBGeneric() { | |
703 using base::ProcessMetrics; | 700 using base::ProcessMetrics; |
704 static ProcessMetrics* process_metrics = | 701 static ProcessMetrics* process_metrics = |
705 ProcessMetrics::CreateProcessMetrics(base::GetCurrentProcessHandle()); | 702 ProcessMetrics::CreateProcessMetrics(base::GetCurrentProcessHandle()); |
706 DCHECK(process_metrics); | 703 DCHECK(process_metrics); |
707 return process_metrics->GetPagefileUsage() >> 20; | 704 return process_metrics->GetPagefileUsage() >> 20; |
708 } | 705 } |
709 #endif | 706 #endif |
710 | 707 |
711 static size_t getMemoryUsageMB(bool bypass_cache) { | 708 static size_t getMemoryUsageMB(bool bypass_cache) { |
712 size_t current_mem_usage = 0; | 709 size_t current_mem_usage = 0; |
713 MemoryUsageCache* mem_usage_cache_singleton = MemoryUsageCache::GetInstance(); | 710 MemoryUsageCache* mem_usage_cache_singleton = MemoryUsageCache::GetInstance(); |
714 if (!bypass_cache && | 711 if (!bypass_cache && |
715 mem_usage_cache_singleton->IsCachedValueValid(¤t_mem_usage)) | 712 mem_usage_cache_singleton->IsCachedValueValid(¤t_mem_usage)) |
716 return current_mem_usage; | 713 return current_mem_usage; |
717 | 714 |
718 current_mem_usage = | 715 current_mem_usage = memoryUsageMB(); |
719 #if defined(OS_LINUX) | |
720 memoryUsageMBLinux(); | |
721 #elif defined(OS_MACOSX) | |
722 memoryUsageMBMac(); | |
723 #else | |
724 memoryUsageMBGeneric(); | |
725 #endif | |
726 mem_usage_cache_singleton->SetMemoryValue(current_mem_usage); | 716 mem_usage_cache_singleton->SetMemoryValue(current_mem_usage); |
727 return current_mem_usage; | 717 return current_mem_usage; |
728 } | 718 } |
729 | 719 |
730 size_t WebKitPlatformSupportImpl::memoryUsageMB() { | 720 size_t WebKitPlatformSupportImpl::memoryUsageMB() { |
731 return getMemoryUsageMB(false); | 721 return getMemoryUsageMB(false); |
732 } | 722 } |
733 | 723 |
734 size_t WebKitPlatformSupportImpl::actualMemoryUsageMB() { | 724 size_t WebKitPlatformSupportImpl::actualMemoryUsageMB() { |
735 return getMemoryUsageMB(true); | 725 return getMemoryUsageMB(true); |
736 } | 726 } |
737 | 727 |
| 728 #if defined(OS_ANDROID) |
| 729 size_t WebKitPlatformSupportImpl::lowMemoryUsageMB() { |
| 730 // If memory usage is below this threshold, do not bother forcing GC. |
| 731 // Allow us to use up to our memory class value before V8's GC kicks in. |
| 732 // These values have been determined by experimentation. |
| 733 return base::SysInfo::DalvikHeapSizeMB() / 2; |
| 734 } |
| 735 |
| 736 size_t WebKitPlatformSupportImpl::highMemoryUsageMB() { |
| 737 // If memory usage is above this threshold, force GC more aggressively. |
| 738 return base::SysInfo::DalvikHeapSizeMB() * 3 / 4; |
| 739 } |
| 740 |
| 741 size_t WebKitPlatformSupportImpl::highUsageDeltaMB() { |
| 742 // If memory usage is above highMemoryUsageMB() and memory usage increased by |
| 743 // more than highUsageDeltaMB() since the last GC, then force GC. |
| 744 // Note that this limit should be greater than the amount of memory for V8 |
| 745 // internal data structures that are released on GC and reallocated during JS |
| 746 // execution (about 8MB). Otherwise, it will cause too aggressive GCs. |
| 747 return base::SysInfo::DalvikHeapSizeMB() / 8; |
| 748 } |
| 749 #endif |
| 750 |
738 void WebKitPlatformSupportImpl::SuspendSharedTimer() { | 751 void WebKitPlatformSupportImpl::SuspendSharedTimer() { |
739 ++shared_timer_suspended_; | 752 ++shared_timer_suspended_; |
740 } | 753 } |
741 | 754 |
742 void WebKitPlatformSupportImpl::ResumeSharedTimer() { | 755 void WebKitPlatformSupportImpl::ResumeSharedTimer() { |
743 // The shared timer may have fired or been adjusted while we were suspended. | 756 // The shared timer may have fired or been adjusted while we were suspended. |
744 if (--shared_timer_suspended_ == 0 && !shared_timer_.IsRunning()) { | 757 if (--shared_timer_suspended_ == 0 && !shared_timer_.IsRunning()) { |
745 setSharedTimerFireInterval( | 758 setSharedTimerFireInterval( |
746 shared_timer_fire_time_ - monotonicallyIncreasingTime()); | 759 shared_timer_fire_time_ - monotonicallyIncreasingTime()); |
747 } | 760 } |
(...skipping 12 matching lines...) Expand all Loading... |
760 worker_task_runner->OnWorkerRunLoopStarted(runLoop); | 773 worker_task_runner->OnWorkerRunLoopStarted(runLoop); |
761 } | 774 } |
762 | 775 |
763 void WebKitPlatformSupportImpl::didStopWorkerRunLoop( | 776 void WebKitPlatformSupportImpl::didStopWorkerRunLoop( |
764 const WebKit::WebWorkerRunLoop& runLoop) { | 777 const WebKit::WebWorkerRunLoop& runLoop) { |
765 WorkerTaskRunner* worker_task_runner = WorkerTaskRunner::Instance(); | 778 WorkerTaskRunner* worker_task_runner = WorkerTaskRunner::Instance(); |
766 worker_task_runner->OnWorkerRunLoopStopped(runLoop); | 779 worker_task_runner->OnWorkerRunLoopStopped(runLoop); |
767 } | 780 } |
768 | 781 |
769 } // namespace webkit_glue | 782 } // namespace webkit_glue |
OLD | NEW |