RFR: 8354954: Typed static memory for late initialization of static class members in Hotspot [v4]

Quan Anh Mai qamai at openjdk.org
Sun Apr 20 11:44:43 UTC 2025


On Sun, 20 Apr 2025 07:42:22 GMT, Kim Barrett <kbarrett at openjdk.org> wrote:

>> Johan Sjölen has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Move semantics would be nice.
>
> src/hotspot/share/utilities/stableValue.hpp line 44:
> 
>> 42:   union {
>> 43:     T _t;
>> 44:   };
> 
> All of this stuff about laundering and this union trick could go away if we're willing to add a pointer
> to the StableValue class.  Something like this (not tested):
> 
> template<typename T>
> class StableValue {
>   alignas(T) char _data[sizeof(T)];
>   T* _p;
> public:
>   StableValue() : _p(nullptr) {}
>   ~StableValue() = default;
>   NONCOPYABLE(StableValue);
>   T* ptr() {
>     assert(_p != nullptr, "uninitialized");
>     return _p;
>   }
>   T* operator->() { return ptr(); }
>   T& operator*() { return *ptr(); }
>   template<typename... Args>
>   void initialize(Args&&... args) {
>     assert(_p == nullptr, "already initialized");
>     _p = ::new (_data) T(std::forward<Args>(args)...);
>   }
> };
> 
> Regarding the destructor, quoting from the style guide: "HotSpot doesn't generally try to cleanup
> on exit, and running destructors at exit can also lead to problems."

This would induce an additional indirection on every access, though.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/24689#discussion_r2051703447


More information about the hotspot-dev mailing list