[OpenJDK 2D-Dev] [9] Review Request: 8080847 Copying of overlapping memory should be improved in java2d
Sergey Bylokhov
Sergey.Bylokhov at oracle.com
Mon May 25 19:32:23 UTC 2015
Hi, Jim.
Actually there is a difference in support: it works but result is a
little bit wrong, and it does not work and crashes. This fix is not a
general solution for the incorrect result of the blit+aliasing, but for
the possible crash of memcpy especially after some improvements like in
glibc. I think this still an issue.
> I don't recall if we ever promised that this case would work without
> aliasing issues. I know that we went out of our way in the copyArea
> method to prevent the aliasing issue, doing the blits piecemeal so
> that they don't interfere with each other. Further, while it may be
> easy enough to just call memmove to have the libraray do this for us
> in the IsoBlit case, other cases that don't fall into the IsoBlit
> macro will not be similarly protected. In particular, if you specify
> an alpha value, you will not get this protection (at least not without
> a huge amount of work to overhaul the entire DrawImage pipeline).
>
> I would say that this would be OK if we planned to make this promise
> about drawImage across all image formats and composition modes, but
> that would be a far more complicated fix. Until then, we should not
> open this can of worms by modifying this one specific Blit case...
>
> ...jim
>
> On 5/25/2015 5:35 AM, Sergey Bylokhov wrote:
>> Hello.
>> Please review the fix forjdk9.
>>
>> I found this issue during code review of another task, related to
>> performance.
>>
>> The sample code below will call the IsomorphicCopy method which call
>> memcpy on the overlapping memory(this is the simplest example)
>>
>> BufferedImage img = new BufferedImage(100, 100,
>> BufferedImage.TYPE_INT_ARGB_PRE);
>> Graphics2D g = img.createGraphics();
>> g.setComposite(AlphaComposite.Src);
>> g.drawImage(img, 0, 0, null);
>> g.dispose();
>>
>> http://linux.die.net/man/3/memcpy
>> "The memcpy() function copies n bytes from memory area src to memory
>> area dest. The memory areas must not overlap. Use memmove(3) if the
>> memory areas do overlap"
>>
>>
>> I can confirm this bug using valgrind and a program above:
>> command:
>> valgrind --smc-check=all --tool=memcheck --leak-check=full -v
>> ./9/client/build/linux-x86_64-normal-server-fastdebug/images/jdk/bin/java
>> -Xint
>> Main
>>
>> output:
>> ==60975== Source and destination overlap in memcpy(0xe1b8b4d8,
>> 0xe1b8b4d8, 400)
>> ==60975== at 0x4C2F71C: memcpy@@GLIBC_2.14 (in
>> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
>> ==60975== by 0x1E0F504D: AnyIntIsomorphicCopy (in
>> /moe/workspaces/jdk/9/client-work/build/linux-x86_64-normal-server-fastdebug/images/jdk/lib/amd64/libawt.so)
>>
>>
>> ==60975== by 0x1E0F5DE8: Java_sun_java2d_loops_Blit_Blit (in
>> /moe/workspaces/jdk/9/client-work/build/linux-x86_64-normal-server-fastdebug/images/jdk/lib/amd64/libawt.so)
>>
>>
>>
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8080847
>> Webrev can be found at:
>> http://cr.openjdk.java.net/~serb/8080847/webrev.00
>>
--
Best regards, Sergey.
More information about the 2d-dev
mailing list