OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
906 TRACE_EVENT0("blink_gc", "ThreadState::invokePreFinalizers"); | 906 TRACE_EVENT0("blink_gc", "ThreadState::invokePreFinalizers"); |
907 invokePreFinalizers(*Heap::s_markingVisitor); | 907 invokePreFinalizers(*Heap::s_markingVisitor); |
908 } | 908 } |
909 } | 909 } |
910 | 910 |
911 if (isMainThread()) | 911 if (isMainThread()) |
912 ScriptForbiddenScope::exit(); | 912 ScriptForbiddenScope::exit(); |
913 } | 913 } |
914 | 914 |
915 #if defined(ADDRESS_SANITIZER) | 915 #if defined(ADDRESS_SANITIZER) |
916 // TODO(Oilpan): enable the poisoning always. | 916 poisonEagerHeaps(true); |
917 #if ENABLE(OILPAN) | |
918 for (int i = 0; i < NumberOfHeaps; i++) | |
919 m_heaps[i]->poisonUnmarkedObjects(); | |
920 #endif | |
921 #endif | 917 #endif |
922 | 918 |
923 #if ENABLE(OILPAN) | 919 #if ENABLE(OILPAN) |
924 if (gcState() == EagerSweepScheduled) { | 920 if (gcState() == EagerSweepScheduled) { |
925 // Eager sweeping should happen only in testing. | 921 // Eager sweeping should happen only in testing. |
926 setGCState(Sweeping); | 922 setGCState(Sweeping); |
923 eagerSweep(); | |
924 #if defined(ADDRESS_SANITIZER) | |
925 poisonHeapsForCompleteSweep(); | |
haraken
2015/05/28 12:30:04
poisonEagerHeaps => poisonEagerHeap
poisonHeapsFor
sof
2015/05/29 21:25:08
Done.
| |
926 #endif | |
927 completeSweep(); | 927 completeSweep(); |
928 } else { | 928 } else { |
929 // The default behavior is lazy sweeping. | 929 // The default behavior is lazy sweeping. |
930 setGCState(Sweeping); | 930 setGCState(Sweeping); |
931 eagerSweep(); | 931 eagerSweep(); |
932 #if defined(ADDRESS_SANITIZER) | |
933 poisonHeapsForCompleteSweep(); | |
934 #endif | |
932 scheduleIdleLazySweep(); | 935 scheduleIdleLazySweep(); |
933 } | 936 } |
934 #else | 937 #else |
935 // FIXME: For now, we disable lazy sweeping in non-oilpan builds | 938 // FIXME: For now, we disable lazy sweeping in non-oilpan builds |
936 // to avoid unacceptable behavior regressions on trunk. | 939 // to avoid unacceptable behavior regressions on trunk. |
937 setGCState(Sweeping); | 940 setGCState(Sweeping); |
938 completeSweep(); | 941 completeSweep(); |
939 #endif | 942 #endif |
940 | 943 |
941 #if ENABLE(GC_PROFILING) | 944 #if ENABLE(GC_PROFILING) |
942 snapshotFreeListIfNecessary(); | 945 snapshotFreeListIfNecessary(); |
943 #endif | 946 #endif |
944 } | 947 } |
945 | 948 |
949 #if defined(ADDRESS_SANITIZER) | |
950 void ThreadState::poisonHeapsForCompleteSweep() | |
951 { | |
952 // TODO(Oilpan): enable the poisoning always. | |
953 #if ENABLE(OILPAN) | |
954 // Unpoison the live objects remaining in the eager heaps.. | |
955 poisonEagerHeaps(false); | |
956 // ..along with poisoning all unmarked objects in the other heaps. | |
957 for (int i = 1; i < NumberOfHeaps; i++) | |
958 m_heaps[i]->poisonUnmarkedObjects(); | |
959 #endif | |
960 } | |
961 | |
962 void ThreadState::poisonEagerHeaps(bool poisonOrNot) | |
963 { | |
964 // TODO(Oilpan): enable the poisoning always. | |
965 #if ENABLE(OILPAN) | |
966 m_heaps[EagerSweepHeapIndex]->poisonHeap(poisonOrNot); | |
967 #endif | |
968 } | |
969 #endif | |
970 | |
946 void ThreadState::eagerSweep() | 971 void ThreadState::eagerSweep() |
947 { | 972 { |
948 // Some objects need to be finalized promptly and cannot be handled | 973 // Some objects need to be finalized promptly and cannot be handled |
949 // by lazy sweeping. Keep those in a designated heap and sweep it | 974 // by lazy sweeping. Keep those in a designated heap and sweep it |
950 // eagerly. | 975 // eagerly. |
951 ASSERT(isSweepingInProgress()); | 976 ASSERT(isSweepingInProgress()); |
952 | 977 |
953 // Mirroring the completeSweep() condition; see its comment. | 978 // Mirroring the completeSweep() condition; see its comment. |
954 if (sweepForbidden()) | 979 if (sweepForbidden()) |
955 return; | 980 return; |
(...skipping 23 matching lines...) Expand all Loading... | |
979 return; | 1004 return; |
980 | 1005 |
981 ThreadState::SweepForbiddenScope scope(this); | 1006 ThreadState::SweepForbiddenScope scope(this); |
982 { | 1007 { |
983 if (isMainThread()) | 1008 if (isMainThread()) |
984 ScriptForbiddenScope::enter(); | 1009 ScriptForbiddenScope::enter(); |
985 | 1010 |
986 TRACE_EVENT0("blink_gc", "ThreadState::completeSweep"); | 1011 TRACE_EVENT0("blink_gc", "ThreadState::completeSweep"); |
987 double timeStamp = WTF::currentTimeMS(); | 1012 double timeStamp = WTF::currentTimeMS(); |
988 | 1013 |
1014 static_assert(EagerSweepHeapIndex == 0, "Eagerly swept heaps must be pro cessed first."); | |
989 for (int i = 0; i < NumberOfHeaps; i++) | 1015 for (int i = 0; i < NumberOfHeaps; i++) |
990 m_heaps[i]->completeSweep(); | 1016 m_heaps[i]->completeSweep(); |
991 | 1017 |
992 Platform::current()->histogramCustomCounts("BlinkGC.CompleteSweep", WTF: :currentTimeMS() - timeStamp, 0, 10 * 1000, 50); | 1018 Platform::current()->histogramCustomCounts("BlinkGC.CompleteSweep", WTF: :currentTimeMS() - timeStamp, 0, 10 * 1000, 50); |
993 | 1019 |
994 if (isMainThread()) | 1020 if (isMainThread()) |
995 ScriptForbiddenScope::exit(); | 1021 ScriptForbiddenScope::exit(); |
996 } | 1022 } |
997 | 1023 |
998 postSweep(); | 1024 postSweep(); |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1348 json->beginArray(it->key.ascii().data()); | 1374 json->beginArray(it->key.ascii().data()); |
1349 for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 1375 for (size_t age = 0; age <= maxHeapObjectAge; ++age) |
1350 json->pushInteger(it->value.ages[age]); | 1376 json->pushInteger(it->value.ages[age]); |
1351 json->endArray(); | 1377 json->endArray(); |
1352 } | 1378 } |
1353 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); | 1379 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); |
1354 } | 1380 } |
1355 #endif | 1381 #endif |
1356 | 1382 |
1357 } // namespace blink | 1383 } // namespace blink |
OLD | NEW |