Commit 72ffc42d authored by hpayer@chromium.org's avatar hpayer@chromium.org

Use size_t in GCIdleTimeHandler to fix undefined behaviour.

BUG=
R=bmeurer@chromium.org

Review URL: https://codereview.chromium.org/490943002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23248 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent e929f5fe
// Copyright 2014 the V8 project 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 <climits>
#include "src/v8.h"
#include "src/heap/gc-idle-time-handler.h"
......@@ -14,8 +11,8 @@ namespace internal {
const double GCIdleTimeHandler::kConservativeTimeRatio = 0.9;
intptr_t GCIdleTimeHandler::EstimateMarkingStepSize(
int idle_time_in_ms, intptr_t marking_speed_in_bytes_per_ms) {
size_t GCIdleTimeHandler::EstimateMarkingStepSize(
size_t idle_time_in_ms, size_t marking_speed_in_bytes_per_ms) {
DCHECK(idle_time_in_ms > 0);
if (marking_speed_in_bytes_per_ms == 0) {
......@@ -23,16 +20,17 @@ intptr_t GCIdleTimeHandler::EstimateMarkingStepSize(
GCIdleTimeHandler::kInitialConservativeMarkingSpeed;
}
intptr_t marking_step_size = marking_speed_in_bytes_per_ms * idle_time_in_ms;
if (static_cast<intptr_t>(marking_step_size / idle_time_in_ms) !=
marking_speed_in_bytes_per_ms) {
size_t marking_step_size = marking_speed_in_bytes_per_ms * idle_time_in_ms;
if (marking_step_size / marking_speed_in_bytes_per_ms != idle_time_in_ms) {
// In the case of an overflow we return maximum marking step size.
return INT_MAX;
return GCIdleTimeHandler::kMaximumMarkingStepSize;
}
return Min(static_cast<intptr_t>(marking_step_size *
GCIdleTimeHandler::kConservativeTimeRatio),
static_cast<intptr_t>(INT_MAX));
if (marking_step_size > kMaximumMarkingStepSize)
return kMaximumMarkingStepSize;
return static_cast<size_t>(marking_step_size *
GCIdleTimeHandler::kConservativeTimeRatio);
}
}
}
......@@ -14,12 +14,15 @@ namespace internal {
// operations are executing during IdleNotification.
class GCIdleTimeHandler {
public:
static intptr_t EstimateMarkingStepSize(
int idle_time_in_ms, intptr_t marking_speed_in_bytes_per_ms);
static size_t EstimateMarkingStepSize(size_t idle_time_in_ms,
size_t marking_speed_in_bytes_per_ms);
// If we haven't recorded any incremental marking events yet, we carefully
// mark with a conservative lower bound for the marking speed.
static const intptr_t kInitialConservativeMarkingSpeed = 100 * KB;
static const size_t kInitialConservativeMarkingSpeed = 100 * KB;
// Maximum marking step size returned by EstimateMarkingStepSize.
static const size_t kMaximumMarkingStepSize = 700 * MB;
// We have to make sure that we finish the IdleNotification before
// idle_time_in_ms. Hence, we conservatively prune our workload estimate.
......
......@@ -4265,8 +4265,10 @@ void Heap::MakeHeapIterable() {
void Heap::AdvanceIdleIncrementalMarking(int idle_time_in_ms) {
intptr_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(
idle_time_in_ms, tracer_.IncrementalMarkingSpeedInBytesPerMillisecond());
intptr_t step_size =
static_cast<size_t>(GCIdleTimeHandler::EstimateMarkingStepSize(
idle_time_in_ms,
tracer_.IncrementalMarkingSpeedInBytesPerMillisecond()));
incremental_marking()->Step(step_size,
IncrementalMarking::NO_GC_VIA_STACK_GUARD, true);
......
......@@ -2738,6 +2738,9 @@ void PagedSpace::ReportStatistics() {
Capacity(), Waste(), Available(), pct);
if (!swept_precisely_) return;
if (heap()->mark_compact_collector()->sweeping_in_progress()) {
heap()->mark_compact_collector()->EnsureSweepingCompleted();
}
ClearHistograms(heap()->isolate());
HeapObjectIterator obj_it(this);
for (HeapObject* obj = obj_it.Next(); obj != NULL; obj = obj_it.Next())
......
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <climits>
#include <limits>
#include "src/heap/gc-idle-time-handler.h"
......@@ -12,33 +12,37 @@ namespace v8 {
namespace internal {
TEST(EstimateMarkingStepSizeTest, EstimateMarkingStepSizeInitial) {
intptr_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(1, 0);
EXPECT_EQ(static_cast<intptr_t>(
GCIdleTimeHandler::kInitialConservativeMarkingSpeed *
GCIdleTimeHandler::kConservativeTimeRatio),
step_size);
size_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(1, 0);
EXPECT_EQ(
static_cast<size_t>(GCIdleTimeHandler::kInitialConservativeMarkingSpeed *
GCIdleTimeHandler::kConservativeTimeRatio),
step_size);
}
TEST(EstimateMarkingStepSizeTest, EstimateMarkingStepSizeNonZero) {
intptr_t marking_speed_in_bytes_per_millisecond = 100;
intptr_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(
size_t marking_speed_in_bytes_per_millisecond = 100;
size_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(
1, marking_speed_in_bytes_per_millisecond);
EXPECT_EQ(static_cast<intptr_t>(marking_speed_in_bytes_per_millisecond *
GCIdleTimeHandler::kConservativeTimeRatio),
EXPECT_EQ(static_cast<size_t>(marking_speed_in_bytes_per_millisecond *
GCIdleTimeHandler::kConservativeTimeRatio),
step_size);
}
TEST(EstimateMarkingStepSizeTest, EstimateMarkingStepSizeOverflow1) {
intptr_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(10, INT_MAX);
EXPECT_EQ(INT_MAX, step_size);
size_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(
10, std::numeric_limits<size_t>::max());
EXPECT_EQ(static_cast<size_t>(GCIdleTimeHandler::kMaximumMarkingStepSize),
step_size);
}
TEST(EstimateMarkingStepSizeTest, EstimateMarkingStepSizeOverflow2) {
intptr_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(INT_MAX, 10);
EXPECT_EQ(INT_MAX, step_size);
size_t step_size = GCIdleTimeHandler::EstimateMarkingStepSize(
std::numeric_limits<size_t>::max(), 10);
EXPECT_EQ(static_cast<size_t>(GCIdleTimeHandler::kMaximumMarkingStepSize),
step_size);
}
} // namespace internal
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment