On Sun, 8 Nov 2020 05:07:07 GMT, Hui Shi <[email protected]> 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