Ack. Reviewed only in context of replace `select` with `osaf_poll`.
Minor comment: good to set fd.revent = 0; esp. when FDs = malloc().
Thanks,
Ramesh.
On 12/17/2013 9:09 PM, Anders Widell wrote:
> java/ais_api_impl_native/Makefile.am | 1 +
> java/ais_api_impl_native/j_ais_amf_libHandle.c | 191 +---------------------
> java/ais_api_impl_native/j_ais_clm_libHandle.c | 192
> +----------------------
> java/ais_api_impl_native/j_ais_libHandle.c | 206
> +++++-------------------
> java/ais_api_impl_native/j_ais_socketUtil.c | 40 ++--
> java/ais_api_impl_native/j_utils.c | 37 ----
> java/ais_api_impl_native/j_utils.h | 4 -
> 7 files changed, 85 insertions(+), 586 deletions(-)
>
>
> The select() function cannot handle file descriptors larger than 1023. To
> avoid this limitation, we replace all usages of select() with poll().
>
> diff --git a/java/ais_api_impl_native/Makefile.am
> b/java/ais_api_impl_native/Makefile.am
> --- a/java/ais_api_impl_native/Makefile.am
> +++ b/java/ais_api_impl_native/Makefile.am
> @@ -43,6 +43,7 @@ noinst_HEADERS = \
>
> libjava_ais_api_native_la_CPPFLAGS = \
> -I$(top_srcdir)/osaf/libs/saf/include \
> + -I$(top_srcdir)/osaf/libs/core/common/include \
> -I $(JAVA_HOME)/include \
> -I $(JAVA_HOME)/include/linux \
> -DSA_CLM_B01
> diff --git a/java/ais_api_impl_native/j_ais_amf_libHandle.c
> b/java/ais_api_impl_native/j_ais_amf_libHandle.c
> --- a/java/ais_api_impl_native/j_ais_amf_libHandle.c
> +++ b/java/ais_api_impl_native/j_ais_amf_libHandle.c
> @@ -31,13 +31,13 @@
> #include "j_utilsPrint.h"
>
> #include <errno.h>
> -#include <sys/select.h>
> #include <saAmf.h>
> #include <jni.h>
> #include "j_utils.h"
> #include "j_ais.h"
> #include "j_ais_amf.h"
> #include "jni_ais_amf.h"
> +#include "osaf_poll.h"
>
> /**************************************************************************
> * Constants
> @@ -815,122 +815,6 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> }
>
> /**************************************************************************
> - * FUNCTION: Java_org_opensaf_ais_amf_AmfHandleImpl_checkSelectionObject
> - * TYPE: native method
> - * Class: ais_amf_AmfLHandle
> - * Method: checkSelectionObject
> - * Signature: (J)Z
> - *************************************************************************/
> -/*
> -JNIEXPORT jboolean JNICALL
> Java_org_opensaf_ais_amf_AmfHandleImpl_checkSelectionObject(
> - JNIEnv* jniEnv,
> - jobject thisAmfHandle,
> - jlong timeout )
> -{
> -
> -
> - // VARIABLES
> - // ais
> - SaSelectionObjectT _saSelectionObject;
> - // linux
> - fd_set _readFDs;
> - struct timeval _lxTimeout;
> - int _selectStatus;
> -
> - // BODY
> -
> - assert( thisAmfHandle != NULL );
> - // TODO assert for timeout
> - _TRACE2( "NATIVE: Executing
> Java_org_opensaf_ais_amf_AmfHandleImpl_checkSelectionObject(...)\n" );
> -
> - // get selection object
> - _saSelectionObject = (SaSelectionObjectT) (*jniEnv)->GetLongField(
> - jniEnv,
> - thisAmfHandle,
> -
> FID_selectionObject );
> - // call select(2)
> - FD_ZERO( &_readFDs );
> - FD_SET( _saSelectionObject, &_readFDs );
> - U_convertTimeout( &_lxTimeout, timeout );
> -
> - _TRACE2( "NATIVE: timout is { %ld seconds, %ld microseconds }\n",
> _lxTimeout.tv_sec, _lxTimeout.tv_usec );
> -
> - _selectStatus = select( (_saSelectionObject + 1 ),
> - &_readFDs,
> - NULL,
> - NULL,
> - &_lxTimeout );
> -
> - _TRACE2( "NATIVE: select(...) has returned with %d...\n", _selectStatus
> );
> -
> -
> - // error handling
> - if( _selectStatus == -1 ){
> - switch( errno ){
> - case EBADF: // invalid file descriptor
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EBADF): invalid file
> descriptor\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINTR: // non blocked signal caught
> -
> - _TRACE2( "NATIVE ERROR : select(EINTR): non blocked signal
> caught\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINVAL: // n is negative or the value within timeout is
> invalid
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EINVAL): n is negative or
> the value within timeout is invalid\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case ENOMEM: // select was unable to allocate memory for
> internal tables
> -
> - _TRACE2( "NATIVE ERROR : select(ENOMEM): select was unable
> to allocate memory for internal tables\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisNoMemoryException",
> - AIS_ERR_NO_MEMORY_MSG );
> - break;
> - default:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - }
> - return JNI_FALSE; // EXIT POINT!!! return value is in fact ignored
> - }
> - if( _selectStatus == 1 ){
> -
> - _TRACE2( "NATIVE:
> Java_org_opensaf_ais_amf_AmfHandleImpl_checkSelectionObject() returning
> true\n" );
> -
> - return JNI_TRUE;
> - }
> - else{
> -
> - _TRACE2( "NATIVE:
> Java_org_opensaf_ais_amf_AmfHandleImpl_checkSelectionObject() returning
> false\n" );
> -
> - return JNI_FALSE;
> - }
> -
> -}*/
> -
> -/**************************************************************************
> * FUNCTION: Java_org_opensaf_ais_amf_AmfHandleImpl_invokeSaAmfDispatch
> * TYPE: native method
> * Class: ais_amf_AmfHandle
> @@ -1036,8 +920,8 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> SaAisErrorT _saStatus;
> SaSelectionObjectT _saSelectionObject;
> // linux
> - fd_set _readFDs;
> - int _selectStatus;
> + struct pollfd _readFDs;
> + unsigned _pollStatus;
>
> // BODY
>
> @@ -1054,71 +938,16 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> thisAmfHandle,
>
> FID_selectionObject );
> // wait until there is a pending callback
> - // call select(2)
> - FD_ZERO( &_readFDs );
> - FD_SET( _saSelectionObject, &_readFDs );
> - _selectStatus = select( ( _saSelectionObject + 1 ),
> - &_readFDs,
> - NULL,
> - NULL,
> - NULL );
> + // call osaf_poll()
> + _readFDs.fd = _saSelectionObject;
> + _readFDs.events = POLLIN;
> + _pollStatus = osaf_poll(&_readFDs, 1, -1);
>
> - _TRACE2( "NATIVE: select(...) has returned with %d...\n", _selectStatus
> );
> + _TRACE2( "NATIVE: osaf_poll(...) has returned with %u...\n", _pollStatus
> );
>
> // error handling
> - if( _selectStatus == -1 ){
> - switch( errno ){
> - case EBADF: // invalid file descriptor
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EBADF): invalid file
> descriptor\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINTR: // non blocked signal caught
> -
> - _TRACE2( "NATIVE ERROR : select(EINTR): non blocked signal
> caught\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINVAL: // n is negative or the value within timeout is
> invalid
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EINVAL): n is negative or
> the value within timeout is invalid\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case ENOMEM: // select was unable to allocate memory for
> internal tables
> -
> - _TRACE2( "NATIVE ERROR : select(ENOMEM): select was unable
> to allocate memory for internal tables\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisNoMemoryException",
> - AIS_ERR_NO_MEMORY_MSG );
> - break;
> - default:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - }
> - return; // EXIT POINT!!!
> - }
> - if( _selectStatus != 1 ){
> -
> - _TRACE2( "NATIVE ERROR : unexpected select return value!\n"
> );
> + if (_pollStatus != 1) {
> + _TRACE2( "NATIVE ERROR : unexpected osaf_poll return
> value!\n" );
>
> JNU_throwNewByName( jniEnv,
> "org/saforum/ais/AisLibraryException",
> diff --git a/java/ais_api_impl_native/j_ais_clm_libHandle.c
> b/java/ais_api_impl_native/j_ais_clm_libHandle.c
> --- a/java/ais_api_impl_native/j_ais_clm_libHandle.c
> +++ b/java/ais_api_impl_native/j_ais_clm_libHandle.c
> @@ -28,13 +28,13 @@
> #include <assert.h>
> #include "j_utilsPrint.h"
> #include <errno.h>
> -#include <sys/select.h>
> #include <saClm.h>
> #include <jni.h>
> #include "j_utils.h"
> #include "j_ais.h"
> #include "j_ais_clm.h"
> #include "jni_ais_clm.h" // not really needed, but good for syntax checking!
> +#include "osaf_poll.h"
>
> /**************************************************************************
> * Constants
> @@ -641,123 +641,6 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> }
>
> /**************************************************************************
> - * FUNCTION: Java_org_opensaf_ais_clm_ClmHandleImpl_checkSelectionObject
> - * TYPE: native method
> - * Class: ais_clm_ClmHandle
> - * Method: checkSelectionObject
> - * Signature: (J)Z
> - *************************************************************************/
> -/*
> - * MODIFICATION: removed (to be tested)
> -JNIEXPORT jboolean JNICALL
> Java_org_opensaf_ais_clm_ClmHandleImpl_checkSelectionObject(
> - JNIEnv* jniEnv,
> - jobject thisClmHandle,
> - jlong timeout )
> -{
> -
> - // VARIABLES
> - // ais
> - SaSelectionObjectT _saSelectionObject;
> - // linux
> - fd_set _readFDs;
> - struct timeval _lxTimeout;
> - int _selectStatus;
> -
> - // BODY
> -
> - assert( thisClmHandle != NULL );
> - // TODO assert for timeout
> - _TRACE2( "NATIVE: Executing
> Java_org_opensaf_ais_clm_ClmHandleImpl_checkSelectionObject(...)\n" );
> -
> - // get selection object
> - _saSelectionObject = (SaSelectionObjectT) (*jniEnv)->GetLongField(
> - jniEnv,
> - thisClmHandle,
> -
> FID_selectionObject );
> - // call select(2)
> - FD_ZERO( &_readFDs );
> - FD_SET( _saSelectionObject, &_readFDs );
> - U_convertTimeout( &_lxTimeout, timeout );
> -
> - _TRACE2( "NATIVE: timout is { %ld seconds, %ld microseconds }\n",
> _lxTimeout.tv_sec, _lxTimeout.tv_usec );
> -
> - _selectStatus = select( (_saSelectionObject + 1 ),
> - &_readFDs,
> - NULL,
> - NULL,
> - &_lxTimeout );
> -
> - _TRACE2( "NATIVE: select(...) has returned with %d...\n", _selectStatus
> );
> -
> -
> - // error handling
> - if( _selectStatus == -1 ){
> - switch( errno ){
> - case EBADF: // invalid file descriptor
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EBADF): invalid file
> descriptor\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINTR: // non blocked signal caught
> -
> - _TRACE2( "NATIVE ERROR : select(EINTR): non blocked signal
> caught\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINVAL: // n is negative or the value within timeout is
> invalid
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EINVAL): n is negative or
> the value within timeout is invalid\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case ENOMEM: // select was unable to allocate memory for
> internal tables
> -
> - _TRACE2( "NATIVE ERROR : select(ENOMEM): select was unable
> to allocate memory for internal tables\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisNoMemoryException",
> - AIS_ERR_NO_MEMORY_MSG );
> - break;
> - default:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - }
> - return JNI_FALSE; // EXIT POINT!!! return value is in fact ignored
> - }
> - if( _selectStatus == 1 ){
> -
> - _TRACE2( "NATIVE:
> Java_org_opensaf_ais_clm_ClmHandleImpl_checkSelectionObject() returning
> true\n" );
> -
> - return JNI_TRUE;
> - }
> - else{
> -
> - _TRACE2( "NATIVE:
> Java_org_opensaf_ais_clm_ClmHandleImpl_checkSelectionObject() returning
> false\n" );
> -
> - return JNI_FALSE;
> - }
> -}
> -*/
> -
> -
> -/**************************************************************************
> * FUNCTION: Java_org_opensaf_ais_clm_ClmHandleImpl_invokeSaClmDispatch
> * TYPE: native method
> * Class: ais_clm_ClmHandle
> @@ -821,8 +704,8 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> SaAisErrorT _saStatus;
> SaSelectionObjectT _saSelectionObject;
> // linux
> - fd_set _readFDs;
> - int _selectStatus;
> + struct pollfd _readFDs;
> + unsigned _pollStatus;
>
> // BODY
>
> @@ -843,71 +726,16 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> _TRACE2(" NATIVE: _saSelectionObject %d\n", _saSelectionObject );
>
> // wait until there is a pending callback
> - // call select(2)
> - FD_ZERO( &_readFDs );
> - FD_SET( _saSelectionObject, &_readFDs );
> - _selectStatus = select( ( _saSelectionObject + 1 ),
> - &_readFDs,
> - NULL,
> - NULL,
> - NULL );
> + // call osaf_poll()
> + _readFDs.fd = _saSelectionObject;
> + _readFDs.events = POLLIN;
> + _pollStatus = osaf_poll(&_readFDs, 1, -1);
>
> - _TRACE2( "NATIVE: select(...) has returned with %d...\n", _selectStatus
> );
> + _TRACE2( "NATIVE: osaf_poll(...) has returned with %u...\n", _pollStatus
> );
>
> // error handling
> - if( _selectStatus == -1 ){
> - switch( errno ){
> - case EBADF: // invalid file descriptor
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EBADF): invalid file
> descriptor\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINTR: // non blocked signal caught
> -
> - _TRACE2( "NATIVE ERROR : select(EINTR): non blocked signal
> caught\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINVAL: // n is negative or the value within timeout is
> invalid
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EINVAL): n is negative or
> the value within timeout is invalid\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case ENOMEM: // select was unable to allocate memory for
> internal tables
> -
> - _TRACE2( "NATIVE ERROR : select(ENOMEM): select was unable
> to allocate memory for internal tables\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisNoMemoryException",
> - AIS_ERR_NO_MEMORY_MSG );
> - break;
> - default:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - }
> - return; // EXIT POINT!!!
> - }
> - if( _selectStatus != 1 ){
> -
> - _TRACE2( "NATIVE ERROR : unexpected select return value!\n"
> );
> + if (_pollStatus != 1) {
> + _TRACE2( "NATIVE ERROR : unexpected osaf_poll return
> value!\n" );
>
> JNU_throwNewByName( jniEnv,
> "org/saforum/ais/AisLibraryException",
> diff --git a/java/ais_api_impl_native/j_ais_libHandle.c
> b/java/ais_api_impl_native/j_ais_libHandle.c
> --- a/java/ais_api_impl_native/j_ais_libHandle.c
> +++ b/java/ais_api_impl_native/j_ais_libHandle.c
> @@ -29,11 +29,12 @@
> #include <stdlib.h>
> #include "j_utilsPrint.h"
> #include <errno.h>
> -#include <sys/select.h>
> #include <jni.h>
> #include "j_utils.h"
> #include "j_ais.h"
> #include "jni_ais.h"
> +#include "osaf_poll.h"
> +#include "osaf_time.h"
>
> /**************************************************************************
> * Constants
> @@ -76,7 +77,7 @@ static jboolean JNU_Handle_initIDs_FromC
> static jint JNU_invokeSelect(
> JNIEnv* jniEnv,
> jobjectArray libraryHandleArray,
> - struct timeval* lxTimeout_Ptr );
> + struct timespec* lxTimeout_Ptr );
>
> /**************************************************************************
> * Function definitions
> @@ -176,9 +177,9 @@ JNIEXPORT jboolean JNICALL Java_org_open
> // ais
> SaSelectionObjectT _saSelectionObject;
> // linux
> - fd_set _readFDs;
> - struct timeval _lxTimeout;
> - int _selectStatus;
> + struct pollfd _readFDs;
> + struct timespec _lxTimeout;
> + unsigned _pollStatus;
>
> // BODY
> assert( thisLibraryHandle != NULL );
> @@ -190,74 +191,22 @@ JNIEXPORT jboolean JNICALL Java_org_open
>
> thisLibraryHandle,
>
> FID_selectionObject );
>
> - // call select(2)
> - FD_ZERO( &_readFDs );
> - FD_SET( _saSelectionObject, &_readFDs );
> - U_convertTimeout( &_lxTimeout, timeout );
> + // call osaf_ppoll()
> + _readFDs.fd = _saSelectionObject;
> + _readFDs.events = POLLIN;
> + osaf_nanos_to_timespec(timeout >= 0 ? timeout : 0, &_lxTimeout);
>
> - _TRACE2( "NATIVE: timout is { %ld seconds, %ld microseconds }\n",
> _lxTimeout.tv_sec, _lxTimeout.tv_usec );
> + _TRACE2( "NATIVE: timout is { %ld seconds, %ld nanoseconds }\n",
> _lxTimeout.tv_sec, _lxTimeout.tv_nsec );
>
> - _selectStatus = select( (_saSelectionObject + 1 ),
> - &_readFDs,
> - NULL,
> - NULL,
> - &_lxTimeout );
> + _pollStatus = osaf_ppoll(&_readFDs,
> + 1,
> + &_lxTimeout,
> + NULL);
>
> - _TRACE2( "NATIVE: select(...) has returned with %d...\n", _selectStatus
> );
> + _TRACE2( "NATIVE: osaf_ppoll(...) has returned with %u...\n",
> _pollStatus );
>
>
> - // error handling
> - if( _selectStatus == -1 ){
> - switch( errno ){
> - case EBADF: // invalid file descriptor
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EBADF): invalid file
> descriptor\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINTR: // non blocked signal caught
> -
> - _TRACE2( "NATIVE ERROR : select(EINTR): non blocked signal
> caught\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINVAL: // n is negative or the value within timeout is
> invalid
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EINVAL): n is negative or
> the value within timeout is invalid\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case ENOMEM: // select was unable to allocate memory for
> internal tables
> -
> - _TRACE2( "NATIVE ERROR : select(ENOMEM): select was unable
> to allocate memory for internal tables\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisNoMemoryException",
> - AIS_ERR_NO_MEMORY_MSG );
> - break;
> - default:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - }
> - return JNI_FALSE; // EXIT POINT!!! return value is in fact ignored
> - }
> - if( _selectStatus == 1 ){
> + if (_pollStatus == 1) {
>
> _TRACE2( "NATIVE:
> Java_org_opensaf_ais_HandleImpl_checkSelectionObject() returning true\n" );
>
> @@ -317,7 +266,7 @@ JNIEXPORT jint JNICALL Java_org_opensaf_
> // VARIABLES
> // ais
> // linux
> - struct timeval _lxTimeout;
> + struct timespec _lxTimeout;
>
> // BODY
>
> @@ -327,7 +276,7 @@ JNIEXPORT jint JNICALL Java_org_opensaf_
> _TRACE2( "NATIVE: Executing
> Java_org_opensaf_ais_HandleImpl_s_1invokeSelect___3JJ(...)\n" );
>
> // convert timeout
> - U_convertTimeout( &_lxTimeout, timeout );
> + osaf_nanos_to_timespec(timeout >= 0 ? timeout : 0, &_lxTimeout);
>
> // invoke select
> return JNU_invokeSelect( jniEnv,
> @@ -348,7 +297,7 @@ JNIEXPORT jint JNICALL Java_org_opensaf_
> static jint JNU_invokeSelect(
> JNIEnv* jniEnv,
> jlongArray selectionObjectArray,
> - struct timeval* lxTimeoutPtr )
> + struct timespec* lxTimeoutPtr )
> {
> // VARIABLES
> // JNI
> @@ -356,16 +305,13 @@ static jint JNU_invokeSelect(
> unsigned int _idx;
> // ais
> SaSelectionObjectT _saSelectionObjectArray[J_AIS_LIBHANDLE_SELECT_MAX];
> - SaSelectionObjectT _saSelectionObjectMax;
> // linux
> - fd_set _readFDs;
> - int _selectStatus;
> + struct pollfd* _readFDs;
> + unsigned _pollStatus;
>
> // BODY
> _TRACE2( "NATIVE: Executing JNU_invokeSelect(...)\n" );
>
> - FD_ZERO( &_readFDs );
> - _saSelectionObjectMax = 0;
> // copy native selection objects from the Java array to a native array
> _len = (*jniEnv)->GetArrayLength( jniEnv, selectionObjectArray );
>
> @@ -388,94 +334,47 @@ static jint JNU_invokeSelect(
> (jsize) 0,
> _len,
> (jlong*) _saSelectionObjectArray );
> - // call select(2)
> + // call osaf_ppoll()
> + _readFDs = malloc(_len * sizeof(struct pollfd));
> + if (_readFDs == NULL) {
> + _TRACE2( "NATIVE ERROR : unable to allocate memory for osaf_ppoll()\n"
> );
> + JNU_throwNewByName(jniEnv,
> + "org/saforum/ais/AisNoMemoryException",
> + AIS_ERR_NO_MEMORY_MSG);
> + return JNI_FALSE; // EXIT POINT!!! return value is in fact ignored
> + }
> +
> for( _idx = 0; _idx < _len; _idx++ ){
> // get selection object
>
> - _TRACE2( "NATIVE: %d. selection object is: %lu\n", _idx, (unsigned
> long) _saSelectionObjectArray[_idx] );
> + _TRACE2( "NATIVE: %u. selection object is: %lu\n", _idx, (unsigned
> long) _saSelectionObjectArray[_idx] );
>
> - FD_SET( _saSelectionObjectArray[_idx], &_readFDs );
> - if( _saSelectionObjectArray[_idx] > _saSelectionObjectMax ){
> - _saSelectionObjectMax = _saSelectionObjectArray[_idx];
> - }
> + _readFDs[_idx].fd = _saSelectionObjectArray[_idx];
> + _readFDs[_idx].events = POLLIN;
> }
>
> - _TRACE2( "NATIVE: nfds is: %lu\n", ( ( (unsigned long)
> _saSelectionObjectMax ) + 1 ) );
> - _TRACE2( "NATIVE: timout is { %ld seconds, %ld microseconds }\n",
> lxTimeoutPtr->tv_sec, lxTimeoutPtr->tv_usec );
> + _TRACE2( "NATIVE: nfds is: %lu\n", (unsigned long) _len);
> + _TRACE2( "NATIVE: timout is { %ld seconds, %ld nanoseconds }\n",
> lxTimeoutPtr->tv_sec, lxTimeoutPtr->tv_nsec );
>
> - _selectStatus = select( (_saSelectionObjectMax + 1 ),
> - &_readFDs,
> - NULL,
> - NULL,
> - lxTimeoutPtr );
> + _pollStatus = osaf_ppoll(_readFDs, _len, lxTimeoutPtr, NULL);
>
> - _TRACE2( "NATIVE: select(...) has returned with %d...\n", _selectStatus
> );
> + _TRACE2( "NATIVE: osaf_ppoll(...) has returned with %u...\n",
> _pollStatus );
>
> - // error handling
> - if( _selectStatus == -1 ){
> - switch( errno ){
> - case EBADF: // invalid file descriptor
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EBADF): invalid file
> descriptor\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINTR: // non blocked signal caught
> -
> - _TRACE2( "NATIVE ERROR : select(EINTR): non blocked signal
> caught\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case EINVAL: // n is negative or the value within timeout is
> invalid
> -
> - // this should not happen here!
> - _TRACE2( "NATIVE ERROR : select(EINVAL): n is negative or
> the value within timeout is invalid\n" );
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - case ENOMEM: // select was unable to allocate memory for
> internal tables
> -
> - _TRACE2( "NATIVE ERROR : select(ENOMEM): select was unable
> to allocate memory for internal tables\n" );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisNoMemoryException",
> - AIS_ERR_NO_MEMORY_MSG );
> - break;
> - default:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - break;
> - }
> - return JNI_FALSE; // EXIT POINT!!! return value is in fact ignored
> - }
> - if( _selectStatus == 0 ){
> + if (_pollStatus == 0) {
>
> _TRACE2( "NATIVE: JNU_invokeSelect() returning 0\n" );
>
> + free(_readFDs);
> return 0; // EXIT POINT!!!
> }
> - if( _selectStatus > 0 ){
> +
> // mark unselected selection objects
> for( _idx = 0; _idx < _len; _idx++ ){
> - if( ! FD_ISSET( _saSelectionObjectArray[_idx], &_readFDs ) ){
> + if (_readFDs[_idx].revents == 0) {
> _saSelectionObjectArray[_idx] = 0xFFFFFFFFFFFFFFFFULL;
> }
>
> - _TRACE2( "NATIVE: %d. selection object is: %lu\n", _idx, (unsigned
> long) _saSelectionObjectArray[_idx] );
> + _TRACE2( "NATIVE: %u. selection object is: %lu\n", _idx, (unsigned
> long) _saSelectionObjectArray[_idx] );
>
> }
> (*jniEnv)->SetLongArrayRegion( jniEnv,
> @@ -484,21 +383,10 @@ static jint JNU_invokeSelect(
> _len,
> (jlong*) _saSelectionObjectArray );
>
> + _TRACE2( "NATIVE: JNU_invokeSelect() returning %u\n", _pollStatus );
>
> - _TRACE2( "NATIVE: JNU_invokeSelect() returning %d\n", _selectStatus
> );
> -
> - return _selectStatus; // EXIT POINT!!!
> - }
> - // All legal casesof select return calues covered by now, so:
> - // this should not happen here!
> -
> - assert( JNI_FALSE );
> -
> - JNU_throwNewByName( jniEnv,
> - "org/saforum/ais/AisLibraryException",
> - AIS_ERR_LIBRARY_MSG );
> - return 0;
> -
> + free(_readFDs);
> + return _pollStatus; // EXIT POINT!!!
> }
>
>
> diff --git a/java/ais_api_impl_native/j_ais_socketUtil.c
> b/java/ais_api_impl_native/j_ais_socketUtil.c
> --- a/java/ais_api_impl_native/j_ais_socketUtil.c
> +++ b/java/ais_api_impl_native/j_ais_socketUtil.c
> @@ -15,15 +15,16 @@
> */
>
> #include <stdio.h>
> +#include <stdlib.h>
> #include <unistd.h>
> #include <jni.h>
> #include <sys/socket.h>
> #include <sys/types.h>
> -#include <sys/select.h>
> #include <assert.h>
> #include "j_utilsPrint.h"
> #include "j_utils.h"
> #include "jni_ais.h"
> +#include "osaf_poll.h"
>
> /**
> * Opens a socket pair and returns the two descriptors.
> @@ -118,11 +119,11 @@ JNIEXPORT void JNICALL Java_org_opensaf_
> }
>
> /**
> - * Calls select() on the given socket descriptors and returns an array of
> the modified ones.
> + * Calls poll() on the given socket descriptors and returns an array of the
> modified ones.
> * In case of any error, it returns NULL.
> - * @param sockets The socket descriptors on whom we call select().
> + * @param sockets The socket descriptors on whom we call poll().
> * @param socketSize Size of the array of socket descriptors.
> - * @return An array of sockets returned by select().
> + * @return An array of sockets returned by poll().
> */
> JNIEXPORT jintArray JNICALL
> Java_org_opensaf_ais_SelectionObjectMediator_00024Worker_doSelect(
> JNIEnv *jniEnv, jobject object, jintArray sockets, jint
> socketSize) {
> @@ -132,38 +133,31 @@ JNIEXPORT jintArray JNICALL Java_org_ope
> _TRACE2("NATIVE: Executing
> Java_org_opensaf_ais_SelectionObjectMediator_00024Worker_doSelect\n");
>
>
> - int* fds = (*jniEnv)->GetIntArrayElements(jniEnv, sockets, 0);
> + struct pollfd* rfds = malloc(socketSize * sizeof(struct pollfd));
> + if (rfds == NULL) return NULL;
>
> - fd_set rfds;
> - fd_set rfds_copy;
> - FD_ZERO(&rfds);
> + int* fds = (*jniEnv)->GetIntArrayElements(jniEnv, sockets, 0);
> int i;
> - int maxfd = 0;
> for (i = 0; i < socketSize; i++) {
> - FD_SET(fds[i], &rfds);
> - if (maxfd < fds[i]) maxfd = fds[i];
> + rfds[i].fd = fds[i];
> + rfds[i].events = POLLIN;
> }
>
> - rfds_copy = rfds;
> -
> - int numFds = select(maxfd + 1, &rfds, NULL, NULL, NULL);
> - if (numFds < 1) {
> - perror("select()");
> - fflush(stderr);
> - } else {
> + unsigned numFds = osaf_poll(rfds, socketSize, -1);
> + if (numFds > 0) {
> selectedSockets = (*jniEnv)->NewIntArray(jniEnv, numFds);
> - int a = 0;
> - for (i = 0; i < socketSize; i++) {
> - if (FD_ISSET(fds[i], &rfds)) {
> + unsigned a = 0;
> + for (i = 0; i < socketSize && a < numFds; i++) {
> + if (rfds[i].revents != 0) {
> (*jniEnv)->SetIntArrayRegion(jniEnv,
> selectedSockets, a, 1, &fds[i]);
> a++;
> }
> }
> }
>
> -
> + free(rfds);
> _TRACE2("NATIVE: Finishing
> Java_org_opensaf_ais_SelectionObjectMediator_00024Worker_doSelect\n");
>
>
> - return selectedSockets;
> + return selectedSockets;
> }
> diff --git a/java/ais_api_impl_native/j_utils.c
> b/java/ais_api_impl_native/j_utils.c
> --- a/java/ais_api_impl_native/j_utils.c
> +++ b/java/ais_api_impl_native/j_utils.c
> @@ -29,7 +29,6 @@
> #include <stdio.h>
> #include <assert.h>
> #include <string.h>
> -#include <sys/select.h>
> #include <jni.h>
> #include <saAis.h>
> #include <saClm.h>
> @@ -788,39 +787,3 @@ jclass JNU_GetGlobalClassRef( JNIEnv* jn
> return _globalCls;
> }
>
> -/**************************************************************************
> - * FUNCTION: U_convertTimeout
> - * TYPE: internal function
> - * OVERVIEW: converts the timeout value specified in nanoseconds to
> - * POSIX struct timeval.
> - * INTERFACE:
> - * parameters: TODO
> - * returns: none
> - * NOTE:
> - *************************************************************************/
> -void U_convertTimeout(
> - struct timeval* to_timeout,
> - const jlong from_timeout )
> -{
> - // BODY
> -#ifndef NDEBUG
> - // _TRACE2( "NATIVE: Executing U_convertTimeout(..., %ld )\n", (long)
> from_timeout );
> -#endif // NDEBUG
> - // TODO types checking! negative values
> - if( from_timeout < SA_TIME_ONE_MICROSECOND ){
> - // no timout
> - to_timeout->tv_sec = 0;
> - to_timeout->tv_usec = 0;
> - return; // EXIT POINT!!!
> - }
> - if( from_timeout < SA_TIME_ONE_SECOND ){
> - // subsecond timout
> - to_timeout->tv_sec = 0;
> - to_timeout->tv_usec = from_timeout / SA_TIME_ONE_MICROSECOND;
> - return; // EXIT POINT!!!
> - }
> - to_timeout->tv_sec = from_timeout / SA_TIME_ONE_SECOND;
> - to_timeout->tv_usec = ( from_timeout % SA_TIME_ONE_SECOND ) /
> SA_TIME_ONE_MICROSECOND;
> - return;
> -}
> -
> diff --git a/java/ais_api_impl_native/j_utils.h
> b/java/ais_api_impl_native/j_utils.h
> --- a/java/ais_api_impl_native/j_utils.h
> +++ b/java/ais_api_impl_native/j_utils.h
> @@ -22,7 +22,6 @@
> *************************************************************************/
>
> #include <jni.h>
> -#include <sys/select.h>
> #include <saAis.h>
> #include <saClm.h>
> #include <saCkpt.h>
> @@ -93,9 +92,6 @@ extern jint JNU_GetEnvForCallback(
> jclass JNU_GetGlobalClassRef(
> JNIEnv* jniEnv,
> const char* className );
> -extern void U_convertTimeout(
> - struct timeval* to_timeout,
> - const jlong from_timeout );
>
>
> #endif //J_UTILS_H_
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel