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

Side by Side Diff: runtime/vm/timeline.cc

Issue 1514653002: - Assert that we do not hold the timeline lock while entering (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 <cstdlib> 5 #include <cstdlib>
6 6
7 #include "vm/atomic.h" 7 #include "vm/atomic.h"
8 #include "vm/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/json_stream.h" 9 #include "vm/json_stream.h"
10 #include "vm/lockers.h" 10 #include "vm/lockers.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 thread_ = OSThread::kInvalidThreadId; 182 thread_ = OSThread::kInvalidThreadId;
183 isolate_id_ = ILLEGAL_PORT; 183 isolate_id_ = ILLEGAL_PORT;
184 category_ = ""; 184 category_ = "";
185 label_ = NULL; 185 label_ = NULL;
186 FreeArguments(); 186 FreeArguments();
187 } 187 }
188 188
189 189
190 void TimelineEvent::AsyncBegin(const char* label, int64_t async_id) { 190 void TimelineEvent::AsyncBegin(const char* label, int64_t async_id) {
191 Init(kAsyncBegin, label); 191 Init(kAsyncBegin, label);
192 timestamp0_ = OS::GetCurrentMonotonicMicros(); 192 set_timestamp0(OS::GetCurrentMonotonicMicros());
193 // Overload timestamp1_ with the async_id. 193 // Overload timestamp1_ with the async_id.
194 timestamp1_ = async_id; 194 set_timestamp1(async_id);
195 } 195 }
196 196
197 197
198 void TimelineEvent::AsyncInstant(const char* label, 198 void TimelineEvent::AsyncInstant(const char* label,
199 int64_t async_id) { 199 int64_t async_id) {
200 Init(kAsyncInstant, label); 200 Init(kAsyncInstant, label);
201 timestamp0_ = OS::GetCurrentMonotonicMicros(); 201 set_timestamp0(OS::GetCurrentMonotonicMicros());
202 // Overload timestamp1_ with the async_id. 202 // Overload timestamp1_ with the async_id.
203 timestamp1_ = async_id; 203 set_timestamp1(async_id);
204 } 204 }
205 205
206 206
207 void TimelineEvent::AsyncEnd(const char* label, 207 void TimelineEvent::AsyncEnd(const char* label,
208 int64_t async_id) { 208 int64_t async_id) {
209 Init(kAsyncEnd, label); 209 Init(kAsyncEnd, label);
210 timestamp0_ = OS::GetCurrentMonotonicMicros(); 210 set_timestamp0(OS::GetCurrentMonotonicMicros());
211 // Overload timestamp1_ with the async_id. 211 // Overload timestamp1_ with the async_id.
212 timestamp1_ = async_id; 212 set_timestamp1(async_id);
213 } 213 }
214 214
215 215
216 void TimelineEvent::DurationBegin(const char* label) { 216 void TimelineEvent::DurationBegin(const char* label) {
217 Init(kDuration, label); 217 Init(kDuration, label);
218 timestamp0_ = OS::GetCurrentMonotonicMicros(); 218 set_timestamp0(OS::GetCurrentMonotonicMicros());
219 } 219 }
220 220
221 221
222 void TimelineEvent::DurationEnd() { 222 void TimelineEvent::DurationEnd() {
223 timestamp1_ = OS::GetCurrentMonotonicMicros(); 223 ASSERT(timestamp1_ == 0);
224 set_timestamp1(OS::GetCurrentMonotonicMicros());
224 } 225 }
225 226
226 227
227 void TimelineEvent::Instant(const char* label) { 228 void TimelineEvent::Instant(const char* label) {
228 Init(kInstant, label); 229 Init(kInstant, label);
229 timestamp0_ = OS::GetCurrentMonotonicMicros(); 230 set_timestamp0(OS::GetCurrentMonotonicMicros());
230 } 231 }
231 232
232 233
233 void TimelineEvent::Duration(const char* label, 234 void TimelineEvent::Duration(const char* label,
234 int64_t start_micros, 235 int64_t start_micros,
235 int64_t end_micros) { 236 int64_t end_micros) {
236 Init(kDuration, label); 237 Init(kDuration, label);
237 timestamp0_ = start_micros; 238 set_timestamp0(start_micros);
238 timestamp1_ = end_micros; 239 set_timestamp1(end_micros);
239 } 240 }
240 241
241 242
242 void TimelineEvent::Begin(const char* label, 243 void TimelineEvent::Begin(const char* label,
243 int64_t micros) { 244 int64_t micros) {
244 Init(kBegin, label); 245 Init(kBegin, label);
245 timestamp0_ = micros; 246 set_timestamp0(micros);
246 } 247 }
247 248
248 249
249 void TimelineEvent::End(const char* label, 250 void TimelineEvent::End(const char* label,
250 int64_t micros) { 251 int64_t micros) {
251 Init(kEnd, label); 252 Init(kEnd, label);
252 timestamp0_ = micros; 253 set_timestamp0(micros);
253 } 254 }
254 255
255 256
256 void TimelineEvent::SerializedJSON(const char* json) { 257 void TimelineEvent::SerializedJSON(const char* json) {
257 Init(kSerializedJSON, "Dart"); 258 Init(kSerializedJSON, "Dart");
258 SetNumArguments(1); 259 SetNumArguments(1);
259 CopyArgument(0, "Dart", json); 260 CopyArgument(0, "Dart", json);
260 } 261 }
261 262
262 263
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 669
669 TimelineEvent* TimelineEventRecorder::ThreadBlockStartEvent() { 670 TimelineEvent* TimelineEventRecorder::ThreadBlockStartEvent() {
670 // Grab the current thread. 671 // Grab the current thread.
671 OSThread* thread = OSThread::Current(); 672 OSThread* thread = OSThread::Current();
672 ASSERT(thread != NULL); 673 ASSERT(thread != NULL);
673 Mutex* thread_block_lock = thread->timeline_block_lock(); 674 Mutex* thread_block_lock = thread->timeline_block_lock();
674 ASSERT(thread_block_lock != NULL); 675 ASSERT(thread_block_lock != NULL);
675 // We are accessing the thread's timeline block- so take the lock here. 676 // We are accessing the thread's timeline block- so take the lock here.
676 // This lock will be held until the call to |CompleteEvent| is made. 677 // This lock will be held until the call to |CompleteEvent| is made.
677 thread_block_lock->Lock(); 678 thread_block_lock->Lock();
679 #if defined(DEBUG)
680 Thread* T = Thread::Current();
681 if (T != NULL) {
682 T->IncrementNoSafepointScopeDepth();
683 }
684 #endif // defined(DEBUG)
678 685
679 TimelineEventBlock* thread_block = thread->timeline_block(); 686 TimelineEventBlock* thread_block = thread->timeline_block();
680 687
681 if ((thread_block != NULL) && thread_block->IsFull()) { 688 if ((thread_block != NULL) && thread_block->IsFull()) {
682 MutexLocker ml(&lock_); 689 MutexLocker ml(&lock_);
683 // Thread has a block and it is full: 690 // Thread has a block and it is full:
684 // 1) Mark it as finished. 691 // 1) Mark it as finished.
685 thread_block->Finish(); 692 thread_block->Finish();
686 // 2) Allocate a new block. 693 // 2) Allocate a new block.
687 thread_block = GetNewBlockLocked(); 694 thread_block = GetNewBlockLocked();
688 thread->set_timeline_block(thread_block); 695 thread->set_timeline_block(thread_block);
689 } else if (thread_block == NULL) { 696 } else if (thread_block == NULL) {
690 MutexLocker ml(&lock_); 697 MutexLocker ml(&lock_);
691 // Thread has no block. Attempt to allocate one. 698 // Thread has no block. Attempt to allocate one.
692 thread_block = GetNewBlockLocked(); 699 thread_block = GetNewBlockLocked();
693 thread->set_timeline_block(thread_block); 700 thread->set_timeline_block(thread_block);
694 } 701 }
695 if (thread_block != NULL) { 702 if (thread_block != NULL) {
696 // NOTE: We are exiting this function with the thread's block lock held. 703 // NOTE: We are exiting this function with the thread's block lock held.
697 ASSERT(!thread_block->IsFull()); 704 ASSERT(!thread_block->IsFull());
698 TimelineEvent* event = thread_block->StartEvent(); 705 TimelineEvent* event = thread_block->StartEvent();
699 return event; 706 return event;
700 } 707 }
701 // Drop lock here as no event is being handed out. 708 // Drop lock here as no event is being handed out.
709 #if defined(DEBUG)
710 if (T != NULL) {
711 T->DecrementNoSafepointScopeDepth();
712 }
713 #endif // defined(DEBUG)
702 thread_block_lock->Unlock(); 714 thread_block_lock->Unlock();
703 return NULL; 715 return NULL;
704 } 716 }
705 717
706 718
707 void TimelineEventRecorder::ThreadBlockCompleteEvent(TimelineEvent* event) { 719 void TimelineEventRecorder::ThreadBlockCompleteEvent(TimelineEvent* event) {
708 if (event == NULL) { 720 if (event == NULL) {
709 return; 721 return;
710 } 722 }
711 // Grab the current thread. 723 // Grab the current thread.
712 OSThread* thread = OSThread::Current(); 724 OSThread* thread = OSThread::Current();
713 ASSERT(thread != NULL); 725 ASSERT(thread != NULL);
714 // Unlock the thread's block lock. 726 // Unlock the thread's block lock.
715 Mutex* thread_block_lock = thread->timeline_block_lock(); 727 Mutex* thread_block_lock = thread->timeline_block_lock();
716 ASSERT(thread_block_lock != NULL); 728 ASSERT(thread_block_lock != NULL);
729 #if defined(DEBUG)
730 Thread* T = Thread::Current();
731 if (T != NULL) {
732 T->DecrementNoSafepointScopeDepth();
733 }
734 #endif // defined(DEBUG)
717 thread_block_lock->Unlock(); 735 thread_block_lock->Unlock();
718 } 736 }
719 737
720 738
721 void TimelineEventRecorder::WriteTo(const char* directory) { 739 void TimelineEventRecorder::WriteTo(const char* directory) {
722 Dart_FileOpenCallback file_open = Isolate::file_open_callback(); 740 Dart_FileOpenCallback file_open = Isolate::file_open_callback();
723 Dart_FileWriteCallback file_write = Isolate::file_write_callback(); 741 Dart_FileWriteCallback file_write = Isolate::file_write_callback();
724 Dart_FileCloseCallback file_close = Isolate::file_close_callback(); 742 Dart_FileCloseCallback file_close = Isolate::file_close_callback();
725 if ((file_open == NULL) || (file_write == NULL) || (file_close == NULL)) { 743 if ((file_open == NULL) || (file_write == NULL) || (file_close == NULL)) {
726 return; 744 return;
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 1187
1170 1188
1171 TimelineEventBlock* TimelineEventBlockIterator::Next() { 1189 TimelineEventBlock* TimelineEventBlockIterator::Next() {
1172 ASSERT(current_ != NULL); 1190 ASSERT(current_ != NULL);
1173 TimelineEventBlock* r = current_; 1191 TimelineEventBlock* r = current_;
1174 current_ = current_->next(); 1192 current_ = current_->next();
1175 return r; 1193 return r;
1176 } 1194 }
1177 1195
1178 } // namespace dart 1196 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698