 Chromium Code Reviews
 Chromium Code Reviews Issue 22852024:
  Track JS allocations as they arrive with no affection on performance when tracking is switched off  (Closed) 
  Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
    
  
    Issue 22852024:
  Track JS allocations as they arrive with no affection on performance when tracking is switched off  (Closed) 
  Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge| Index: src/heap-profiler.cc | 
| diff --git a/src/heap-profiler.cc b/src/heap-profiler.cc | 
| index e66af3364d865b018bdb8110af24e1087555e8b9..6b159a98a338c7b2704ed924a59bc401f8425663 100644 | 
| --- a/src/heap-profiler.cc | 
| +++ b/src/heap-profiler.cc | 
| @@ -27,6 +27,7 @@ | 
| #include "v8.h" | 
| +#include "deoptimizer.h" | 
| #include "heap-profiler.h" | 
| #include "heap-snapshot-generator-inl.h" | 
| @@ -35,7 +36,8 @@ namespace internal { | 
| HeapProfiler::HeapProfiler(Heap* heap) | 
| : snapshots_(new HeapSnapshotsCollection(heap)), | 
| - next_snapshot_uid_(1) { | 
| + next_snapshot_uid_(1), | 
| + is_tracking_allocations_(false) { | 
| } | 
| @@ -132,14 +134,86 @@ SnapshotObjectId HeapProfiler::GetSnapshotObjectId(Handle<Object> obj) { | 
| } | 
| -void HeapProfiler::ObjectMoveEvent(Address from, Address to) { | 
| - snapshots_->ObjectMoveEvent(from, to); | 
| +void HeapProfiler::ObjectMoveEvent(Address from, Address to, int size) { | 
| + snapshots_->ObjectMoveEvent(from, to, size); | 
| } | 
| + | 
| +void HeapProfiler::NewObjectEvent(Address addr, int size) { | 
| + snapshots_->NewObjectEvent(addr, size); | 
| +} | 
| 
Hannes Payer (out of office)
2013/10/02 18:00:29
If you unify the implementation in snapshot, pleas
 | 
| + | 
| + | 
| +void HeapProfiler::UpdateObjectSizeEvent(Address addr, int size) { | 
| + snapshots_->UpdateObjectSizeEvent(addr, size); | 
| +} | 
| + | 
| + | 
| void HeapProfiler::SetRetainedObjectInfo(UniqueId id, | 
| RetainedObjectInfo* info) { | 
| // TODO(yurus, marja): Don't route this information through GlobalHandles. | 
| heap()->isolate()->global_handles()->SetRetainedObjectInfo(id, info); | 
| } | 
| + | 
| +void HeapProfiler::StartHeapAllocationsRecording() { | 
| + StartHeapObjectsTracking(); | 
| + is_tracking_allocations_ = true; | 
| + DropCompiledCode(); | 
| + snapshots_->UpdateHeapObjectsMap(); | 
| +} | 
| + | 
| + | 
| +void HeapProfiler::StopHeapAllocationsRecording() { | 
| + StopHeapObjectsTracking(); | 
| + is_tracking_allocations_ = false; | 
| + DropCompiledCode(); | 
| +} | 
| + | 
| + | 
| +void HeapProfiler::RecordObjectAllocationFromMasm(Isolate* isolate, | 
| + Address obj, | 
| + int size) { | 
| + isolate->heap_profiler()->NewObjectEvent(obj, size); | 
| +} | 
| + | 
| + | 
| +void HeapProfiler::DropCompiledCode() { | 
| + Isolate* isolate = heap()->isolate(); | 
| + HandleScope scope(isolate); | 
| + | 
| + if (FLAG_concurrent_recompilation) { | 
| + isolate->optimizing_compiler_thread()->Flush(); | 
| + } | 
| + | 
| + Deoptimizer::DeoptimizeAll(isolate); | 
| + | 
| + Handle<Code> lazy_compile = | 
| + Handle<Code>(isolate->builtins()->builtin(Builtins::kLazyCompile)); | 
| + | 
| + heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, | 
| + "switch allocations tracking"); | 
| + | 
| + DisallowHeapAllocation no_allocation; | 
| + | 
| + HeapIterator iterator(heap()); | 
| + HeapObject* obj = NULL; | 
| + while (((obj = iterator.next()) != NULL)) { | 
| + if (obj->IsJSFunction()) { | 
| + JSFunction* function = JSFunction::cast(obj); | 
| + SharedFunctionInfo* shared = function->shared(); | 
| + | 
| + if (!shared->allows_lazy_compilation()) continue; | 
| + if (!shared->script()->IsScript()) continue; | 
| + | 
| + Code::Kind kind = function->code()->kind(); | 
| + if (kind == Code::FUNCTION || kind == Code::BUILTIN) { | 
| + function->set_code(*lazy_compile); | 
| + shared->set_code(*lazy_compile); | 
| + } | 
| + } | 
| + } | 
| +} | 
| + | 
| + | 
| } } // namespace v8::internal |