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

Side by Side Diff: src/IceGlobalContext.h

Issue 2165493002: Subzero: Fixed deadlock with _start but no globals (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.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
OLDNEW
1 //===- subzero/src/IceGlobalContext.h - Global context defs -----*- C++ -*-===// 1 //===- subzero/src/IceGlobalContext.h - Global context defs -----*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 475
476 void setDisposeGlobalVariablesAfterLowering(bool Value) { 476 void setDisposeGlobalVariablesAfterLowering(bool Value) {
477 DisposeGlobalVariablesAfterLowering = Value; 477 DisposeGlobalVariablesAfterLowering = Value;
478 } 478 }
479 /// @} 479 /// @}
480 480
481 LockedPtr<StringPool> getStrings() const { 481 LockedPtr<StringPool> getStrings() const {
482 return LockedPtr<StringPool>(Strings.get(), &StringsLock); 482 return LockedPtr<StringPool>(Strings.get(), &StringsLock);
483 } 483 }
484 484
485 LockedPtr<VariableDeclarationList> getGlobals() {
486 return LockedPtr<VariableDeclarationList>(&Globals, &InitAllocLock);
487 }
488
489 bool getGlobalsReceived() { return GlobalsReceived; }
490
485 /// Number of function blocks that can be queued before waiting for 491 /// Number of function blocks that can be queued before waiting for
486 /// translation 492 /// translation
487 /// threads to consume. 493 /// threads to consume.
488 static constexpr size_t MaxOptQSize = 1 << 16; 494 static constexpr size_t MaxOptQSize = 1 << 16;
489 495
490 private: 496 private:
491 // Try to ensure mutexes are allocated on separate cache lines. 497 // Try to ensure mutexes are allocated on separate cache lines.
492 498
493 // Destructors collaborate with Allocator 499 // Destructors collaborate with Allocator
494 ICE_CACHELINE_BOUNDARY; 500 ICE_CACHELINE_BOUNDARY;
495 // Managed by getAllocator() 501 // Managed by getAllocator()
496 mutable GlobalLockType AllocLock; 502 mutable GlobalLockType AllocLock;
497 ArenaAllocator Allocator; 503 ArenaAllocator Allocator;
498 504
499 ICE_CACHELINE_BOUNDARY; 505 ICE_CACHELINE_BOUNDARY;
500 // Managed by getInitializerAllocator() 506 // Managed by getInitializerAllocator()
501 mutable GlobalLockType InitAllocLock; 507 mutable GlobalLockType InitAllocLock;
502 VariableDeclarationList Globals; 508 VariableDeclarationList Globals;
509 std::atomic<bool> GlobalsReceived;
503 510
504 ICE_CACHELINE_BOUNDARY; 511 ICE_CACHELINE_BOUNDARY;
505 // Managed by getDestructors() 512 // Managed by getDestructors()
506 using DestructorArray = std::vector<std::function<void()>>; 513 using DestructorArray = std::vector<std::function<void()>>;
507 mutable GlobalLockType DestructorsLock; 514 mutable GlobalLockType DestructorsLock;
508 DestructorArray Destructors; 515 DestructorArray Destructors;
509 516
510 ICE_CACHELINE_BOUNDARY; 517 ICE_CACHELINE_BOUNDARY;
511 // Managed by getStrings() 518 // Managed by getStrings()
512 mutable GlobalLockType StringsLock; 519 mutable GlobalLockType StringsLock;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 return LockedPtr<TimerList>(&Timers, &TimerLock); 612 return LockedPtr<TimerList>(&Timers, &TimerLock);
606 } 613 }
607 LockedPtr<DestructorArray> getDestructors() { 614 LockedPtr<DestructorArray> getDestructors() {
608 return LockedPtr<DestructorArray>(&Destructors, &DestructorsLock); 615 return LockedPtr<DestructorArray>(&Destructors, &DestructorsLock);
609 } 616 }
610 617
611 void accumulateGlobals(std::unique_ptr<VariableDeclarationList> Globls) { 618 void accumulateGlobals(std::unique_ptr<VariableDeclarationList> Globls) {
612 LockedPtr<VariableDeclarationList> _(&Globals, &InitAllocLock); 619 LockedPtr<VariableDeclarationList> _(&Globals, &InitAllocLock);
613 if (Globls != nullptr) { 620 if (Globls != nullptr) {
614 Globals.merge(Globls.get()); 621 Globals.merge(Globls.get());
622 GlobalsReceived = true;
615 } 623 }
616 } 624 }
617 625
618 void lowerGlobalsIfNoCodeHasBeenSeen() { 626 void lowerGlobalsIfNoCodeHasBeenSeen() {
619 if (HasSeenCode) 627 if (HasSeenCode)
620 return; 628 return;
621 constexpr char NoSuffix[] = ""; 629 constexpr char NoSuffix[] = "";
622 lowerGlobals(NoSuffix); 630 lowerGlobals(NoSuffix);
623 HasSeenCode = true; 631 HasSeenCode = true;
624 } 632 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 explicit OstreamLocker(GlobalContext *Ctx) : Ctx(Ctx) { Ctx->lockStr(); } 700 explicit OstreamLocker(GlobalContext *Ctx) : Ctx(Ctx) { Ctx->lockStr(); }
693 ~OstreamLocker() { Ctx->unlockStr(); } 701 ~OstreamLocker() { Ctx->unlockStr(); }
694 702
695 private: 703 private:
696 GlobalContext *const Ctx; 704 GlobalContext *const Ctx;
697 }; 705 };
698 706
699 } // end of namespace Ice 707 } // end of namespace Ice
700 708
701 #endif // SUBZERO_SRC_ICEGLOBALCONTEXT_H 709 #endif // SUBZERO_SRC_ICEGLOBALCONTEXT_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698