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

Reply via email to