On Thu, 2 Nov 2023 15:52:09 GMT, Thomas Schatzl <tscha...@openjdk.org> wrote:

>> I (still) do not think it is possible after some more re-testing. There are 
>> the following situations I can think of:
>> 
>> * string deduplication is a need-to-be-supported case where only the C code 
>> may have a reference to a pinned object: thread A critical sections a 
>> string, gets the char array address, locking the region containing the char 
>> array. Then string dedup goes ahead and replaces the original char array 
>> with something else. Now the C code has the only reference to that char 
>> array.
>> There is no API to convert a raw array pointer back to a Java object so 
>> destroying the header is fine; unpinning does not need the header.
>> 
>> * there is some other case I can think of that could be problematic, but is 
>> actually a spec violation: the array is critical-locked by thread A, then 
>> shared with other C code (not critical-unlocked), resumes with Java code 
>> that forgets that reference. At some point other C code accesses that locked 
>> memory and (hopefully) critically-unlocks it.
>> Again, there is no API to convert a raw array pointer back to a Java object 
>> so destroying the header is fine.
>> 
>> In all other cases I can think of there is always a reference to the 
>> encapsulating java object either from the stack frame (when passing in the 
>> object into the JNI function they are part of the oop maps) or if you create 
>> a new array object (via `New<xxx>Array` and lock it, the VM will add a 
>> handle to it.
>> 
>> There is also no API to inspect the array header using the raw pointer (e.g. 
>> passing the raw pointer to `GetArrayLength`  - doesn't compile as it expects 
>> a `jarray`, and in debug VMs there is actually a check that the passed 
>> argument is something that resembles a handle), so modifications are already 
>> invalid, and the change is fine imo.
>> 
>> hth,
>>   Thomas
>
> Here is some example (pseudo-) code for the first case mentioned above that 
> should be valid JNI code:
> 
> 
> Java code:
> 
> String x = ...;
> native_f1(x);
> [ some java code, x.chars gets deduplicated, its char array pointing to 
> somewhere else now. Now native code is the only one having a reference to the 
> old char array ]
> native_f2();
> 
> ----------- sample native code:
> 
> void native_f1(jobject jstring) {
>    global_string = NewGlobalRef(jstring);
>    global_raw_chars = GetStringChars(global_string);
> }
> 
> void native_f2() {
>    ReleaseStringChars(global_string, global_raw_chars);
>    DeleteGlobalRef(global_string);
> }

> string deduplication is a need-to-be-supported case...

OK, so this is the only valid scenario where a type-array should be kept live 
even though it's not reachable from GC's perspective. Could you describe it in 
the comment?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16342#discussion_r1381436094

Reply via email to