You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/05/03 16:47:29 UTC
svn commit: r399319 - in
/incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni:
OSNetworkSystem.c OSNetworkSystemLinux.c
Author: tellison
Date: Wed May 3 07:47:12 2006
New Revision: 399319
URL: http://svn.apache.org/viewcvs?rev=399319&view=rev
Log:
Part of HARMONY-413
Restructuring OSNetworkSystem in preparation for merge.
Modified:
incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystem.c
incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystemLinux.c
Modified: incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystem.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystem.c?rev=399319&r1=399318&r2=399319&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystem.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystem.c Wed May 3 07:47:12 2006
@@ -1,4 +1,5 @@
-/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+/* Copyright 1998, 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.
@@ -14,15 +15,14 @@
*/
#include "OSNetworkSystem.h"
-#include "helpers.h"
#include "jcl.h"
#include "nethelp.h"
+#include "helpers.h"
#include "jclprots.h"
#include "portsock.h"
#include "socket.h"
#include "jclglob.h"
-
void setSocketImplPort (JNIEnv * env, jobject socketImpl, U_16 hPort);
void setSocketImplAddress (JNIEnv * env, jobject socketImpl,
jobject anInetAddress);
@@ -275,7 +275,6 @@
setSocketImplPort (env, socketImpl, hysock_ntohs (nPort));
}
-
/*----------------------former cache get/set ------------------------------------
/*
* Class: org_apache_harmony_luni_platform_OSNetworkSystem
@@ -414,17 +413,17 @@
if (localCount > INTERNAL_RECEIVE_BUFFER_MAX)
{
message = hymem_allocate_memory (localCount);
+ if (message == NULL)
+ {
+ throwNewOutOfMemoryError (env, "");
+ return 0;
+ }
}
else
{
message = internalBuffer;
}
- if (message == NULL)
- {
- throwNewOutOfMemoryError (env, "");
- return 0;
- }
result = hysock_read (hysocketP, (U_8 *) message, localCount, HYSOCK_NOFLAGS);
@@ -475,17 +474,18 @@
if (count > INTERNAL_SEND_BUFFER_MAX)
{
message = hymem_allocate_memory (count);
+ if (message == NULL)
+ {
+ throwNewOutOfMemoryError (env, "");
+ return 0;
+ }
}
else
{
message = internalBuffer;
}
- if (message == NULL)
- {
- throwNewOutOfMemoryError (env, "");
- return 0;
- }
+
(*env)->GetByteArrayRegion (env, data, offset, count, message);
while (sent < count)
{
@@ -515,7 +515,7 @@
{
hymem_free_memory (message);
}
-#undef INTERNAL_MAX
+#undef INTERNAL_SEND_BUFFER_MAX
/**
* We should always throw an exception if all the data cannot be sent because Java methods
@@ -547,7 +547,7 @@
socketP =getJavaIoFileDescriptorContentsAsAPointer (env, afd);
if (!hysock_socketIsValid (socketP))
{
- //throwJavaNetSocketException (env, HYPORT_ERROR_SOCKET_BADSOCKET);
+ // return silently, leave validation in real I/O operation
return ;
}
result = hysock_set_nonblocking(socketP,nonblocking);
@@ -675,6 +675,7 @@
/* set connext for next call*/
setConnectContext(env,passContext,context);
+
if (0 == result)
{
/* connected , so stop here */
@@ -691,6 +692,8 @@
(HYPORT_ERROR_SOCKET_ENETUNREACH == result) ||
(HYPORT_ERROR_SOCKET_EACCES == result))
{
+ // This wasn't commented out on win.IA32 but I don't
+ // see why it shouldn't be the same on both platforms
//hysock_connect_with_timeout (socketP, &sockaddrP,
//0,HY_PORT_SOCKET_STEP_DONE,
//&context);
@@ -1063,38 +1066,43 @@
hysockaddr_struct sockaddrP;
U_32 scope_id = 0;
+ /* This method still needs work for IPv6 support */
+
socketP = getJavaIoFileDescriptorContentsAsAPointer (env, fileDescriptor);
if (!hysock_socketIsValid (socketP))
{
throwJavaNetSocketException (env, HYPORT_ERROR_SOCKET_BADSOCKET);
- return;
+ return 0;
+ }
+
+ netGetJavaNetInetAddressValue (env, inetAddress, nlocalAddrBytes,
+ &length);
+
+ nPort = hysock_htons ((U_16) localPort);
+ if (length == HYSOCK_INADDR6_LEN)
+ {
+ netGetJavaNetInetAddressScopeId (env, inetAddress, &scope_id);
+ hysock_sockaddr_init6 (&sockaddrP, nlocalAddrBytes, length,
+ HYADDR_FAMILY_AFINET6, nPort, 0, scope_id,
+ socketP);
}
else
{
- netGetJavaNetInetAddressValue (env, inetAddress, nlocalAddrBytes,
- &length);
-
- nPort = hysock_htons ((U_16) localPort);
- if (length == HYSOCK_INADDR6_LEN)
- {
- netGetJavaNetInetAddressScopeId (env, inetAddress, &scope_id);
- hysock_sockaddr_init6 (&sockaddrP, nlocalAddrBytes, length,
- HYADDR_FAMILY_AFINET6, nPort, 0, scope_id,
- socketP);
- }
- else
- {
- hysock_sockaddr_init6 (&sockaddrP, nlocalAddrBytes, length,
- HYADDR_FAMILY_AFINET4, nPort, 0, scope_id,
- socketP);
- }
- result = hysock_bind (socketP, &sockaddrP);
- if (0 != result)
- {
- throwJavaNetBindException (env, result);
- return;
- }
+ hysock_sockaddr_init6 (&sockaddrP, nlocalAddrBytes, length,
+ HYADDR_FAMILY_AFINET4, nPort, 0, scope_id,
+ socketP);
}
+ result = hysock_bind (socketP, &sockaddrP);
+ if (0 != result)
+ {
+ throwJavaNetBindException (env, result);
+ return 0;
+ }
+
+ /* TOFIX: This matches the windows behaviour but it doesn't look right
+ result must be zero so the return code is zero from all paths.
+ */
+ return result;
}
@@ -1870,17 +1878,17 @@
if (localCount > INTERNAL_RECEIVE_BUFFER_MAX)
{
message = hymem_allocate_memory ( localCount);
+ if (message == NULL)
+ {
+ throwNewOutOfMemoryError (env, "");
+ return 0;
+ }
}
else
{
message = internalBuffer;
}
- if (message == NULL)
- {
- throwNewOutOfMemoryError (env, "");
- return 0;
- }
result =
hysock_read (hysocketP, (U_8 *) message, localCount, HYSOCK_NOFLAGS);
if (result > 0)
@@ -1890,7 +1898,7 @@
{
hymem_free_memory ( message);
}
-#undef INTERNAL_MAX
+#undef INTERNAL_RECEIVE_BUFFER_MAX
/* If no bytes are read, return -1 to signal 'endOfFile' to the Java input stream */
if (0 < result)
@@ -1925,17 +1933,18 @@
if (count > INTERNAL_SEND_BUFFER_MAX)
{
message = hymem_allocate_memory ( count);
+ if (message == NULL)
+ {
+ throwNewOutOfMemoryError (env, "");
+ return 0;
+ }
}
else
{
message = internalBuffer;
}
- if (message == NULL)
- {
- throwNewOutOfMemoryError (env, "");
- return 0;
- }
+
(*env)->GetByteArrayRegion (env, data, offset, count, message);
while (sent < count)
{
@@ -2099,97 +2108,6 @@
(hysocket_t) getJavaIoFileDescriptorContentsAsAPointer (env, thisObjFD);
setPlatformBindOptions (env, socketP);
}
-
-
-
-/*
- * Class: org_apache_harmony_luni_platform_OSNetworkSystem
- * Method: selectImpl
- * Signature: ([Ljava/io/FileDescriptor;[Ljava/io/FileDescriptor;II[IJ)I
- */
-JNIEXPORT jint JNICALL Java_org_apache_harmony_luni_platform_OSNetworkSystem_selectImpl
- (JNIEnv * env, jclass thisClz, jobjectArray readFDArray, jobjectArray writeFDArray,
- jint countReadC, jint countWriteC, jintArray outFlags, jlong timeout){
- PORT_ACCESS_FROM_ENV (env);
- hytimeval_struct timeP;
- I_32 result = 0;
- I_32 size = 0;
- jobject gotFD;
- hyfdset_t fdset_read,fdset_write;
- hysocket_t hysocketP;
- jboolean isCopy ;
- jint *flagArray;
- int val;
-
- fdset_read = hymem_allocate_memory(sizeof (struct hyfdset_struct));
- fdset_write = hymem_allocate_memory(sizeof (struct hyfdset_struct));
-
- FD_ZERO (&fdset_read->handle);
- FD_ZERO (&fdset_write->handle);
- for (val = 0; val<countReadC; val++){
- gotFD = (*env)->GetObjectArrayElement(env,readFDArray,val);
- hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
- /*No difference between ipv4 and ipv6 as in windows*/
- FD_SET (hysocketP->sock, &fdset_read->handle);
- if (0 > (size - hysocketP->sock))
- size = hysocketP->sock;
- }
- for (val = 0; val<countWriteC; val++){
- gotFD = (*env)->GetObjectArrayElement(env,writeFDArray,val);
- hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
- /*No difference between ipv4 and ipv6 as in windows*/
- FD_SET (hysocketP->sock, &fdset_write->handle);
- if (0 > (size - hysocketP->sock))
- size = hysocketP->sock;
- }
- /* the size is the max_fd + 1 */
- size =size + 1;
-
- if (0 > size)
- {
- result = HYPORT_ERROR_SOCKET_FDSET_SIZEBAD;
- }
- else
- {
- /* only set when timeout >= 0 (non-block)*/
- if (0 <= timeout){
- hysock_timeval_init ( 0, (I_32)timeout, &timeP);
- result = hysock_select (size, fdset_read, fdset_write, NULL,&timeP);
- }
- else{
- result = hysock_select (size, fdset_read, fdset_write, NULL,NULL);
- }
- }
-
- if (0 < result){
- /*output the reslut to a int array*/
- flagArray = (*env)->GetIntArrayElements(env,outFlags, &isCopy);
- for (val=0;val<countReadC;val++){
- gotFD = (*env)->GetObjectArrayElement(env,readFDArray,val);
- hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
- if (FD_ISSET(hysocketP->sock,&fdset_read->handle))
- flagArray[val] = SOCKET_OP_READ;
- else
- flagArray[val] = SOCKET_OP_NONE;
-
- }
-
- for (val=0;val<countWriteC;val++){
- gotFD = (*env)->GetObjectArrayElement(env,writeFDArray,val);
- hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
- if (FD_ISSET(hysocketP->sock,&fdset_write->handle))
- flagArray[val+countReadC] = SOCKET_OP_WRITE;
- else
- flagArray[val+countReadC] = SOCKET_OP_NONE;
-
- }
- (*env)->ReleaseIntArrayElements(env,outFlags, flagArray, 0);
- }
- hymem_free_memory(fdset_write);
- hymem_free_memory(fdset_read);
- /* return both correct and error result, let java code handle the exception*/
- return result;
-};
/*
Modified: incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystemLinux.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystemLinux.c?rev=399319&r1=399318&r2=399319&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystemLinux.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/linux.IA32/luni/OSNetworkSystemLinux.c Wed May 3 07:47:12 2006
@@ -17,6 +17,7 @@
#include "jclglob.h"
#include "portsock.h"
#include "hyport.h"
+#include "OSNetworkSystem.h"
//Alternative Select function
int
@@ -41,3 +42,93 @@
hymem_free_memory(fdset_read);
return result;
}
+
+
+/*
+ * Class: org_apache_harmony_luni_platform_OSNetworkSystem
+ * Method: selectImpl
+ * Signature: ([Ljava/io/FileDescriptor;[Ljava/io/FileDescriptor;II[IJ)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_harmony_luni_platform_OSNetworkSystem_selectImpl
+ (JNIEnv * env, jclass thisClz, jobjectArray readFDArray, jobjectArray writeFDArray,
+ jint countReadC, jint countWriteC, jintArray outFlags, jlong timeout){
+ PORT_ACCESS_FROM_ENV (env);
+ hytimeval_struct timeP;
+ I_32 result = 0;
+ I_32 size = 0;
+ jobject gotFD;
+ hyfdset_t fdset_read,fdset_write;
+ hysocket_t hysocketP;
+ jboolean isCopy ;
+ jint *flagArray;
+ int val;
+
+ fdset_read = hymem_allocate_memory(sizeof (struct hyfdset_struct));
+ fdset_write = hymem_allocate_memory(sizeof (struct hyfdset_struct));
+
+ FD_ZERO (&fdset_read->handle);
+ FD_ZERO (&fdset_write->handle);
+ for (val = 0; val<countReadC; val++){
+ gotFD = (*env)->GetObjectArrayElement(env,readFDArray,val);
+ hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
+ /*No difference between ipv4 and ipv6 as in windows*/
+ FD_SET (hysocketP->sock, &fdset_read->handle);
+ if (0 > (size - hysocketP->sock))
+ size = hysocketP->sock;
+ }
+ for (val = 0; val<countWriteC; val++){
+ gotFD = (*env)->GetObjectArrayElement(env,writeFDArray,val);
+ hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
+ /*No difference between ipv4 and ipv6 as in windows*/
+ FD_SET (hysocketP->sock, &fdset_write->handle);
+ if (0 > (size - hysocketP->sock))
+ size = hysocketP->sock;
+ }
+ /* the size is the max_fd + 1 */
+ size =size + 1;
+
+ if (0 > size)
+ {
+ result = HYPORT_ERROR_SOCKET_FDSET_SIZEBAD;
+ }
+ else
+ {
+ /* only set when timeout >= 0 (non-block)*/
+ if (0 <= timeout){
+ hysock_timeval_init ( 0, (I_32)timeout, &timeP);
+ result = hysock_select (size, fdset_read, fdset_write, NULL,&timeP);
+ }
+ else{
+ result = hysock_select (size, fdset_read, fdset_write, NULL,NULL);
+ }
+ }
+
+ if (0 < result){
+ /*output the reslut to a int array*/
+ flagArray = (*env)->GetIntArrayElements(env,outFlags, &isCopy);
+ for (val=0;val<countReadC;val++){
+ gotFD = (*env)->GetObjectArrayElement(env,readFDArray,val);
+ hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
+ if (FD_ISSET(hysocketP->sock,&fdset_read->handle))
+ flagArray[val] = SOCKET_OP_READ;
+ else
+ flagArray[val] = SOCKET_OP_NONE;
+
+ }
+
+ for (val=0;val<countWriteC;val++){
+ gotFD = (*env)->GetObjectArrayElement(env,writeFDArray,val);
+ hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
+ if (FD_ISSET(hysocketP->sock,&fdset_write->handle))
+ flagArray[val+countReadC] = SOCKET_OP_WRITE;
+ else
+ flagArray[val+countReadC] = SOCKET_OP_NONE;
+
+ }
+ (*env)->ReleaseIntArrayElements(env,outFlags, flagArray, 0);
+ }
+ hymem_free_memory(fdset_write);
+ hymem_free_memory(fdset_read);
+ /* return both correct and error result, let java code handle the exception*/
+ return result;
+};