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 #ifndef VM_DART_API_STATE_H_ | 5 #ifndef VM_DART_API_STATE_H_ |
6 #define VM_DART_API_STATE_H_ | 6 #define VM_DART_API_STATE_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 | 9 |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 DECLARE_DEBUG_FLAG(bool, trace_handles); | 28 DECLARE_DEBUG_FLAG(bool, trace_handles); |
29 | 29 |
30 // Implementation of Zone support for very fast allocation of small chunks | 30 // Implementation of Zone support for very fast allocation of small chunks |
31 // of memory. The chunks cannot be deallocated individually, but instead | 31 // of memory. The chunks cannot be deallocated individually, but instead |
32 // zones support deallocating all chunks in one fast operation when the | 32 // zones support deallocating all chunks in one fast operation when the |
33 // scope is exited. | 33 // scope is exited. |
34 class ApiZone { | 34 class ApiZone { |
35 public: | 35 public: |
36 // Create an empty zone. | 36 // Create an empty zone. |
37 ApiZone() : zone_() { | 37 ApiZone() : zone_() { |
38 Isolate* isolate = Isolate::Current(); | 38 Thread* thread = Thread::Current(); |
39 Zone* current_zone = isolate != NULL ? isolate->current_zone() : NULL; | 39 Zone* zone = thread != NULL ? thread->zone() : NULL; |
40 zone_.Link(current_zone); | 40 zone_.Link(zone); |
41 if (isolate != NULL) { | 41 if (thread != NULL) { |
42 isolate->set_current_zone(&zone_); | 42 thread->set_zone(&zone_); |
43 } | 43 } |
44 #ifdef DEBUG | 44 #ifdef DEBUG |
45 if (FLAG_trace_zones) { | 45 if (FLAG_trace_zones) { |
46 OS::PrintErr("*** Starting a new Api zone 0x%" Px "(0x%" Px ")\n", | 46 OS::PrintErr("*** Starting a new Api zone 0x%" Px "(0x%" Px ")\n", |
47 reinterpret_cast<intptr_t>(this), | 47 reinterpret_cast<intptr_t>(this), |
48 reinterpret_cast<intptr_t>(&zone_)); | 48 reinterpret_cast<intptr_t>(&zone_)); |
49 } | 49 } |
50 #endif | 50 #endif |
51 } | 51 } |
52 | 52 |
53 // Delete all memory associated with the zone. | 53 // Delete all memory associated with the zone. |
54 ~ApiZone() { | 54 ~ApiZone() { |
55 Isolate* isolate = Isolate::Current(); | 55 Thread* thread = Thread::Current(); |
56 #if defined(DEBUG) | 56 #if defined(DEBUG) |
57 if (isolate == NULL) { | 57 if (thread == NULL) { |
58 ASSERT(zone_.handles()->CountScopedHandles() == 0); | 58 ASSERT(zone_.handles()->CountScopedHandles() == 0); |
59 ASSERT(zone_.handles()->CountZoneHandles() == 0); | 59 ASSERT(zone_.handles()->CountZoneHandles() == 0); |
60 } | 60 } |
61 #endif | 61 #endif |
62 if ((isolate != NULL) && (isolate->current_zone() == &zone_)) { | 62 if ((thread != NULL) && (thread->zone() == &zone_)) { |
63 isolate->set_current_zone(zone_.previous_); | 63 thread->set_zone(zone_.previous_); |
64 } | 64 } |
65 #ifdef DEBUG | 65 #ifdef DEBUG |
66 if (FLAG_trace_zones) { | 66 if (FLAG_trace_zones) { |
67 OS::PrintErr("*** Deleting Api zone 0x%" Px "(0x%" Px ")\n", | 67 OS::PrintErr("*** Deleting Api zone 0x%" Px "(0x%" Px ")\n", |
68 reinterpret_cast<intptr_t>(this), | 68 reinterpret_cast<intptr_t>(this), |
69 reinterpret_cast<intptr_t>(&zone_)); | 69 reinterpret_cast<intptr_t>(&zone_)); |
70 } | 70 } |
71 #endif | 71 #endif |
72 } | 72 } |
73 | 73 |
(...skipping 20 matching lines...) Expand all Loading... |
94 // check for integer overflow. If you use AllocUnsafe, you are | 94 // check for integer overflow. If you use AllocUnsafe, you are |
95 // responsible for avoiding integer overflow yourself. | 95 // responsible for avoiding integer overflow yourself. |
96 uword AllocUnsafe(intptr_t size) { return zone_.AllocUnsafe(size); } | 96 uword AllocUnsafe(intptr_t size) { return zone_.AllocUnsafe(size); } |
97 | 97 |
98 // Compute the total size of this zone. This includes wasted space that is | 98 // Compute the total size of this zone. This includes wasted space that is |
99 // due to internal fragmentation in the segments. | 99 // due to internal fragmentation in the segments. |
100 intptr_t SizeInBytes() const { return zone_.SizeInBytes(); } | 100 intptr_t SizeInBytes() const { return zone_.SizeInBytes(); } |
101 | 101 |
102 Zone* GetZone() { return &zone_; } | 102 Zone* GetZone() { return &zone_; } |
103 | 103 |
104 void Reinit(Isolate* isolate) { | 104 void Reinit(Thread* thread) { |
105 if (isolate == NULL) { | 105 if (thread == NULL) { |
106 zone_.Link(NULL); | 106 zone_.Link(NULL); |
107 } else { | 107 } else { |
108 zone_.Link(isolate->current_zone()); | 108 zone_.Link(thread->zone()); |
109 isolate->set_current_zone(&zone_); | 109 thread->set_zone(&zone_); |
110 } | 110 } |
111 } | 111 } |
112 | 112 |
113 void Reset(Isolate* isolate) { | 113 void Reset(Thread* thread) { |
114 if ((isolate != NULL) && (isolate->current_zone() == &zone_)) { | 114 if ((thread != NULL) && (thread->zone() == &zone_)) { |
115 isolate->set_current_zone(zone_.previous_); | 115 thread->set_zone(zone_.previous_); |
116 } | 116 } |
117 zone_.DeleteAll(); | 117 zone_.DeleteAll(); |
118 } | 118 } |
119 | 119 |
120 private: | 120 private: |
121 Zone zone_; | 121 Zone zone_; |
122 | 122 |
123 template<typename T> friend class ApiGrowableArray; | 123 template<typename T> friend class ApiGrowableArray; |
124 DISALLOW_COPY_AND_ASSIGN(ApiZone); | 124 DISALLOW_COPY_AND_ASSIGN(ApiZone); |
125 }; | 125 }; |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 // These local scopes manage handles and memory allocated in the scope. | 585 // These local scopes manage handles and memory allocated in the scope. |
586 class ApiLocalScope { | 586 class ApiLocalScope { |
587 public: | 587 public: |
588 ApiLocalScope(ApiLocalScope* previous, uword stack_marker) : | 588 ApiLocalScope(ApiLocalScope* previous, uword stack_marker) : |
589 previous_(previous), stack_marker_(stack_marker) { } | 589 previous_(previous), stack_marker_(stack_marker) { } |
590 ~ApiLocalScope() { | 590 ~ApiLocalScope() { |
591 previous_ = NULL; | 591 previous_ = NULL; |
592 } | 592 } |
593 | 593 |
594 // Reinit the ApiLocalScope to new values. | 594 // Reinit the ApiLocalScope to new values. |
595 void Reinit(Isolate* isolate, ApiLocalScope* previous, uword stack_marker) { | 595 void Reinit(Thread* thread, ApiLocalScope* previous, uword stack_marker) { |
596 previous_ = previous; | 596 previous_ = previous; |
597 stack_marker_ = stack_marker; | 597 stack_marker_ = stack_marker; |
598 zone_.Reinit(isolate); | 598 zone_.Reinit(thread); |
599 } | 599 } |
600 | 600 |
601 // Reset the ApiLocalScope so that it can be reused again. | 601 // Reset the ApiLocalScope so that it can be reused again. |
602 void Reset(Isolate* isolate) { | 602 void Reset(Thread* thread) { |
603 local_handles_.Reset(); | 603 local_handles_.Reset(); |
604 zone_.Reset(isolate); | 604 zone_.Reset(thread); |
605 previous_ = NULL; | 605 previous_ = NULL; |
606 stack_marker_ = 0; | 606 stack_marker_ = 0; |
607 } | 607 } |
608 | 608 |
609 // Accessors. | 609 // Accessors. |
610 ApiLocalScope* previous() const { return previous_; } | 610 ApiLocalScope* previous() const { return previous_; } |
611 uword stack_marker() const { return stack_marker_; } | 611 uword stack_marker() const { return stack_marker_; } |
612 void set_previous(ApiLocalScope* value) { previous_ = value; } | 612 void set_previous(ApiLocalScope* value) { previous_ = value; } |
613 LocalHandles* local_handles() { return &local_handles_; } | 613 LocalHandles* local_handles() { return &local_handles_; } |
614 Zone* zone() { return zone_.GetZone(); } | 614 Zone* zone() { return zone_.GetZone(); } |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 ref->set_peer(peer); | 991 ref->set_peer(peer); |
992 ref->set_callback(callback); | 992 ref->set_callback(callback); |
993 // This may trigger GC, so it must be called last. | 993 // This may trigger GC, so it must be called last. |
994 ref->SetExternalSize(external_size, isolate); | 994 ref->SetExternalSize(external_size, isolate); |
995 return ref; | 995 return ref; |
996 } | 996 } |
997 | 997 |
998 } // namespace dart | 998 } // namespace dart |
999 | 999 |
1000 #endif // VM_DART_API_STATE_H_ | 1000 #endif // VM_DART_API_STATE_H_ |
OLD | NEW |