Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: test/cctest/test-api.cc

Issue 10209026: Make sure idle notifications perform a round of incremental GCs after context disposal. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add test Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/heap.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 13977 matching lines...) Expand 10 before | Expand all | Expand 10 after
13988 "\n" 13988 "\n"
13989 " bar();\n" 13989 " bar();\n"
13990 "}\n" 13990 "}\n"
13991 "foo();\n" 13991 "foo();\n"
13992 "}\n" 13992 "}\n"
13993 "eval('(' + outer +')()//@ sourceURL=eval_url');"; 13993 "eval('(' + outer +')()//@ sourceURL=eval_url');";
13994 CHECK(CompileRun(source)->IsUndefined()); 13994 CHECK(CompileRun(source)->IsUndefined());
13995 } 13995 }
13996 13996
13997 13997
13998 // Test that idle notification can be handled and eventually returns true. 13998 static void CreateGarbageInOldSpace() {
13999 // This just checks the contract of the IdleNotification() function,
14000 // and does not verify that it does reasonable work.
14001 THREADED_TEST(IdleNotification) {
14002 v8::HandleScope scope; 13999 v8::HandleScope scope;
14003 LocalContext env; 14000 i::AlwaysAllocateScope always_allocate;
14004 { 14001 for (int i = 0; i < 1000; i++) {
14005 // Create garbage in old-space to generate work for idle notification. 14002 FACTORY->NewFixedArray(1000, i::TENURED);
14006 i::AlwaysAllocateScope always_allocate;
14007 for (int i = 0; i < 100; i++) {
14008 FACTORY->NewFixedArray(1000, i::TENURED);
14009 }
14010 } 14003 }
14011 bool finshed_idle_work = false;
14012 for (int i = 0; i < 100 && !finshed_idle_work; i++) {
14013 finshed_idle_work = v8::V8::IdleNotification();
14014 }
14015 CHECK(finshed_idle_work);
14016 } 14004 }
14017 14005
14018 // Test that idle notification can be handled and eventually returns true. 14006 // Test that idle notification can be handled and eventually returns true.
14019 // This just checks the contract of the IdleNotification() function, 14007 TEST(IdleNotification) {
14020 // and does not verify that it does reasonable work. 14008 const intptr_t MB = 1024 * 1024;
14021 TEST(IdleNotificationWithSmallHint) {
14022 v8::HandleScope scope; 14009 v8::HandleScope scope;
14023 LocalContext env; 14010 LocalContext env;
14024 { 14011 intptr_t initial_size = HEAP->SizeOfObjects();
14025 // Create garbage in old-space to generate work for idle notification. 14012 CreateGarbageInOldSpace();
14026 i::AlwaysAllocateScope always_allocate; 14013 intptr_t size_with_garbage = HEAP->SizeOfObjects();
14027 for (int i = 0; i < 100; i++) { 14014 CHECK_GT(size_with_garbage, initial_size + MB);
14028 FACTORY->NewFixedArray(1000, i::TENURED); 14015 bool finished = false;
14029 } 14016 for (int i = 0; i < 200 && !finished; i++) {
14017 finished = v8::V8::IdleNotification();
14030 } 14018 }
14031 intptr_t old_size = HEAP->SizeOfObjects(); 14019 intptr_t final_size = HEAP->SizeOfObjects();
14032 bool finshed_idle_work = false; 14020 CHECK(finished);
14033 bool no_idle_work = v8::V8::IdleNotification(10); 14021 CHECK_LT(final_size, initial_size + 1);
14034 for (int i = 0; i < 200 && !finshed_idle_work; i++) {
14035 finshed_idle_work = v8::V8::IdleNotification(10);
14036 }
14037 intptr_t new_size = HEAP->SizeOfObjects();
14038 CHECK(finshed_idle_work);
14039 CHECK(no_idle_work || new_size < old_size);
14040 } 14022 }
14041 14023
14042 14024
14043 // This just checks the contract of the IdleNotification() function, 14025 // Test that idle notification can be handled and eventually collects garbage.
14044 // and does not verify that it does reasonable work. 14026 TEST(IdleNotificationWithSmallHint) {
14045 TEST(IdleNotificationWithLargeHint) { 14027 const intptr_t MB = 1024 * 1024;
14028 const int IdlePauseInMs = 900;
14046 v8::HandleScope scope; 14029 v8::HandleScope scope;
14047 LocalContext env; 14030 LocalContext env;
14048 { 14031 intptr_t initial_size = HEAP->SizeOfObjects();
14049 // Create garbage in old-space to generate work for idle notification. 14032 CreateGarbageInOldSpace();
14050 i::AlwaysAllocateScope always_allocate; 14033 intptr_t size_with_garbage = HEAP->SizeOfObjects();
14051 for (int i = 0; i < 100; i++) { 14034 CHECK_GT(size_with_garbage, initial_size + MB);
14052 FACTORY->NewFixedArray(1000, i::TENURED); 14035 bool finished = false;
14053 } 14036 for (int i = 0; i < 200 && !finished; i++) {
14037 finished = v8::V8::IdleNotification(IdlePauseInMs);
14054 } 14038 }
14055 intptr_t old_size = HEAP->SizeOfObjects(); 14039 intptr_t final_size = HEAP->SizeOfObjects();
14056 bool finshed_idle_work = false; 14040 CHECK(finished);
14057 bool no_idle_work = v8::V8::IdleNotification(900); 14041 CHECK_LT(final_size, initial_size + 1);
14058 for (int i = 0; i < 200 && !finshed_idle_work; i++) {
14059 finshed_idle_work = v8::V8::IdleNotification(900);
14060 }
14061 intptr_t new_size = HEAP->SizeOfObjects();
14062 CHECK(finshed_idle_work);
14063 CHECK(no_idle_work || new_size < old_size);
14064 } 14042 }
14065 14043
14066 14044
14045 // Test that idle notification can be handled and eventually collects garbage.
14046 TEST(IdleNotificationWithLargeHint) {
14047 const intptr_t MB = 1024 * 1024;
14048 const int IdlePauseInMs = 900;
14049 v8::HandleScope scope;
14050 LocalContext env;
14051 intptr_t initial_size = HEAP->SizeOfObjects();
14052 CreateGarbageInOldSpace();
14053 intptr_t size_with_garbage = HEAP->SizeOfObjects();
14054 CHECK_GT(size_with_garbage, initial_size + MB);
14055 bool finished = false;
14056 for (int i = 0; i < 200 && !finished; i++) {
14057 finished = v8::V8::IdleNotification(IdlePauseInMs);
14058 }
14059 intptr_t final_size = HEAP->SizeOfObjects();
14060 CHECK(finished);
14061 CHECK_LT(final_size, initial_size + 1);
14062 }
14063
14064
14065 TEST(Regress2107) {
14066 const intptr_t MB = 1024 * 1024;
14067 const int kShortIdlePauseInMs = 100;
14068 const int kLongIdlePauseInMs = 1000;
14069 v8::HandleScope scope;
14070 LocalContext env;
14071 intptr_t initial_size = HEAP->SizeOfObjects();
14072 // Send idle notification to start a round of incremental GCs.
14073 v8::V8::IdleNotification(kShortIdlePauseInMs);
14074 // Emulate 7 page reloads.
14075 for (int i = 0; i < 7; i++) {
14076 v8::Persistent<v8::Context> ctx = v8::Context::New();
14077 ctx->Enter();
14078 CreateGarbageInOldSpace();
14079 ctx->Exit();
14080 ctx.Dispose();
14081 v8::V8::ContextDisposedNotification();
14082 v8::V8::IdleNotification(kLongIdlePauseInMs);
14083 }
14084 // Create garbage and check that idle notification still collects it.
14085 CreateGarbageInOldSpace();
14086 intptr_t size_with_garbage = HEAP->SizeOfObjects();
14087 CHECK_GT(size_with_garbage, initial_size + MB);
14088 bool finished = false;
14089 for (int i = 0; i < 200 && !finished; i++) {
14090 finished = v8::V8::IdleNotification(kShortIdlePauseInMs);
14091 }
14092 intptr_t final_size = HEAP->SizeOfObjects();
14093 CHECK_LT(final_size, initial_size + 1);
14094 }
14095
14067 static uint32_t* stack_limit; 14096 static uint32_t* stack_limit;
14068 14097
14069 static v8::Handle<Value> GetStackLimitCallback(const v8::Arguments& args) { 14098 static v8::Handle<Value> GetStackLimitCallback(const v8::Arguments& args) {
14070 stack_limit = reinterpret_cast<uint32_t*>( 14099 stack_limit = reinterpret_cast<uint32_t*>(
14071 i::Isolate::Current()->stack_guard()->real_climit()); 14100 i::Isolate::Current()->stack_guard()->real_climit());
14072 return v8::Undefined(); 14101 return v8::Undefined();
14073 } 14102 }
14074 14103
14075 14104
14076 // Uses the address of a local variable to determine the stack top now. 14105 // Uses the address of a local variable to determine the stack top now.
(...skipping 2456 matching lines...) Expand 10 before | Expand all | Expand 10 after
16533 v8::V8::SetFatalErrorHandler(CountingErrorCallback); 16562 v8::V8::SetFatalErrorHandler(CountingErrorCallback);
16534 v8::Utils::ReportApiFailure("StringEmpty()", "Kill V8"); 16563 v8::Utils::ReportApiFailure("StringEmpty()", "Kill V8");
16535 i::Isolate::Current()->TearDown(); 16564 i::Isolate::Current()->TearDown();
16536 CHECK(!i::Internals::IsInitialized(isolate)); 16565 CHECK(!i::Internals::IsInitialized(isolate));
16537 CHECK_EQ(1, fatal_error_callback_counter); 16566 CHECK_EQ(1, fatal_error_callback_counter);
16538 CHECK(v8::String::Empty().IsEmpty()); 16567 CHECK(v8::String::Empty().IsEmpty());
16539 CHECK_EQ(2, fatal_error_callback_counter); 16568 CHECK_EQ(2, fatal_error_callback_counter);
16540 CHECK(v8::String::Empty(isolate).IsEmpty()); 16569 CHECK(v8::String::Empty(isolate).IsEmpty());
16541 CHECK_EQ(3, fatal_error_callback_counter); 16570 CHECK_EQ(3, fatal_error_callback_counter);
16542 } 16571 }
OLDNEW
« no previous file with comments | « src/heap.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698