| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 | |
| 6 #include "vm/code_observers.h" | 5 #include "vm/code_observers.h" |
| 7 | 6 |
| 8 #include "vm/os.h" | 7 #include "vm/os.h" |
| 9 #include "vm/os_thread.h" | 8 #include "vm/os_thread.h" |
| 10 | 9 |
| 11 namespace dart { | 10 namespace dart { |
| 12 | 11 |
| 13 #ifndef PRODUCT | 12 #ifndef PRODUCT |
| 14 | 13 |
| 15 Mutex* CodeObservers::mutex_ = NULL; | 14 Mutex* CodeObservers::mutex_ = NULL; |
| 16 intptr_t CodeObservers::observers_length_ = 0; | 15 intptr_t CodeObservers::observers_length_ = 0; |
| 17 CodeObserver** CodeObservers::observers_ = NULL; | 16 CodeObserver** CodeObservers::observers_ = NULL; |
| 18 | 17 |
| 19 | |
| 20 void CodeObservers::Register(CodeObserver* observer) { | 18 void CodeObservers::Register(CodeObserver* observer) { |
| 21 observers_length_++; | 19 observers_length_++; |
| 22 observers_ = reinterpret_cast<CodeObserver**>( | 20 observers_ = reinterpret_cast<CodeObserver**>( |
| 23 realloc(observers_, sizeof(observer) * observers_length_)); | 21 realloc(observers_, sizeof(observer) * observers_length_)); |
| 24 if (observers_ == NULL) { | 22 if (observers_ == NULL) { |
| 25 FATAL("failed to grow code observers array"); | 23 FATAL("failed to grow code observers array"); |
| 26 } | 24 } |
| 27 observers_[observers_length_ - 1] = observer; | 25 observers_[observers_length_ - 1] = observer; |
| 28 } | 26 } |
| 29 | 27 |
| 30 | |
| 31 void CodeObservers::NotifyAll(const char* name, | 28 void CodeObservers::NotifyAll(const char* name, |
| 32 uword base, | 29 uword base, |
| 33 uword prologue_offset, | 30 uword prologue_offset, |
| 34 uword size, | 31 uword size, |
| 35 bool optimized) { | 32 bool optimized) { |
| 36 ASSERT(!AreActive() || (strlen(name) != 0)); | 33 ASSERT(!AreActive() || (strlen(name) != 0)); |
| 37 for (intptr_t i = 0; i < observers_length_; i++) { | 34 for (intptr_t i = 0; i < observers_length_; i++) { |
| 38 if (observers_[i]->IsActive()) { | 35 if (observers_[i]->IsActive()) { |
| 39 observers_[i]->Notify(name, base, prologue_offset, size, optimized); | 36 observers_[i]->Notify(name, base, prologue_offset, size, optimized); |
| 40 } | 37 } |
| 41 } | 38 } |
| 42 } | 39 } |
| 43 | 40 |
| 44 | |
| 45 bool CodeObservers::AreActive() { | 41 bool CodeObservers::AreActive() { |
| 46 for (intptr_t i = 0; i < observers_length_; i++) { | 42 for (intptr_t i = 0; i < observers_length_; i++) { |
| 47 if (observers_[i]->IsActive()) return true; | 43 if (observers_[i]->IsActive()) return true; |
| 48 } | 44 } |
| 49 return false; | 45 return false; |
| 50 } | 46 } |
| 51 | 47 |
| 52 | |
| 53 void CodeObservers::DeleteAll() { | 48 void CodeObservers::DeleteAll() { |
| 54 for (intptr_t i = 0; i < observers_length_; i++) { | 49 for (intptr_t i = 0; i < observers_length_; i++) { |
| 55 delete observers_[i]; | 50 delete observers_[i]; |
| 56 } | 51 } |
| 57 free(observers_); | 52 free(observers_); |
| 58 observers_length_ = 0; | 53 observers_length_ = 0; |
| 59 observers_ = NULL; | 54 observers_ = NULL; |
| 60 } | 55 } |
| 61 | 56 |
| 62 | |
| 63 void CodeObservers::InitOnce() { | 57 void CodeObservers::InitOnce() { |
| 64 ASSERT(mutex_ == NULL); | 58 ASSERT(mutex_ == NULL); |
| 65 mutex_ = new Mutex(); | 59 mutex_ = new Mutex(); |
| 66 ASSERT(mutex_ != NULL); | 60 ASSERT(mutex_ != NULL); |
| 67 OS::RegisterCodeObservers(); | 61 OS::RegisterCodeObservers(); |
| 68 } | 62 } |
| 69 | 63 |
| 70 | |
| 71 #endif // !PRODUCT | 64 #endif // !PRODUCT |
| 72 | 65 |
| 73 } // namespace dart | 66 } // namespace dart |
| OLD | NEW |