| Index: runtime/vm/trace_buffer.cc
|
| diff --git a/runtime/vm/trace_buffer.cc b/runtime/vm/trace_buffer.cc
|
| index 831e95d6abd74a5d45a79d9ff3a807a25fb9f004..93f0558071039aad70901adb6ee7904673b72595 100644
|
| --- a/runtime/vm/trace_buffer.cc
|
| +++ b/runtime/vm/trace_buffer.cc
|
| @@ -8,7 +8,10 @@
|
|
|
| namespace dart {
|
|
|
| -TraceBuffer::TraceBuffer(intptr_t capacity) : ring_capacity_(capacity) {
|
| +TraceBuffer::TraceBuffer(intptr_t initial_capacity, intptr_t maximum_capacity)
|
| + : capacity_(initial_capacity),
|
| + max_capacity_(maximum_capacity) {
|
| + size_ = 0;
|
| ring_cursor_ = 0;
|
| Init();
|
| }
|
| @@ -23,18 +26,37 @@ TraceBuffer::~TraceBuffer() {
|
|
|
| void TraceBuffer::Init() {
|
| ring_ = reinterpret_cast<TraceBufferEntry*>(
|
| - calloc(ring_capacity_, sizeof(TraceBufferEntry))); // NOLINT
|
| + calloc(capacity_, sizeof(TraceBufferEntry))); // NOLINT
|
| +}
|
| +
|
| +
|
| +void TraceBuffer::Resize(intptr_t new_capacity) {
|
| + ASSERT(new_capacity > capacity_);
|
| + if (new_capacity > max_capacity_) {
|
| + // Clamp to max_capacity_.
|
| + new_capacity = max_capacity_;
|
| + }
|
| + ASSERT(new_capacity <= max_capacity_);
|
| + ring_ = reinterpret_cast<TraceBufferEntry*>(
|
| + realloc(ring_, sizeof(*ring_) * new_capacity));
|
| + // Initialize new TraceBufferEntries.
|
| + for (intptr_t i = capacity_; i < new_capacity; i++) {
|
| + ring_[i].micros = 0;
|
| + ring_[i].message = NULL;
|
| + }
|
| + capacity_ = new_capacity;
|
| }
|
|
|
|
|
| void TraceBuffer::Clear() {
|
| - for (intptr_t i = 0; i < ring_capacity_; i++) {
|
| + for (intptr_t i = 0; i < capacity_; i++) {
|
| TraceBufferEntry& entry = ring_[i];
|
| entry.micros = 0;
|
| free(entry.message);
|
| entry.message = NULL;
|
| }
|
| ring_cursor_ = 0;
|
| + size_ = 0;
|
| }
|
|
|
|
|
| @@ -49,6 +71,14 @@ void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros, char* msg) {
|
|
|
|
|
| void TraceBuffer::AppendTrace(int64_t micros, char* message) {
|
| + if (size_ < capacity_) {
|
| + size_++;
|
| + if ((size_ == capacity_) &&
|
| + (capacity_ < max_capacity_)) {
|
| + // Double size.
|
| + Resize(capacity_ * 2);
|
| + }
|
| + }
|
| const intptr_t index = ring_cursor_;
|
| TraceBufferEntry* trace_entry = &ring_[index];
|
| Fill(trace_entry, micros, message);
|
| @@ -83,15 +113,15 @@ void TraceBuffer::TraceF(const char* format, ...) {
|
| }
|
|
|
|
|
| -void TraceBuffer::PrintToJSONStream(JSONStream* stream) const {
|
| - JSONObject json_trace_buffer(stream);
|
| - json_trace_buffer.AddProperty("type", "TraceBuffer");
|
| +void TraceBuffer::PrintToJSONObject(JSONObject* json_trace_buffer) const {
|
| + json_trace_buffer->AddProperty("type", "TraceBuffer");
|
| + json_trace_buffer->AddProperty("id", "");
|
| // TODO(johnmccutchan): Send cursor position in response.
|
| - JSONArray json_trace_buffer_array(&json_trace_buffer, "members");
|
| + JSONArray json_trace_buffer_array(json_trace_buffer, "members");
|
| // Scan forward until we find the first entry which isn't empty.
|
| // TODO(johnmccutchan): Accept cursor start position as input.
|
| intptr_t start = -1;
|
| - for (intptr_t i = 0; i < ring_capacity_; i++) {
|
| + for (intptr_t i = 0; i < capacity_; i++) {
|
| intptr_t index = RingIndex(i + ring_cursor_);
|
| if (!ring_[index].empty()) {
|
| start = index;
|
| @@ -102,7 +132,7 @@ void TraceBuffer::PrintToJSONStream(JSONStream* stream) const {
|
| if (start == -1) {
|
| return;
|
| }
|
| - for (intptr_t i = 0; i < ring_capacity_; i++) {
|
| + for (intptr_t i = 0; i < capacity_; i++) {
|
| intptr_t index = RingIndex(start + i);
|
| const TraceBufferEntry& entry = ring_[index];
|
| if (entry.empty()) {
|
| @@ -111,11 +141,18 @@ void TraceBuffer::PrintToJSONStream(JSONStream* stream) const {
|
| }
|
| JSONObject trace_entry(&json_trace_buffer_array);
|
| trace_entry.AddProperty("type", "TraceBufferEntry");
|
| - double seconds = static_cast<double>(entry.micros) /
|
| - static_cast<double>(kMicrosecondsPerSecond);
|
| - trace_entry.AddProperty("time", seconds);
|
| + trace_entry.AddProperty("id", "");
|
| + intptr_t millis =
|
| + static_cast<intptr_t>(entry.micros / kMicrosecondsPerMillisecond);
|
| + trace_entry.AddProperty("time", millis);
|
| trace_entry.AddProperty("message", entry.message);
|
| }
|
| }
|
|
|
| +
|
| +void TraceBuffer::PrintToJSONStream(JSONStream* stream) const {
|
| + JSONObject json_trace_buffer(stream);
|
| + PrintToJSONObject(&json_trace_buffer);
|
| +}
|
| +
|
| } // namespace dart
|
|
|