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 |