You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/07/31 13:27:32 UTC

svn commit: r427074 - in /incubator/harmony/enhanced/classlib/trunk/modules: luni/src/main/java/org/apache/harmony/luni/util/ luni/src/main/native/luni/shared/ nio/src/main/java/org/apache/harmony/nio/internal/

Author: mloenko
Date: Mon Jul 31 04:27:32 2006
New Revision: 427074

URL: http://svn.apache.org/viewvc?rev=427074&view=rev
Log:
fixes for HARMONY-815
[classlib][nio] Refine implConfigureBlocking(boolean) method of DatagramChannel and SocketChannel

Added:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ErrorCodeException.java
Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/shared/nethelp.c
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/SocketChannelImpl.java

Added: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ErrorCodeException.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ErrorCodeException.java?rev=427074&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ErrorCodeException.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ErrorCodeException.java Mon Jul 31 04:27:32 2006
@@ -0,0 +1,32 @@
+/* Copyright 2006 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.harmony.luni.util;
+
+public class ErrorCodeException extends Exception {
+
+    private static final long serialVersionUID = -8716868971626579265L;
+   
+    private int errorCode;
+  
+    public ErrorCodeException(int errorCode){
+        this.errorCode = errorCode;
+    }
+    
+    public int getErrorCode(){
+        return errorCode;
+    }
+
+}

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/shared/nethelp.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/shared/nethelp.c?rev=427074&r1=427073&r2=427074&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/shared/nethelp.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/shared/nethelp.c Mon Jul 31 04:27:32 2006
@@ -351,7 +351,33 @@
   /* the error message lookup should be done before the FindClass
    * call, because the FindClass call may reset the error number that
    * is used in hysock_error_message */
+  jclass socketExClass,errorCodeExClass;
+  jmethodID errorCodeExConstructor, socketExConstructor,socketExCauseMethod;
+  jobject errorCodeEx,socketEx;
   char *errorMessage = netLookupErrorString (env, errorNumber);
+  if (HYPORT_ERROR_SOCKET_WOULDBLOCK == errorNumber){
+  	   errorCodeExClass = (*env)->FindClass (env, "org/apache/harmony/luni/util/ErrorCodeException");
+  	   if (!errorCodeExClass){
+  	           return;
+  	   }
+  	   errorCodeExConstructor = (*env)->GetMethodID(env,errorCodeExClass,"init","(I)V");
+       if (!errorCodeExConstructor){
+               return;
+       }
+       errorCodeEx = (*env)->NewObject(env, errorCodeExClass,errorCodeExConstructor,errorNumber);
+       socketExClass = (*env)->FindClass (env, "java/net/SocketException");
+  	   if (!socketExClass) {
+  	           return;
+  	   }
+  	   socketExConstructor = (*env)->GetMethodID(env,socketExClass,"init","(Ljava/lang/String;)V");
+       if (!socketExConstructor) {
+               return;
+       }
+       socketEx = (*env)->NewObject(env, socketExClass,errorCodeExConstructor,errorMessage); 
+       socketExCauseMethod = (*env)->GetMethodID(env,socketExClass,"initCause","(Ljava/lang/Throwable;)Ljava/lang/Throwable;");
+       (*env)->CallObjectMethod(env,socketEx,socketExCauseMethod,errorCodeEx);
+       (*env)->Throw(env,socketEx);
+  }
   throwNewExceptionByName(env, "java/net/SocketException", errorMessage);
 }
 

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java?rev=427074&r1=427073&r2=427074&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java Mon Jul 31 04:27:32 2006
@@ -37,6 +37,7 @@
 import org.apache.harmony.luni.platform.FileDescriptorHandler;
 import org.apache.harmony.luni.platform.INetworkSystem;
 import org.apache.harmony.luni.platform.Platform;
+import org.apache.harmony.luni.util.ErrorCodeException;
 
 
 
@@ -56,10 +57,8 @@
 
     // default timeout used to nonblocking mode.
     private static final int DEFAULT_TIMEOUT = 1;
-
-    // error messages, for native dependent.
-    private static final String ERRMSG_TIMEOUT = "The operation timed out";
-
+    
+    private static final int ERRCODE_SOCKET_NONBLOCKING_WOULD_BLOCK = -211;
 
     // -------------------------------------------------------------------
     // Instance variables
@@ -445,11 +444,8 @@
             }
             return readCount;
         } catch (InterruptedIOException e) {
-            // FIXME improve native code.
-            if (e.getMessage().equals(ERRMSG_TIMEOUT)) {
-                return 0;
-            }
-            throw e;
+            // InterruptedIOException will be thrown when timeout.
+            return 0;
         } finally {
             end(readCount > 0);
         }
@@ -522,6 +518,14 @@
                     length, isBound);
             buf.position(oldposition + result);
             return result;
+        } catch (SocketException e){
+            if (e.getCause() instanceof ErrorCodeException) {
+                if (ERRCODE_SOCKET_NONBLOCKING_WOULD_BLOCK == ((ErrorCodeException) e
+                        .getCause()).getErrorCode()) {
+                    return result;
+                }
+            }
+            throw e;   
         } finally {
             end(result > 0);
         }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/SocketChannelImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/SocketChannelImpl.java?rev=427074&r1=427073&r2=427074&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/SocketChannelImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/SocketChannelImpl.java Mon Jul 31 04:27:32 2006
@@ -43,6 +43,7 @@
 import org.apache.harmony.luni.platform.FileDescriptorHandler;
 import org.apache.harmony.luni.platform.INetworkSystem;
 import org.apache.harmony.luni.platform.Platform;
+import org.apache.harmony.luni.util.ErrorCodeException;
 import org.apache.harmony.luni.util.Msg;
 
 
@@ -59,7 +60,7 @@
 
     private static final int EOF = -1;
 
-    private static final String ERRMSG_SOCKET_NONBLOCKING_WOULD_BLOCK = "The socket is marked as nonblocking operation would block";
+    private static final int ERRCODE_SOCKET_NONBLOCKING_WOULD_BLOCK = -211;
 
     // The singleton to do the native network operation.
     static final INetworkSystem networkSystem = Platform.getNetworkSystem();
@@ -277,6 +278,10 @@
                 result = networkSystem.connectWithTimeout(fd, 0, trafficClass,
                         inetSocketAddress.getAddress(), inetSocketAddress
                                 .getPort(), HY_SOCK_STEP_START, connectContext);
+                // set back to nonblocking to work around with a bug in portlib
+                if (!this.isBlocking()){
+                    networkSystem.setNonBlocking(fd, true);
+                }
             }
             finished = (CONNECT_SUCCESS == result);
             isBound = finished;
@@ -501,7 +506,6 @@
         }
         int writeCount = 0;
         try {
-            networkSystem.setNonBlocking(fd, !this.isBlocking());
             int pos = source.position();
             int length = source.remaining();
             if (isBlocking()){
@@ -517,9 +521,13 @@
             }
             source.position(pos + writeCount);
         } catch (SocketException e) {
-            if (!ERRMSG_SOCKET_NONBLOCKING_WOULD_BLOCK.equals(e.getMessage())) {
-                throw e;
-            }            
+            if (e.getCause() instanceof ErrorCodeException) {
+                if (ERRCODE_SOCKET_NONBLOCKING_WOULD_BLOCK == ((ErrorCodeException) e
+                        .getCause()).getErrorCode()) {
+                    return writeCount;
+                }
+            }
+            throw e;
         } finally {
             if (isBlocking()){
                 end(writeCount >= 0);