On Wed, 9 Mar 2022 19:03:16 GMT, Anton Kozlov <akoz...@openjdk.org> wrote:

>> Johannes Bechberger has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   current_thread_wx -> ThreadWX
>
> https://github.com/openjdk/jdk/compare/master...478ec1a7ca2c72e5916b28613a4875aa2ee1a793
>  touches more places than a targeted change in ThreadWXEnable... I'm not sure 
> the real nesting is required for a thread that is not registered properly 
> with VM. The initial state is always assumed for the NULL Thread. The 
> SafeFetch assembly does not do up-calls to VM. I don't see why we'd need 
> runtime tracking of WX state. The state is either WXExec for SafeFetch 
> assembly, or unknown -- which we assume to be WXWrite regardless of approach 
> taken.
> 
> Nesting was implemented to reduce the amount of changes in JVM (yes, WX code 
> scattered around the VM less than it could be :)), but it is possible to 
> avoid runtime WX tracking if you always know the state, like we do if Thread 
> == NULL.

Hi @AntonKozlov,

> [master...478ec1a](https://github.com/openjdk/jdk/compare/master...478ec1a7ca2c72e5916b28613a4875aa2ee1a793)
>  touches more places than a targeted change in ThreadWXEnable... I'm not sure 
> the real nesting is required for a thread that is not registered properly 
> with VM.

Arguably we should restore, upon leaving the VM, the state that has been 
present before. Because a native thread may already have modified the wx state 
and overruling it is just rude. But I offhand don't see a way to do this since 
we have no way (?) to query the current state.



> The change proposes to assume WXWrite as the initial state. Have you 
> considered to extend ThreadWXEnable to fix the assert failure? Something like 
> below (I have not tried to compile though). The refactoring looks OK, but it 
> makes sense to separate it from functional change.
> 
> ```
> class ThreadWXEnable  {
>   Thread* _thread;
>   WXMode _old_mode;
> 
> public:
>   ThreadWXEnable(WXMode new_mode, Thread* thread) :
>     _thread(thread)
>   {
>     if (_thread) {
>       _old_mode = _thread->enable_wx(new_mode);
>     } else {
>       os::current_thread_enable_wx(new_mode);
>       _old_mode = WXWrite;
>     }
>   }
>   ~ThreadWXEnable() {
>     if (_thread) {
>       _thread->enable_wx(_old_mode);
>     } else {
>       os::current_thread_enable_wx(_old_mode);
>     }
>   }
> };
> ```

I honestly don't find this easier than the solution @parttimenerd proposes, 
using a OS thread local. Using an OS thread local makes this whole system 
independent from Thread, so you don't need to know about Thread and don't rely 
on Thread::current being present.

It also would be slightly faster. Using Thread, we'd access TLS to get 
Thread::current, then dereference that to read the wx state . OTOH using OS 
TLS, we access TLS to get the wx state directly. We save one dereference.

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

PR: https://git.openjdk.java.net/jdk/pull/7727

Reply via email to