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

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

Issue 2147833002: Make loader lock new-allocated to avoid shutdown crash. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 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 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 free(part_uri); 601 free(part_uri);
602 return Dart_LoadSource(library, 602 return Dart_LoadSource(library,
603 part_uri_obj, 603 part_uri_obj,
604 Builtin::PartSource(id, url_string), 0, 0); 604 Builtin::PartSource(id, url_string), 0, 0);
605 } 605 }
606 // All cases should have been handled above. 606 // All cases should have been handled above.
607 UNREACHABLE(); 607 UNREACHABLE();
608 } 608 }
609 609
610 610
611 Mutex Loader::loader_infos_lock_; 611 void Loader::InitOnce() {
612 loader_infos_lock_ = new Mutex();
zra 2016/07/13 14:51:38 Can this be deleted in a Loader::Shutdown() call s
Florian Schneider 2016/07/13 16:13:58 It could be. But since it is in the embedder, and
zra 2016/07/13 16:16:06 sgtm. Didn't notice this was in bin/
613 }
614
615
616 Mutex* Loader::loader_infos_lock_;
612 Loader::LoaderInfo* Loader::loader_infos_ = NULL; 617 Loader::LoaderInfo* Loader::loader_infos_ = NULL;
613 intptr_t Loader::loader_infos_length_ = 0; 618 intptr_t Loader::loader_infos_length_ = 0;
614 intptr_t Loader::loader_infos_capacity_ = 0; 619 intptr_t Loader::loader_infos_capacity_ = 0;
615 620
616 621
617 // Add a mapping from |port| to |isolate_data| (really the loader). When a 622 // Add a mapping from |port| to |isolate_data| (really the loader). When a
618 // native message arrives, we use this map to report the I/O result to the 623 // native message arrives, we use this map to report the I/O result to the
619 // correct loader. 624 // correct loader.
620 // This happens whenever an isolate begins loading. 625 // This happens whenever an isolate begins loading.
621 void Loader::AddLoader(Dart_Port port, IsolateData* isolate_data) { 626 void Loader::AddLoader(Dart_Port port, IsolateData* isolate_data) {
622 MutexLocker ml(&loader_infos_lock_); 627 MutexLocker ml(loader_infos_lock_);
623 ASSERT(LoaderForLocked(port) == NULL); 628 ASSERT(LoaderForLocked(port) == NULL);
624 if (loader_infos_length_ == loader_infos_capacity_) { 629 if (loader_infos_length_ == loader_infos_capacity_) {
625 // Grow to an initial capacity or double in size. 630 // Grow to an initial capacity or double in size.
626 loader_infos_capacity_ = 631 loader_infos_capacity_ =
627 (loader_infos_capacity_ == 0) ? 4 : loader_infos_capacity_ * 2; 632 (loader_infos_capacity_ == 0) ? 4 : loader_infos_capacity_ * 2;
628 loader_infos_ = 633 loader_infos_ =
629 reinterpret_cast<Loader::LoaderInfo*>( 634 reinterpret_cast<Loader::LoaderInfo*>(
630 realloc(loader_infos_, 635 realloc(loader_infos_,
631 sizeof(Loader::LoaderInfo) * loader_infos_capacity_)); 636 sizeof(Loader::LoaderInfo) * loader_infos_capacity_));
632 ASSERT(loader_infos_ != NULL); 637 ASSERT(loader_infos_ != NULL);
633 // Initialize new entries. 638 // Initialize new entries.
634 for (intptr_t i = loader_infos_length_; i < loader_infos_capacity_; i++) { 639 for (intptr_t i = loader_infos_length_; i < loader_infos_capacity_; i++) {
635 loader_infos_[i].port = ILLEGAL_PORT; 640 loader_infos_[i].port = ILLEGAL_PORT;
636 loader_infos_[i].isolate_data = NULL; 641 loader_infos_[i].isolate_data = NULL;
637 } 642 }
638 } 643 }
639 ASSERT(loader_infos_length_ < loader_infos_capacity_); 644 ASSERT(loader_infos_length_ < loader_infos_capacity_);
640 loader_infos_[loader_infos_length_].port = port; 645 loader_infos_[loader_infos_length_].port = port;
641 loader_infos_[loader_infos_length_].isolate_data = isolate_data; 646 loader_infos_[loader_infos_length_].isolate_data = isolate_data;
642 loader_infos_length_++; 647 loader_infos_length_++;
643 ASSERT(LoaderForLocked(port) != NULL); 648 ASSERT(LoaderForLocked(port) != NULL);
644 } 649 }
645 650
646 651
647 // Remove |port| from the map. 652 // Remove |port| from the map.
648 // This happens once an isolate has finished loading. 653 // This happens once an isolate has finished loading.
649 void Loader::RemoveLoader(Dart_Port port) { 654 void Loader::RemoveLoader(Dart_Port port) {
650 MutexLocker ml(&loader_infos_lock_); 655 MutexLocker ml(loader_infos_lock_);
651 const intptr_t index = LoaderIndexFor(port); 656 const intptr_t index = LoaderIndexFor(port);
652 ASSERT(index >= 0); 657 ASSERT(index >= 0);
653 const intptr_t last = loader_infos_length_ - 1; 658 const intptr_t last = loader_infos_length_ - 1;
654 ASSERT(last >= 0); 659 ASSERT(last >= 0);
655 if (index != last) { 660 if (index != last) {
656 // Swap with the tail. 661 // Swap with the tail.
657 loader_infos_[index] = loader_infos_[last]; 662 loader_infos_[index] = loader_infos_[last];
658 } 663 }
659 loader_infos_length_--; 664 loader_infos_length_--;
660 } 665 }
(...skipping 12 matching lines...) Expand all
673 Loader* Loader::LoaderForLocked(Dart_Port port) { 678 Loader* Loader::LoaderForLocked(Dart_Port port) {
674 intptr_t index = LoaderIndexFor(port); 679 intptr_t index = LoaderIndexFor(port);
675 if (index < 0) { 680 if (index < 0) {
676 return NULL; 681 return NULL;
677 } 682 }
678 return loader_infos_[index].isolate_data->loader(); 683 return loader_infos_[index].isolate_data->loader();
679 } 684 }
680 685
681 686
682 Loader* Loader::LoaderFor(Dart_Port port) { 687 Loader* Loader::LoaderFor(Dart_Port port) {
683 MutexLocker ml(&loader_infos_lock_); 688 MutexLocker ml(loader_infos_lock_);
684 return LoaderForLocked(port); 689 return LoaderForLocked(port);
685 } 690 }
686 691
687 692
688 void Loader::NativeMessageHandler(Dart_Port dest_port_id, 693 void Loader::NativeMessageHandler(Dart_Port dest_port_id,
689 Dart_CObject* message) { 694 Dart_CObject* message) {
690 MutexLocker ml(&loader_infos_lock_); 695 MutexLocker ml(loader_infos_lock_);
691 Loader* loader = LoaderForLocked(dest_port_id); 696 Loader* loader = LoaderForLocked(dest_port_id);
692 if (loader == NULL) { 697 if (loader == NULL) {
693 return; 698 return;
694 } 699 }
695 loader->QueueMessage(message); 700 loader->QueueMessage(message);
696 } 701 }
697 702
698 } // namespace bin 703 } // namespace bin
699 } // namespace dart 704 } // 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