On Mon, 1 Feb 2021 09:00:18 GMT, Sergey Bylokhov <[email protected]> wrote:
> Both methods are implemented in a similar way.
> 1. Requests the size of the profile/tag data
> 2. Creates an array of the correct size
> 3. Requests the data and copy it to the array
>
> If the data will be changed concurrently between steps 2. and 3. then we will
> get a mismatch between the array and copied data.
>
> In the fix, all steps above are merged to just one step return the data when
> requested.
src/java.desktop/share/classes/java/awt/color/ICC_Profile.java line 1210:
> 1208: public byte[] getData() {
> 1209: activate();
> 1210: return CMSManager.getModule().getProfileData(cmmProfile);
Just one step, the array will be created in the native code under proper
synchronization.
src/java.desktop/share/classes/java/awt/color/ICC_Profile.java line 1236:
> 1234: private static byte[] getData(Profile p, int tagSignature) {
> 1235: try {
> 1236: return CMSManager.getModule().getTagData(p, tagSignature);
Just one step, the array will be created in the native code under proper
synchronization.
src/java.desktop/share/native/liblcms/LCMS.c line 330:
> 328: }
> 329:
> 330: jbyteArray data = (*env)->NewByteArray(env, pfSize);
Here we create the new array.
-------------
PR: https://git.openjdk.java.net/jdk/pull/2330