OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 "vm/isolate.h" | 5 #include "vm/isolate.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/text_buffer.h" | 10 #include "platform/text_buffer.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 93 |
94 void VisitIsolate(Isolate* isolate) { ASSERT(isolate->origin_id() != id_); } | 94 void VisitIsolate(Isolate* isolate) { ASSERT(isolate->origin_id() != id_); } |
95 | 95 |
96 private: | 96 private: |
97 Dart_Port id_; | 97 Dart_Port id_; |
98 DISALLOW_COPY_AND_ASSIGN(VerifyOriginId); | 98 DISALLOW_COPY_AND_ASSIGN(VerifyOriginId); |
99 }; | 99 }; |
100 #endif | 100 #endif |
101 | 101 |
102 | 102 |
103 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 103 static uint8_t* malloc_allocator(uint8_t* ptr, |
| 104 intptr_t old_size, |
| 105 intptr_t new_size) { |
104 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | 106 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
105 return reinterpret_cast<uint8_t*>(new_ptr); | 107 return reinterpret_cast<uint8_t*>(new_ptr); |
106 } | 108 } |
107 | 109 |
| 110 static void malloc_deallocator(uint8_t* ptr) { |
| 111 free(reinterpret_cast<void*>(ptr)); |
| 112 } |
| 113 |
108 | 114 |
109 static void SerializeObject(const Instance& obj, | 115 static void SerializeObject(const Instance& obj, |
110 uint8_t** obj_data, | 116 uint8_t** obj_data, |
111 intptr_t* obj_len, | 117 intptr_t* obj_len, |
112 bool allow_any_object) { | 118 bool allow_any_object) { |
113 MessageWriter writer(obj_data, &allocator, allow_any_object); | 119 MessageWriter writer(obj_data, &malloc_allocator, &malloc_deallocator, |
| 120 allow_any_object); |
114 writer.WriteMessage(obj); | 121 writer.WriteMessage(obj); |
115 *obj_len = writer.BytesWritten(); | 122 *obj_len = writer.BytesWritten(); |
116 } | 123 } |
117 | 124 |
118 // TODO(zra): Allocation of Message objects should be centralized. | 125 // TODO(zra): Allocation of Message objects should be centralized. |
119 static Message* SerializeMessage(Dart_Port dest_port, const Instance& obj) { | 126 static Message* SerializeMessage(Dart_Port dest_port, const Instance& obj) { |
120 if (ApiObjectConverter::CanConvert(obj.raw())) { | 127 if (ApiObjectConverter::CanConvert(obj.raw())) { |
121 return new Message(dest_port, obj.raw(), Message::kNormalPriority); | 128 return new Message(dest_port, obj.raw(), Message::kNormalPriority); |
122 } else { | 129 } else { |
123 uint8_t* obj_data; | 130 uint8_t* obj_data; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 Object& element = Object::Handle(); | 193 Object& element = Object::Handle(); |
187 | 194 |
188 element = Smi::New(Message::kIsolateLibOOBMsg); | 195 element = Smi::New(Message::kIsolateLibOOBMsg); |
189 msg.SetAt(0, element); | 196 msg.SetAt(0, element); |
190 element = Smi::New(msg_id); | 197 element = Smi::New(msg_id); |
191 msg.SetAt(1, element); | 198 msg.SetAt(1, element); |
192 element = Capability::New(capability); | 199 element = Capability::New(capability); |
193 msg.SetAt(2, element); | 200 msg.SetAt(2, element); |
194 | 201 |
195 uint8_t* data = NULL; | 202 uint8_t* data = NULL; |
196 MessageWriter writer(&data, &allocator, false); | 203 MessageWriter writer(&data, &malloc_allocator, &malloc_deallocator, false); |
197 writer.WriteMessage(msg); | 204 writer.WriteMessage(msg); |
198 | 205 |
199 PortMap::PostMessage(new Message(main_port(), data, writer.BytesWritten(), | 206 PortMap::PostMessage(new Message(main_port(), data, writer.BytesWritten(), |
200 Message::kOOBPriority)); | 207 Message::kOOBPriority)); |
201 } | 208 } |
202 | 209 |
203 | 210 |
204 class IsolateMessageHandler : public MessageHandler { | 211 class IsolateMessageHandler : public MessageHandler { |
205 public: | 212 public: |
206 explicit IsolateMessageHandler(Isolate* isolate); | 213 explicit IsolateMessageHandler(Isolate* isolate); |
(...skipping 2342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2549 cap.value.as_capability.id = terminate_capability(); | 2556 cap.value.as_capability.id = terminate_capability(); |
2550 list_values[2] = ∩ | 2557 list_values[2] = ∩ |
2551 | 2558 |
2552 Dart_CObject imm; | 2559 Dart_CObject imm; |
2553 imm.type = Dart_CObject_kInt32; | 2560 imm.type = Dart_CObject_kInt32; |
2554 imm.value.as_int32 = Isolate::kImmediateAction; | 2561 imm.value.as_int32 = Isolate::kImmediateAction; |
2555 list_values[3] = &imm; | 2562 list_values[3] = &imm; |
2556 | 2563 |
2557 { | 2564 { |
2558 uint8_t* buffer = NULL; | 2565 uint8_t* buffer = NULL; |
2559 ApiMessageWriter writer(&buffer, allocator); | 2566 ApiMessageWriter writer(&buffer, &malloc_allocator); |
2560 bool success = writer.WriteCMessage(&kill_msg); | 2567 bool success = writer.WriteCMessage(&kill_msg); |
2561 ASSERT(success); | 2568 ASSERT(success); |
2562 | 2569 |
2563 // Post the message at the given port. | 2570 // Post the message at the given port. |
2564 success = PortMap::PostMessage(new Message( | 2571 success = PortMap::PostMessage(new Message( |
2565 main_port(), buffer, writer.BytesWritten(), Message::kOOBPriority)); | 2572 main_port(), buffer, writer.BytesWritten(), Message::kOOBPriority)); |
2566 ASSERT(success); | 2573 ASSERT(success); |
2567 } | 2574 } |
2568 } | 2575 } |
2569 | 2576 |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2967 void IsolateSpawnState::DecrementSpawnCount() { | 2974 void IsolateSpawnState::DecrementSpawnCount() { |
2968 ASSERT(spawn_count_monitor_ != NULL); | 2975 ASSERT(spawn_count_monitor_ != NULL); |
2969 ASSERT(spawn_count_ != NULL); | 2976 ASSERT(spawn_count_ != NULL); |
2970 MonitorLocker ml(spawn_count_monitor_); | 2977 MonitorLocker ml(spawn_count_monitor_); |
2971 ASSERT(*spawn_count_ > 0); | 2978 ASSERT(*spawn_count_ > 0); |
2972 *spawn_count_ = *spawn_count_ - 1; | 2979 *spawn_count_ = *spawn_count_ - 1; |
2973 ml.Notify(); | 2980 ml.Notify(); |
2974 } | 2981 } |
2975 | 2982 |
2976 } // namespace dart | 2983 } // namespace dart |
OLD | NEW |