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

Side by Side Diff: runtime/bin/loader.cc

Issue 2186423002: Only reload libraries when they may have been modified. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Code review Created 4 years, 4 months 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
« no previous file with comments | « runtime/bin/loader.h ('k') | runtime/bin/main.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 5
6 #include "bin/loader.h" 6 #include "bin/loader.h"
7 7
8 #include "bin/builtin.h" 8 #include "bin/builtin.h"
9 #include "bin/dartutils.h" 9 #include "bin/dartutils.h"
10 #include "bin/extensions.h" 10 #include "bin/extensions.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 free(results_); 59 free(results_);
60 results_ = NULL; 60 results_ = NULL;
61 payload_ = NULL; 61 payload_ = NULL;
62 payload_length_ = 0; 62 payload_length_ = 0;
63 } 63 }
64 64
65 65
66 // Copy the contents of |message| into an |IOResult|. 66 // Copy the contents of |message| into an |IOResult|.
67 void Loader::IOResult::Setup(Dart_CObject* message) { 67 void Loader::IOResult::Setup(Dart_CObject* message) {
68 ASSERT(message->type == Dart_CObject_kArray); 68 ASSERT(message->type == Dart_CObject_kArray);
69 ASSERT(message->value.as_array.length == 4); 69 ASSERT(message->value.as_array.length == 5);
70 Dart_CObject* tag_message = message->value.as_array.values[0]; 70 Dart_CObject* tag_message = message->value.as_array.values[0];
71 ASSERT(tag_message != NULL); 71 ASSERT(tag_message != NULL);
72 Dart_CObject* uri_message = message->value.as_array.values[1]; 72 Dart_CObject* uri_message = message->value.as_array.values[1];
73 ASSERT(uri_message != NULL); 73 ASSERT(uri_message != NULL);
74 Dart_CObject* library_uri_message = message->value.as_array.values[2]; 74 Dart_CObject* resolved_uri_message = message->value.as_array.values[2];
75 ASSERT(resolved_uri_message != NULL);
76 Dart_CObject* library_uri_message = message->value.as_array.values[3];
75 ASSERT(library_uri_message != NULL); 77 ASSERT(library_uri_message != NULL);
76 Dart_CObject* payload_message = message->value.as_array.values[3]; 78 Dart_CObject* payload_message = message->value.as_array.values[4];
77 ASSERT(payload_message != NULL); 79 ASSERT(payload_message != NULL);
78 80
79 // Grab the tag. 81 // Grab the tag.
80 ASSERT(tag_message->type == Dart_CObject_kInt32); 82 ASSERT(tag_message->type == Dart_CObject_kInt32);
81 tag = tag_message->value.as_int32; 83 tag = tag_message->value.as_int32;
82 84
83 // Grab the uri id. 85 // Grab the uri id.
84 ASSERT(uri_message->type == Dart_CObject_kString); 86 ASSERT(uri_message->type == Dart_CObject_kString);
85 uri = strdup(uri_message->value.as_string); 87 uri = strdup(uri_message->value.as_string);
86 88
89 // Grab the resolved uri.
90 ASSERT(resolved_uri_message->type == Dart_CObject_kString);
91 resolved_uri = strdup(resolved_uri_message->value.as_string);
92
87 // Grab the library uri if one is present. 93 // Grab the library uri if one is present.
88 if (library_uri_message->type != Dart_CObject_kNull) { 94 if (library_uri_message->type != Dart_CObject_kNull) {
89 ASSERT(library_uri_message->type == Dart_CObject_kString); 95 ASSERT(library_uri_message->type == Dart_CObject_kString);
90 library_uri = strdup(library_uri_message->value.as_string); 96 library_uri = strdup(library_uri_message->value.as_string);
91 } else { 97 } else {
92 library_uri = NULL; 98 library_uri = NULL;
93 } 99 }
94 100
95 // Grab the payload. 101 // Grab the payload.
96 if (payload_message->type == Dart_CObject_kString) { 102 if (payload_message->type == Dart_CObject_kString) {
97 // Payload is an error message. 103 // Payload is an error message.
98 payload_length = strlen(payload_message->value.as_string); 104 payload_length = strlen(payload_message->value.as_string);
99 payload = 105 payload =
100 reinterpret_cast<uint8_t*>(strdup(payload_message->value.as_string)); 106 reinterpret_cast<uint8_t*>(strdup(payload_message->value.as_string));
101 } else { 107 } else {
102 // Payload is the contents of a file. 108 // Payload is the contents of a file.
103 ASSERT(payload_message->type == Dart_CObject_kTypedData); 109 ASSERT(payload_message->type == Dart_CObject_kTypedData);
104 ASSERT(payload_message->value.as_typed_data.type == Dart_TypedData_kUint8); 110 ASSERT(payload_message->value.as_typed_data.type == Dart_TypedData_kUint8);
105 payload_length = payload_message->value.as_typed_data.length; 111 payload_length = payload_message->value.as_typed_data.length;
106 payload = reinterpret_cast<uint8_t*>(malloc(payload_length)); 112 payload = reinterpret_cast<uint8_t*>(malloc(payload_length));
107 memmove(payload, 113 memmove(payload,
108 payload_message->value.as_typed_data.values, 114 payload_message->value.as_typed_data.values,
109 payload_length); 115 payload_length);
110 } 116 }
111 } 117 }
112 118
113 119
114 void Loader::IOResult::Cleanup() { 120 void Loader::IOResult::Cleanup() {
115 free(uri); 121 free(uri);
122 free(resolved_uri);
116 free(library_uri); 123 free(library_uri);
117 free(payload); 124 free(payload);
118 } 125 }
119 126
120 127
121 // Send the Loader Initialization message to the service isolate. This 128 // Send the Loader Initialization message to the service isolate. This
122 // message is sent the first time a loader is constructed for an isolate and 129 // message is sent the first time a loader is constructed for an isolate and
123 // seeds the service isolate with some initial state about this isolate. 130 // seeds the service isolate with some initial state about this isolate.
124 void Loader::Init(const char* package_root, 131 void Loader::Init(const char* package_root,
125 const char* packages_file, 132 const char* packages_file,
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 return false; 268 return false;
262 #endif // defined(TARGET_OS_WINDOWS) 269 #endif // defined(TARGET_OS_WINDOWS)
263 } 270 }
264 271
265 272
266 bool Loader::ProcessResultLocked(Loader* loader, Loader::IOResult* result) { 273 bool Loader::ProcessResultLocked(Loader* loader, Loader::IOResult* result) {
267 // We have to copy everything we care about out of |result| because after 274 // We have to copy everything we care about out of |result| because after
268 // dropping the lock below |result| may no longer valid. 275 // dropping the lock below |result| may no longer valid.
269 Dart_Handle uri = 276 Dart_Handle uri =
270 Dart_NewStringFromCString(reinterpret_cast<char*>(result->uri)); 277 Dart_NewStringFromCString(reinterpret_cast<char*>(result->uri));
278 Dart_Handle resolved_uri =
279 Dart_NewStringFromCString(reinterpret_cast<char*>(result->resolved_uri));
271 Dart_Handle library_uri = Dart_Null(); 280 Dart_Handle library_uri = Dart_Null();
272 if (result->library_uri != NULL) { 281 if (result->library_uri != NULL) {
273 library_uri = 282 library_uri =
274 Dart_NewStringFromCString(reinterpret_cast<char*>(result->library_uri)); 283 Dart_NewStringFromCString(reinterpret_cast<char*>(result->library_uri));
275 } 284 }
276 285
277 // A negative result tag indicates a loading error occurred in the service 286 // A negative result tag indicates a loading error occurred in the service
278 // isolate. The payload is a C string of the error message. 287 // isolate. The payload is a C string of the error message.
279 if (result->tag < 0) { 288 if (result->tag < 0) {
280 Dart_Handle library = Dart_LookupLibrary(uri); 289 Dart_Handle library = Dart_LookupLibrary(uri);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 result = NULL; 362 result = NULL;
354 363
355 // We must drop the lock here because the tag handler may be recursively 364 // We must drop the lock here because the tag handler may be recursively
356 // invoked and it will attempt to acquire the lock to queue more work. 365 // invoked and it will attempt to acquire the lock to queue more work.
357 loader->monitor_->Exit(); 366 loader->monitor_->Exit();
358 367
359 Dart_Handle dart_result = Dart_Null(); 368 Dart_Handle dart_result = Dart_Null();
360 369
361 switch (tag) { 370 switch (tag) {
362 case Dart_kImportTag: 371 case Dart_kImportTag:
363 dart_result = Dart_LoadLibrary(uri, source, 0, 0); 372 dart_result = Dart_LoadLibrary(uri, resolved_uri, source, 0, 0);
364 break; 373 break;
365 case Dart_kSourceTag: { 374 case Dart_kSourceTag: {
366 ASSERT(library_uri != Dart_Null()); 375 ASSERT(library_uri != Dart_Null());
367 Dart_Handle library = Dart_LookupLibrary(library_uri); 376 Dart_Handle library = Dart_LookupLibrary(library_uri);
368 ASSERT(!Dart_IsError(library)); 377 ASSERT(!Dart_IsError(library));
369 dart_result = Dart_LoadSource(library, uri, source, 0, 0); 378 dart_result = Dart_LoadSource(library, uri, resolved_uri, source, 0, 0);
370 } 379 }
371 break; 380 break;
372 case Dart_kScriptTag: 381 case Dart_kScriptTag:
373 if (is_snapshot) { 382 if (is_snapshot) {
374 dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length); 383 dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length);
375 } else { 384 } else {
376 dart_result = Dart_LoadScript(uri, source, 0, 0); 385 dart_result = Dart_LoadScript(uri, resolved_uri, source, 0, 0);
377 } 386 }
378 break; 387 break;
379 default: 388 default:
380 UNREACHABLE(); 389 UNREACHABLE();
381 } 390 }
382 391
383 // Re-acquire the lock before exiting the function (it was held before entry), 392 // Re-acquire the lock before exiting the function (it was held before entry),
384 loader->monitor_->Enter(); 393 loader->monitor_->Enter();
385 if (Dart_IsError(dart_result)) { 394 if (Dart_IsError(dart_result)) {
386 // Remember the error if we encountered one. 395 // Remember the error if we encountered one.
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 " on the stand-alone VM. Trying to load" 655 " on the stand-alone VM. Trying to load"
647 " '%s'.\n", library_url_string, url_string); 656 " '%s'.\n", library_url_string, url_string);
648 } 657 }
649 // Prepend the library URI to form a unique script URI for the part. 658 // Prepend the library URI to form a unique script URI for the part.
650 intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string); 659 intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
651 char* part_uri = reinterpret_cast<char*>(malloc(len + 1)); 660 char* part_uri = reinterpret_cast<char*>(malloc(len + 1));
652 snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string); 661 snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string);
653 Dart_Handle part_uri_obj = DartUtils::NewString(part_uri); 662 Dart_Handle part_uri_obj = DartUtils::NewString(part_uri);
654 free(part_uri); 663 free(part_uri);
655 return Dart_LoadSource(library, 664 return Dart_LoadSource(library,
656 part_uri_obj, 665 part_uri_obj, Dart_Null(),
657 Builtin::PartSource(id, url_string), 0, 0); 666 Builtin::PartSource(id, url_string), 0, 0);
658 } 667 }
659 // All cases should have been handled above. 668 // All cases should have been handled above.
660 UNREACHABLE(); 669 UNREACHABLE();
661 } 670 }
662 671
663 672
664 void Loader::InitOnce() { 673 void Loader::InitOnce() {
665 loader_infos_lock_ = new Mutex(); 674 loader_infos_lock_ = new Mutex();
666 } 675 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 MutexLocker ml(loader_infos_lock_); 757 MutexLocker ml(loader_infos_lock_);
749 Loader* loader = LoaderForLocked(dest_port_id); 758 Loader* loader = LoaderForLocked(dest_port_id);
750 if (loader == NULL) { 759 if (loader == NULL) {
751 return; 760 return;
752 } 761 }
753 loader->QueueMessage(message); 762 loader->QueueMessage(message);
754 } 763 }
755 764
756 } // namespace bin 765 } // namespace bin
757 } // namespace dart 766 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/bin/loader.h ('k') | runtime/bin/main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698