On Thu, 5 Nov 2020 02:52:05 GMT, Hui Shi <h...@openjdk.org> wrote:

> …AccessorImpl object
> 
> We met real problem when using protobuf with option optimized for code size, 
> detail in JBS https://bugs.openjdk.java.net/browse/JDK-8255883
> 
> Optimize solution is adding a new boolean field to detect concurrent method 
> accessor generation in same NativeMethodAccessorImpl object, only one thread 
> is allowed to generate accessor, other threads still invoke in jni way until 
> parent's delegator is updated from NativeMethodAccessorImpl  to generated 
> accessor.
> 
> In common case, extra overhead is an atomic operation, compared with method 
> accessor generate, this cost is trivial.

I do wonder if it makes sense to handle triple-state `int` here: "not yet 
generated", "generated", "in error"? So that we don't try to generate the 
accessor over and over again when it is in error?

src/java.base/share/classes/jdk/internal/reflect/NativeMethodAccessorImpl.java 
line 80:

> 78:                 succ = true;
> 79:             } finally {
> 80:                 if (succ == false) {

Why `succ` variable, if you can just `catch (Throwable e)` and restore the 
`accessorGenerated`?

src/java.base/share/classes/jdk/internal/reflect/NativeMethodAccessorImpl.java 
line 66:

> 64:                 && !method.getDeclaringClass().isHidden()
> 65:                 && 
> !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())
> 66:                 && ACCESSOR_GENERATED.compareAndSet(this, false, true)) {

As the micro-optimization, checking that `accessor_generated` is `false` before 
attempting a (potentially contended) CAS might fit better. (See 
https://en.wikipedia.org/wiki/Test_and_test-and-set).

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

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

Reply via email to