2006/8/10, Jimmy, Jing Lv <[EMAIL PROTECTED]>:

<snip>
>>
>> I've looked into this, I feel puzzled, the stack trace shows that:
>> org.apache.harmony.luni.net.SocketOutputStream.write(
SocketOutputStream.java:89)
>>
>> but there are checks for overflow:
>> if (0 <= offset && offset <= buffer.length && 0 <= count
>>             && count <= buffer.length - offset){
>> ...
>> }
>
> Oops, this is certainly wrong: "offset <= buffer.length","count <=
> buffer.length - offset", the equal mark should be omitted.
>

I do some further study and test then, and find the problem was not so
easy.

Alex and I are correct that "offset <= buffer.length" here is wrong, but
the next "count <= buffer.length - offset" seems has proved its
correctness.

I have a test[1], try to write(new byte[count],count, 0) to a
SocketOutputStream, the test passes quietly. I do this test on WinXp
Sp2, the latest Harmony workspace, with J9 VM5.

I believe the ArrayIndexOutOfBoundsException is throw out when it try to
get byte array in the native (GetByteArrayRegion), which is a JNI
method. I guess there may be some difference between VMs.

Martin, are you using DRLVM? Can someone using DRLVM (or other VMs) run
the test below on DRLVM for me? Thanks!

[1]
public void test_socketOutputStream() throws Exception {
         ServerSocket ss = new ServerSocket(0);
         Socket sock = new Socket();
         sock.connect(new InetSocketAddress
                (InetAddress.getLocalHost(),ss.getLocalPort()));
         ss.accept();
         OutputStream os = sock.getOutputStream();
         os.write(new byte[0], 0, 0); // passes here
         os.write(new byte[512], 512, 0); // passes here
     }


I've run on DRLVM, and get exactly the same exception:
java.lang.ArrayIndexOutOfBoundsException: 0..0

So VMs are different here: J9 VM return 0 immediately while DRLVM throw
exception.

RI return gracefully here, so I think this is a bug , and there're two ways
to solve the problem: fix it in java or fix it in VM. I can fix it right now
in Java, there may be a lot code like this. And I'm wonderring what RI do in
its JNI.
I'll test RI's JNI method "GetByteArrayRegion" to see what do it do if pass
(new byte[512], 512, 0) as parameter.

I'll raise a JIRA for this.
>
> I'm not sure if this is the cause of the problem. So would you please
> try again if I correct it? :)
>
>> So can you give more information? e.g, what are PrintWriter try to
>> write that time? :)
>>
>>> 2.- Trying to generate charts using JFreeCharts (server-side):
>>>
>>> java.lang.NoClassDefFoundError: org/apache/harmony/awt/gl/ImageSurface
>>>     at
>>> java.awt.image.BufferedImage.createImageSurface(BufferedImage.java
:659)
>>>     at java.awt.image.BufferedImage.<init>(BufferedImage.java:352)
>>>     at
>>> org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java:1211)
>>>     at
>>> org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java:1193)
>>>     at
>>> org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java
:1178)...
>>>
>>> The JDBC related code is running fine, performance also looks very
good.
>>>
>>> I will contact Winstone developer to see if he can help in some way to
>>> identify the problem. He already helped me a few months ago to help
>>> identify a bug in GNU Classpath server socket API.
>>>
>>> Regards,
>>> Martin
>>
>>
>
>


--

Best Regards!

Jimmy, Jing Lv
China Software Development Lab, IBM

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




--

Best Regards!

Jimmy, Jing Lv
China Software Development Lab, IBM

Reply via email to