[ewg] Re: [PATCH] libsdp: Add epoll support

Amir Vadai amirv at mellanox.co.il
Mon Dec 8 08:52:44 PST 2008


Thanks,


It looks fine - I will try to make it for the release.


- Amir.


Yossi Etigin wrote:

> Add epoll_create/epoll_ctl/epoll_wait/epoll_pwait support to libsdp.
> When creating epoll set, make it twice as large, for shadow fd data.
> When doing epoll_ctl, perform the same operation on shadow fd as well.
> (If the shadow fd is closed, it will be automatically removed from epoll
> set).
> When waiting (epoll_wait or epoll_pwait), no need to perform special
> work, since it returns user data and not file descriptors.
>
> Signed-off-by: Yossi Etigin <yosefe at voltaire.com>
>
> -- 
>
> diff --git a/src/port.c b/src/port.c
> index 340c2a5..9cf73a5 100644
> --- a/src/port.c
> +++ b/src/port.c
> @@ -49,6 +49,7 @@
> #include <fcntl.h>
> #include <signal.h>
> #include <sys/poll.h>
> +#include <sys/epoll.h>
> /*
>  * SDP specific includes
>  */
> @@ -175,6 +176,33 @@ typedef int (
>     unsigned long int nfds,     int timeout);
>
> +typedef int (
> +    *epoll_create_func_t ) (
> +    int size);
> +
> +typedef int (
> +    *epoll_ctl_func_t ) (
> +    int epfd,
> +    int op,
> +    int fd,
> +    struct epoll_event *event);
> +
> +typedef int (
> +    *epoll_wait_func_t ) (
> +    int epfd,
> +    struct epoll_event *events,
> +    int maxevents,
> +    int timeout);
> +
> +typedef int (
> +    *epoll_pwait_func_t ) (
> +    int epfd,
> +    struct epoll_event *events,
> +    int maxevents,
> +    int timeout,
> +    const sigset_t *sigmask);
> +
> +
> struct socket_lib_funcs
> {
>     ioctl_func_t ioctl;
> @@ -193,6 +221,10 @@ struct socket_lib_funcs
>     select_func_t select;
>     pselect_func_t pselect;
>     poll_func_t poll;
> +    epoll_create_func_t epoll_create;
> +    epoll_ctl_func_t epoll_ctl;
> +    epoll_wait_func_t epoll_wait;
> +    epoll_pwait_func_t epoll_pwait;
> };                                          /* socket_lib_funcs */
>
> static int simple_sdp_library;
> @@ -2506,6 +2538,137 @@ poll(
> }                                          /* poll */
>
> /*
> =========================================================================
> */
> +/*..epoll_create -- replacement socket
> call.                                 */
> +/*
> +   Need to make the size twice as large for shadow fds
> +*/
> +int
> +epoll_create(
> +    int size )
> +{
> +    int epfd;
> +
> +    if (init_status == 0) __sdp_init();
> +
> +    if ( NULL == _socket_funcs.epoll_create ) {
> +        __sdp_log( 9, "Error epoll_create: no implementation for
> epoll_create found\n" );
> +        return -1;
> +    }
> +
> +    __sdp_log( 2, "EPOLL_CREATE: <%s:%d>\n",
> program_invocation_short_name, size );
> +
> +    epfd = _socket_funcs.epoll_create( size * 2 );
> +
> +    __sdp_log( 2, "EPOLL_CREATE: <%s:%d> return %d\n",
> +              program_invocation_short_name, size, epfd );
> +    return epfd;
> +}                                          /* epoll_create */
> +
> +/*
> =========================================================================
> */
> +/*..epoll_ctl -- replacement socket
> call.                                   */
> +/*
> +   Need to add/delete/modify shadow fds as well
> +*/
> +int
> +epoll_ctl(
> +    int epfd,
> +    int op,
> +    int fd,
> +    struct epoll_event *event )
> +{
> +    int ret, shadow_fd, ret2;
> +
> +    if (init_status == 0) __sdp_init();
> +
> +    if ( NULL == _socket_funcs.epoll_ctl ) {
> +        __sdp_log( 9, "Error epoll_ctl: no implementation for
> epoll_ctl found\n" );
> +        return -1;
> +    }
> +
> +    __sdp_log( 2, "EPOLL_CTL: <%s:%d> op <%d:%d>\n",
> +              program_invocation_short_name, epfd, op, fd );
> +
> +    ret = _socket_funcs.epoll_ctl( epfd, op, fd, event );
> +
> +    shadow_fd = get_shadow_fd_by_fd(fd);
> +    if ( shadow_fd != -1 ) {
> +        ret2 = _socket_funcs.epoll_ctl( epfd, op, shadow_fd, event );
> +        if ( ret2 < 0 ) {
> +            __sdp_log( 9, "Error epoll_ctl <%s:%d:%d>",
> +                      program_invocation_short_name, fd, shadow_fd );
> +            return ret2;
> +        }
> +    }
> +
> +    __sdp_log( 2, "EPOLL_CTL: <%s:%d> return <%d>\n",
> +              program_invocation_short_name, epfd, ret );
> +    return ret;
> +}                                          /* epoll_ctl */
> +
> +/*
> =========================================================================
> */
> +/*..epoll_wait -- replacement socket
> call.                                   */
> +/*
> +   We don't care who generated the event because all we get is
> user-context
> +   values.
> +*/
> +int
> +epoll_wait(
> +    int epfd,
> +    struct epoll_event *events,
> +    int maxevents,
> +    int timeout )
> +{
> +    int ret;
> +
> +    if (init_status == 0) __sdp_init();
> +
> +    if ( NULL == _socket_funcs.epoll_wait ) {
> +        __sdp_log( 9, "Error epoll_wait: no implementation for
> epoll_wait found\n" );
> +        return -1;
> +    }
> +
> +    __sdp_log( 2, "EPOLL_WAIT: <%s:%d>\n",
> program_invocation_short_name, epfd );
> +
> +    ret = _socket_funcs.epoll_wait( epfd, events, maxevents, timeout );
> +
> +    __sdp_log( 2, "EPOLL_WAIT: <%s:%d> return <%d>\n",
> program_invocation_short_name,
> +              epfd, ret );
> +    return ret;
> +}                                          /* epoll_wait */
> +
> +/*
> =========================================================================
> */
> +/*..epoll_pwait -- replacement socket
> call.                                  */
> +/*
> +   We don't care who generated the event because all we get is
> user-context
> +   values.
> +*/
> +int
> +epoll_pwait(
> +    int epfd,
> +    struct epoll_event *events,
> +    int maxevents,
> +    int timeout,
> +    const sigset_t *sigmask )
> +{
> +    int ret;
> +
> +    if (init_status == 0) __sdp_init();
> +
> +    if ( NULL == _socket_funcs.epoll_pwait ) {
> +        __sdp_log( 9, "Error epoll_pwait: no implementation for
> epoll_pwait found\n" );
> +        return -1;
> +    }
> +
> +    __sdp_log( 2, "EPOLL_PWAIT: <%s:%d>\n",
> program_invocation_short_name, epfd );
> +
> +    ret = _socket_funcs.epoll_pwait( epfd, events, maxevents,
> timeout, sigmask );
> +
> +    __sdp_log( 2, "EPOLL_PWAIT: <%s:%d> return <%d>\n",
> program_invocation_short_name,
> +              epfd, ret );
> +    return ret;
> +}                                          /* epoll_pwait */
> +
> +/*
> =========================================================================
> */
>
> /*
> --------------------------------------------------------------------- */
> /*                                                                      
> */
> @@ -2640,6 +2803,26 @@ __sdp_init(
>         fprintf( stderr, "%s\n", error_str );
>     }
>
> +    _socket_funcs.epoll_create = dlsym( __libc_dl_handle,
> "epoll_create" );
> +    if ( NULL != ( error_str = dlerror(  ) ) ) {
> +        fprintf( stderr, "%s\n", error_str );
> +    }
> +
> +    _socket_funcs.epoll_ctl = dlsym( __libc_dl_handle, "epoll_ctl" );
> +    if ( NULL != ( error_str = dlerror(  ) ) ) {
> +        fprintf( stderr, "%s\n", error_str );
> +    }
> +
> +    _socket_funcs.epoll_wait = dlsym( __libc_dl_handle, "epoll_wait" );
> +    if ( NULL != ( error_str = dlerror(  ) ) ) {
> +        fprintf( stderr, "%s\n", error_str );
> +    }
> +
> +    _socket_funcs.epoll_pwait = dlsym( __libc_dl_handle,
> "epoll_pwait" );
> +    if ( NULL != ( error_str = dlerror(  ) ) ) {
> +        fprintf( stderr, "%s\n", error_str );
> +    }
> +
>     if ( getenv( "SIMPLE_LIBSDP" ) != NULL ) {
>         simple_sdp_library = 1;
>     }



More information about the ewg mailing list