RFR: 8255883: Avoid multiple GeneratedMethodAccessor for same NativeMethod… [v2]
Aleksey Shipilev
shade at openjdk.java.net
Tue Nov 10 18:39:00 UTC 2020
On Sun, 8 Nov 2020 05:07:07 GMT, Hui Shi <hshi at 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.
>
> Hui Shi has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR. The pull request contains one new commit since the last revision:
>
> 8255883: Avoid multiple GeneratedAccessor for same NativeMethod/ConstructorAccessorImpl object
Minor nits here.
src/java.base/share/classes/jdk/internal/reflect/NativeConstructorAccessorImpl.java line 37:
> 35:
> 36: class NativeConstructorAccessorImpl extends ConstructorAccessorImpl {
> 37: private static final Unsafe unsafe = Unsafe.getUnsafe();
`static final` field identifiers should be capitalized. Suggestion: `private static final Unsafe U = Unsafe.getUnsafe()`.
src/java.base/share/classes/jdk/internal/reflect/NativeConstructorAccessorImpl.java line 38:
> 36: class NativeConstructorAccessorImpl extends ConstructorAccessorImpl {
> 37: private static final Unsafe unsafe = Unsafe.getUnsafe();
> 38: private static final long accessorGeneratedaOffset
Typo "Generated*a*Offset". But also this is `static final`, so it should be e.g. `GENERATED_OFFSET`. The field can be just `generated` to match the name of this offset.
src/java.base/share/classes/jdk/internal/reflect/NativeConstructorAccessorImpl.java line 61:
> 59: && !c.getDeclaringClass().isHidden()
> 60: && !ReflectUtil.isVMAnonymousClass(c.getDeclaringClass())
> 61: && accessorGenerated == false
Should be `!accessorGenerated`.
src/java.base/share/classes/jdk/internal/reflect/NativeConstructorAccessorImpl.java line 62:
> 60: && !ReflectUtil.isVMAnonymousClass(c.getDeclaringClass())
> 61: && accessorGenerated == false
> 62: && unsafe.compareAndSetBoolean(this, accessorGeneratedaOffset, false, true)) {
`compareAndSetBoolean` gets us into the awkward territory of sub-word CASes. (Click through to `Unsafe.compareAndExchangeByte` to see what I am talking about). It is probably not relevant here, though. Still, might be as good to use `int` field for generated flag.
src/java.base/share/classes/jdk/internal/reflect/NativeConstructorAccessorImpl.java line 72:
> 70: parent.setDelegate(acc);
> 71: } catch (Throwable t) {
> 72: // in case Thowable happens in generateMethod
Typo: `Thowable`.
-------------
Changes requested by shade (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/1070
More information about the core-libs-dev
mailing list