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

Side by Side Diff: src/d8.cc

Issue 1147343004: Fixed memory-leak in d8. It did not clean evaluation context used for executing shell commands. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed version Created 5 years, 6 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
« no previous file with comments | « src/d8.h ('k') | test/mjsunit/regress/regress-crbug-493284.js » ('j') | 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 // 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 5
6 // Defined when linking against shared lib on Windows. 6 // Defined when linking against shared lib on Windows.
7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED)
8 #define V8_SHARED 8 #define V8_SHARED
9 #endif 9 #endif
10 10
(...skipping 1321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 { 1332 {
1333 HandleScope scope(isolate); 1333 HandleScope scope(isolate);
1334 PerIsolateData data(isolate); 1334 PerIsolateData data(isolate);
1335 Local<Context> context = Shell::CreateEvaluationContext(isolate); 1335 Local<Context> context = Shell::CreateEvaluationContext(isolate);
1336 { 1336 {
1337 Context::Scope cscope(context); 1337 Context::Scope cscope(context);
1338 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); 1338 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate));
1339 Execute(isolate); 1339 Execute(isolate);
1340 } 1340 }
1341 } 1341 }
1342 if (Shell::options.send_idle_notification) { 1342 Shell::CollectGarbage(isolate);
1343 const double kLongIdlePauseInSeconds = 1.0;
1344 isolate->ContextDisposedNotification();
1345 isolate->IdleNotificationDeadline(
1346 g_platform->MonotonicallyIncreasingTime() +
1347 kLongIdlePauseInSeconds);
1348 }
1349 if (Shell::options.invoke_weak_callbacks) {
1350 // By sending a low memory notifications, we will try hard to collect
1351 // all garbage and will therefore also invoke all weak callbacks of
1352 // actually unreachable persistent handles.
1353 isolate->LowMemoryNotification();
1354 }
1355 } 1343 }
1356 done_semaphore_.Signal(); 1344 done_semaphore_.Signal();
1357 } while (!Shell::options.last_run); 1345 } while (!Shell::options.last_run);
1358 1346
1359 isolate->Dispose(); 1347 isolate->Dispose();
1360 } 1348 }
1361 1349
1362 1350
1363 void SourceGroup::StartExecuteInThread() { 1351 void SourceGroup::StartExecuteInThread() {
1364 if (thread_ == NULL) { 1352 if (thread_ == NULL) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 options.stress_deopt = false; 1394 options.stress_deopt = false;
1407 } else if (strcmp(argv[i], "--logfile-per-isolate") == 0) { 1395 } else if (strcmp(argv[i], "--logfile-per-isolate") == 0) {
1408 logfile_per_isolate = true; 1396 logfile_per_isolate = true;
1409 argv[i] = NULL; 1397 argv[i] = NULL;
1410 } else if (strcmp(argv[i], "--shell") == 0) { 1398 } else if (strcmp(argv[i], "--shell") == 0) {
1411 options.interactive_shell = true; 1399 options.interactive_shell = true;
1412 argv[i] = NULL; 1400 argv[i] = NULL;
1413 } else if (strcmp(argv[i], "--test") == 0) { 1401 } else if (strcmp(argv[i], "--test") == 0) {
1414 options.test_shell = true; 1402 options.test_shell = true;
1415 argv[i] = NULL; 1403 argv[i] = NULL;
1404 } else if (strcmp(argv[i], "--notest") == 0 ||
1405 strcmp(argv[i], "--no-test") == 0) {
1406 options.test_shell = false;
1407 argv[i] = NULL;
1416 } else if (strcmp(argv[i], "--send-idle-notification") == 0) { 1408 } else if (strcmp(argv[i], "--send-idle-notification") == 0) {
1417 options.send_idle_notification = true; 1409 options.send_idle_notification = true;
1418 argv[i] = NULL; 1410 argv[i] = NULL;
1419 } else if (strcmp(argv[i], "--invoke-weak-callbacks") == 0) { 1411 } else if (strcmp(argv[i], "--invoke-weak-callbacks") == 0) {
1420 options.invoke_weak_callbacks = true; 1412 options.invoke_weak_callbacks = true;
1421 // TODO(jochen) See issue 3351 1413 // TODO(jochen) See issue 3351
1422 options.send_idle_notification = true; 1414 options.send_idle_notification = true;
1423 argv[i] = NULL; 1415 argv[i] = NULL;
1424 } else if (strcmp(argv[i], "--omit-quit") == 0) { 1416 } else if (strcmp(argv[i], "--omit-quit") == 0) {
1425 options.omit_quit = true; 1417 options.omit_quit = true;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1535 InstallUtilityScript(isolate); 1527 InstallUtilityScript(isolate);
1536 } 1528 }
1537 #endif // !V8_SHARED 1529 #endif // !V8_SHARED
1538 } 1530 }
1539 { 1531 {
1540 Context::Scope cscope(context); 1532 Context::Scope cscope(context);
1541 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); 1533 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate));
1542 options.isolate_sources[0].Execute(isolate); 1534 options.isolate_sources[0].Execute(isolate);
1543 } 1535 }
1544 } 1536 }
1537 CollectGarbage(isolate);
1538 #ifndef V8_SHARED
1539 for (int i = 1; i < options.num_isolates; ++i) {
1540 options.isolate_sources[i].WaitForThread();
1541 }
1542 #endif // !V8_SHARED
1543 return 0;
1544 }
1545
1546
1547 void Shell::CollectGarbage(Isolate* isolate) {
1545 if (options.send_idle_notification) { 1548 if (options.send_idle_notification) {
1546 const double kLongIdlePauseInSeconds = 1.0; 1549 const double kLongIdlePauseInSeconds = 1.0;
1547 isolate->ContextDisposedNotification(); 1550 isolate->ContextDisposedNotification();
1548 isolate->IdleNotificationDeadline( 1551 isolate->IdleNotificationDeadline(
1549 g_platform->MonotonicallyIncreasingTime() + kLongIdlePauseInSeconds); 1552 g_platform->MonotonicallyIncreasingTime() + kLongIdlePauseInSeconds);
1550 } 1553 }
1551 if (options.invoke_weak_callbacks) { 1554 if (options.invoke_weak_callbacks) {
1552 // By sending a low memory notifications, we will try hard to collect all 1555 // By sending a low memory notifications, we will try hard to collect all
1553 // garbage and will therefore also invoke all weak callbacks of actually 1556 // garbage and will therefore also invoke all weak callbacks of actually
1554 // unreachable persistent handles. 1557 // unreachable persistent handles.
1555 isolate->LowMemoryNotification(); 1558 isolate->LowMemoryNotification();
1556 } 1559 }
1557
1558 #ifndef V8_SHARED
1559 for (int i = 1; i < options.num_isolates; ++i) {
1560 options.isolate_sources[i].WaitForThread();
1561 }
1562 #endif // !V8_SHARED
1563 return 0;
1564 } 1560 }
1565 1561
1566 1562
1567 #ifndef V8_SHARED 1563 #ifndef V8_SHARED
1568 static void DumpHeapConstants(i::Isolate* isolate) { 1564 static void DumpHeapConstants(i::Isolate* isolate) {
1569 i::Heap* heap = isolate->heap(); 1565 i::Heap* heap = isolate->heap();
1570 1566
1571 // Dump the INSTANCE_TYPES table to the console. 1567 // Dump the INSTANCE_TYPES table to the console.
1572 printf("# List of known V8 instance types.\n"); 1568 printf("# List of known V8 instance types.\n");
1573 #define DUMP_TYPE(T) printf(" %d: \"%s\",\n", i::T, #T); 1569 #define DUMP_TYPE(T) printf(" %d: \"%s\",\n", i::T, #T);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 // Run interactive shell if explicitly requested or if no script has been 1718 // Run interactive shell if explicitly requested or if no script has been
1723 // executed, but never on --test 1719 // executed, but never on --test
1724 if (options.use_interactive_shell()) { 1720 if (options.use_interactive_shell()) {
1725 #ifndef V8_SHARED 1721 #ifndef V8_SHARED
1726 if (!i::FLAG_debugger) { 1722 if (!i::FLAG_debugger) {
1727 InstallUtilityScript(isolate); 1723 InstallUtilityScript(isolate);
1728 } 1724 }
1729 #endif // !V8_SHARED 1725 #endif // !V8_SHARED
1730 RunShell(isolate); 1726 RunShell(isolate);
1731 } 1727 }
1728
1729 // Shut down contexts and collect garbage.
1730 evaluation_context_.Reset();
1731 #ifndef V8_SHARED
1732 utility_context_.Reset();
1733 #endif // !V8_SHARED
1734 CollectGarbage(isolate);
1732 } 1735 }
1733 OnExit(isolate); 1736 OnExit(isolate);
1734 #ifndef V8_SHARED 1737 #ifndef V8_SHARED
1735 // Dump basic block profiling data. 1738 // Dump basic block profiling data.
1736 if (i::BasicBlockProfiler* profiler = 1739 if (i::BasicBlockProfiler* profiler =
1737 reinterpret_cast<i::Isolate*>(isolate)->basic_block_profiler()) { 1740 reinterpret_cast<i::Isolate*>(isolate)->basic_block_profiler()) {
1738 i::OFStream os(stdout); 1741 i::OFStream os(stdout);
1739 os << *profiler; 1742 os << *profiler;
1740 } 1743 }
1741 #endif // !V8_SHARED 1744 #endif // !V8_SHARED
1742 isolate->Dispose(); 1745 isolate->Dispose();
1743 V8::Dispose(); 1746 V8::Dispose();
1744 V8::ShutdownPlatform(); 1747 V8::ShutdownPlatform();
1745 delete g_platform; 1748 delete g_platform;
1746 1749
1747 return result; 1750 return result;
1748 } 1751 }
1749 1752
1750 } // namespace v8 1753 } // namespace v8
1751 1754
1752 1755
1753 #ifndef GOOGLE3 1756 #ifndef GOOGLE3
1754 int main(int argc, char* argv[]) { 1757 int main(int argc, char* argv[]) {
1755 return v8::Shell::Main(argc, argv); 1758 return v8::Shell::Main(argc, argv);
1756 } 1759 }
1757 #endif 1760 #endif
OLDNEW
« no previous file with comments | « src/d8.h ('k') | test/mjsunit/regress/regress-crbug-493284.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698