Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 22854 invoked from network); 18 Jun 2008 08:35:37 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 18 Jun 2008 08:35:37 -0000 Received: (qmail 82682 invoked by uid 500); 18 Jun 2008 08:35:39 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 82668 invoked by uid 500); 18 Jun 2008 08:35:39 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 82659 invoked by uid 99); 18 Jun 2008 08:35:38 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Jun 2008 01:35:38 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Jun 2008 08:34:57 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id BE7CA234C143 for ; Wed, 18 Jun 2008 01:34:45 -0700 (PDT) Message-ID: <1792202365.1213778085778.JavaMail.jira@brutus> Date: Wed, 18 Jun 2008 01:34:45 -0700 (PDT) From: "Tim Ellison (JIRA)" To: commits@harmony.apache.org Subject: [jira] Commented: (HARMONY-5876) [classlib][nio] NIO native corrupting Long.valueOf(0) In-Reply-To: <2097270467.1213752285533.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/HARMONY-5876?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12605887#action_12605887 ] Tim Ellison commented on HARMONY-5876: -------------------------------------- Yeah, it shouldn't do that. The quick fix is to make this a unique instance of Long, but I agree that it is distasteful to modify the Long's value. A better solution is to either set the connectContext field to a new instance of Long with the desired value, or (if you don't want to call back) create a private inner class with a long field you can slam without affecting others. I'm inclined towards the latter option. Index: modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SocketChannelImpl.java =================================================================== --- modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SocketChannelImpl.java (revision 664690) +++ modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SocketChannelImpl.java (working copy) @@ -121,7 +121,9 @@ // This content is a point used to set in connect_withtimeout() in pending // mode. - private Long connectContext = Long.valueOf(0L); + // Must be a new instance of Long (i.e. not valueOf) as it's value may + // be modified by native code. + private Long connectContext = new Long(0L); // Used to store the trafficClass value which is simply returned // as the value that was set. We also need it to pass it to methods > [classlib][nio] NIO native corrupting Long.valueOf(0) > ----------------------------------------------------- > > Key: HARMONY-5876 > URL: https://issues.apache.org/jira/browse/HARMONY-5876 > Project: Harmony > Issue Type: Bug > Components: Classlib > Affects Versions: 5.0M6 > Environment: Windows x86-32 for sure, probably others. > Reporter: Andrew Cornwall > > The following test case: > import java.net.*; > import java.nio.channels.*; > public class SocketChannelTest { > public static void main(String args[]) throws Exception { > SocketChannel socketChannel = SocketChannel.open(); > socketChannel.configureBlocking(false); > InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 6789); > System.out.println(new Long(0)); > System.out.println(Long.valueOf(0)); > socketChannel.connect(addr); > System.out.println(new Long(0)); > System.out.println(Long.valueOf(0)); > } > } > will print the following output on Harmony M6: > 0 > 0 > 0 > 598759496 > On Sun JDK 1.5.0_14, it prints the expected value: > 0 > 0 > 0 > 0 > I suspect that the problem is in the NIO native code: in particular, OSNetworkSystem.c does the following: > void > setConnectContext(JNIEnv *env,jobject longclass,U_8 * context){ > jclass descriptorCLS; > jfieldID descriptorFID; > descriptorCLS = (*env)->FindClass (env, "java/lang/Long"); > descriptorFID = (*env)->GetFieldID (env, descriptorCLS, "value","J"); > (*env)->SetLongField(env, longclass, descriptorFID,(jlong)((IDATA)context)); > }; > This will work as long as Longs aren't cached - but once Longs are cached for performance reasons (as they are in Harmony) modifying the value of a Long in a native may have unexpected repercussions. > I'm pretty sure this code is in error - I don't know if other native code does a similar thing. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.