[PATCH] D157459: Make DWARFContext more thread safe.

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 07:15:12 PDT 2023


JDevlieghere added a comment.

In D157459#4612553 <https://reviews.llvm.org/D157459#4612553>, @clayborg wrote:

> Ok, I wanted to try and protect just the call to "const DWARFUnitIndex &DWARFContext::getCUIndex()" using examples people have mentioned and I came up with this solution to see if anyone likes it:
>
> In DWARFContext.h:
>
>   class DWARFContextStateImpl {
>   public:
>     virtual ~DWARFContextStateImpl() = default;
>     virtual const DWARFUnitIndex &getCUIndex(DWARFContext &D) = 0;
>   };
>   
>   class DWARFContextStateSingleThreaded : public DWARFContextStateImpl {
>     std::unique_ptr<DWARFUnitIndex> CUIndex;
>   public:
>     const DWARFUnitIndex &getCUIndex(DWARFContext &D) override;
>   };
>   
>   class DWARFContextStateMultiThreaded : public DWARFContextStateSingleThreaded {
>     std::recursive_mutex Mutex;
>   public:
>     const DWARFUnitIndex &getCUIndex(DWARFContext &D) override;
>   };
>   
>   // DWARFContext member variables
>   ...
>   // std::unique_ptr<DWARFUnitIndex> CUIndex; // This was the old ivar which is now contained in a subclass of DWARFContextStateImpl
>   std::unique_ptr<DWARFContextStateImpl> State;
>   ...
>
> Then to implement this we can do the following in the DWARContext.cpp file:
>
>   const DWARFUnitIndex &DWARFContext::getCUIndex() {
>     return State->getCUIndex(*this);
>   }
>   
>   const DWARFUnitIndex &
>   DWARFContext::DWARFContextStateSingleThreaded::getCUIndex(DWARFContext &D) {
>     if (CUIndex)
>       return *CUIndex;
>   
>     DataExtractor CUIndexData(D.DObj->getCUIndexSection(), D.isLittleEndian(), 0);
>     CUIndex = std::make_unique<DWARFUnitIndex>(DW_SECT_INFO);
>     bool IsParseSuccessful = CUIndex->parse(CUIndexData);
>     if (IsParseSuccessful)
>       fixupIndex(D, *CUIndex);
>     return *CUIndex;
>   }
>   
>   const DWARFUnitIndex &
>   DWARFContext::DWARFContextStateMultiThreaded::getCUIndex(DWARFContext &D) {
>     std::unique_lock LockGuard(Mutex);
>     return DWARFContextStateSingleThreaded::getCUIndex(D);
>   }
>
> Then if we enable threading with a bool in the constructor:
>
>   DWARFContext::DWARFContext(..., bool EnableMultiThreading) {
>     if (EnableMultiThreading)
>       State.reset(new DWARFContextStateMultiThreaded());
>     else
>       State.reset(new DWARFContextStateSingleThreaded());
>   }
>
> If we like this idea, I can add all member variables that we want the thread protect into DWARFContextStateSingleThreaded and implement the wrappers for each accessor. Does this kind of solution work for anyone?

I like this approach 👍


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D157459/new/

https://reviews.llvm.org/D157459



More information about the llvm-commits mailing list