Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
| 7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
| 8 | 8 |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
| (...skipping 5767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5778 (stream_mask & DART_TIMELINE_STREAM_COMPILER) != 0); | 5778 (stream_mask & DART_TIMELINE_STREAM_COMPILER) != 0); |
| 5779 isolate->GetEmbedderStream()->set_enabled( | 5779 isolate->GetEmbedderStream()->set_enabled( |
| 5780 (stream_mask & DART_TIMELINE_STREAM_EMBEDDER) != 0); | 5780 (stream_mask & DART_TIMELINE_STREAM_EMBEDDER) != 0); |
| 5781 isolate->GetGCStream()->set_enabled( | 5781 isolate->GetGCStream()->set_enabled( |
| 5782 (stream_mask & DART_TIMELINE_STREAM_GC) != 0); | 5782 (stream_mask & DART_TIMELINE_STREAM_GC) != 0); |
| 5783 isolate->GetIsolateStream()->set_enabled( | 5783 isolate->GetIsolateStream()->set_enabled( |
| 5784 (stream_mask & DART_TIMELINE_STREAM_ISOLATE) != 0); | 5784 (stream_mask & DART_TIMELINE_STREAM_ISOLATE) != 0); |
| 5785 } | 5785 } |
| 5786 | 5786 |
| 5787 | 5787 |
| 5788 DART_EXPORT bool Dart_TimelineGetTrace(const char** output, | 5788 DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
| 5789 intptr_t* output_length) { | 5789 void* user_data) { |
| 5790 Isolate* isolate = Isolate::Current(); | 5790 Isolate* isolate = Isolate::Current(); |
| 5791 CHECK_ISOLATE(isolate); | 5791 CHECK_ISOLATE(isolate); |
| 5792 if (output == NULL) { | 5792 if (consumer == NULL) { |
| 5793 return false; | |
| 5794 } | |
| 5795 if (output_length == NULL) { | |
| 5796 return false; | 5793 return false; |
| 5797 } | 5794 } |
| 5798 TimelineEventRecorder* timeline_recorder = isolate->timeline_event_recorder(); | 5795 TimelineEventRecorder* timeline_recorder = isolate->timeline_event_recorder(); |
| 5799 if (timeline_recorder == NULL) { | 5796 if (timeline_recorder == NULL) { |
| 5800 // Nothing has been recorded. | 5797 // Nothing has been recorded. |
| 5801 return false; | 5798 return false; |
| 5802 } | 5799 } |
| 5803 // Suspend execution of other threads while serializing to JSON. | 5800 // Suspend execution of other threads while serializing to JSON. |
| 5804 isolate->thread_registry()->SafepointThreads(); | 5801 isolate->thread_registry()->SafepointThreads(); |
| 5805 JSONStream js; | 5802 JSONStream js; |
| 5806 timeline_recorder->PrintJSON(&js); | 5803 timeline_recorder->PrintJSON(&js); |
| 5807 js.Steal(output, output_length); | 5804 // Resume execution of other threads. |
| 5808 isolate->thread_registry()->ResumeAllThreads(); | 5805 isolate->thread_registry()->ResumeAllThreads(); |
| 5806 | |
| 5807 // Copy output. | |
| 5808 char* output = NULL; | |
| 5809 intptr_t output_length = 0; | |
| 5810 js.Steal(const_cast<const char**>(&output), &output_length); | |
| 5811 if (output != NULL) { | |
| 5812 // Add one for the '\0' character. | |
| 5813 output_length++; | |
| 5814 } | |
| 5815 // Start stream. | |
| 5816 const char* kStreamName = "timeline"; | |
| 5817 const intptr_t kDataSize = 64 * KB; | |
| 5818 consumer(DART_STREAM_CONSUMER_STATE_START, | |
| 5819 kStreamName, | |
| 5820 NULL, | |
| 5821 0, | |
| 5822 user_data); | |
| 5823 | |
| 5824 // Stream out data. | |
| 5825 intptr_t cursor = 0; | |
| 5826 intptr_t remaining = output_length - cursor; | |
|
siva
2015/08/11 16:54:33
intptr_t remaining = output_length;
Cutch
2015/08/11 17:08:56
Done.
| |
| 5827 while (remaining >= kDataSize) { | |
| 5828 consumer(DART_STREAM_CONSUMER_STATE_DATA, | |
| 5829 kStreamName, | |
| 5830 reinterpret_cast<uint8_t*>(&output[cursor]), | |
| 5831 kDataSize, | |
| 5832 user_data); | |
| 5833 cursor += kDataSize; | |
| 5834 remaining -= kDataSize; | |
| 5835 } | |
| 5836 if (remaining > 0) { | |
| 5837 ASSERT(remaining < kDataSize); | |
| 5838 consumer(DART_STREAM_CONSUMER_STATE_DATA, | |
| 5839 kStreamName, | |
| 5840 reinterpret_cast<uint8_t*>(&output[cursor]), | |
| 5841 remaining, | |
| 5842 user_data); | |
| 5843 cursor += remaining; | |
| 5844 remaining -= remaining; | |
| 5845 } | |
| 5846 ASSERT(cursor == output_length); | |
| 5847 ASSERT(remaining == 0); | |
| 5848 | |
| 5849 // Finish stream. | |
| 5850 consumer(DART_STREAM_CONSUMER_STATE_FINISH, | |
| 5851 kStreamName, | |
| 5852 NULL, | |
| 5853 0, | |
| 5854 user_data); | |
|
siva
2015/08/11 16:54:33
Why does start and end have to have a NULL buffer
Cutch
2015/08/11 17:08:56
I find this API simpler to work with.
| |
| 5809 return true; | 5855 return true; |
| 5810 } | 5856 } |
| 5811 | 5857 |
| 5812 | 5858 |
| 5813 DART_EXPORT Dart_Handle Dart_TimelineDuration(const char* label, | 5859 DART_EXPORT Dart_Handle Dart_TimelineDuration(const char* label, |
| 5814 int64_t start_micros, | 5860 int64_t start_micros, |
| 5815 int64_t end_micros) { | 5861 int64_t end_micros) { |
| 5816 Isolate* isolate = Isolate::Current(); | 5862 Isolate* isolate = Isolate::Current(); |
| 5817 CHECK_ISOLATE(isolate); | 5863 CHECK_ISOLATE(isolate); |
| 5818 if (label == NULL) { | 5864 if (label == NULL) { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5907 ASSERT(stream != NULL); | 5953 ASSERT(stream != NULL); |
| 5908 TimelineEvent* event = stream->StartEvent(); | 5954 TimelineEvent* event = stream->StartEvent(); |
| 5909 if (event != NULL) { | 5955 if (event != NULL) { |
| 5910 event->AsyncEnd(label, async_id); | 5956 event->AsyncEnd(label, async_id); |
| 5911 event->Complete(); | 5957 event->Complete(); |
| 5912 } | 5958 } |
| 5913 return Api::Success(); | 5959 return Api::Success(); |
| 5914 } | 5960 } |
| 5915 | 5961 |
| 5916 } // namespace dart | 5962 } // namespace dart |
| OLD | NEW |