Request for review: 7166048: remove the embedded epoll data structure

Sean Chou zhouyx at linux.vnet.ibm.com
Fri May 4 01:27:22 PDT 2012


Hi Alan,

   Thank you, I'll update the patch.

On Fri, May 4, 2012 at 3:59 PM, Alan Bateman <Alan.Bateman at oracle.com>wrote:

> On 04/05/2012 08:35, Sean Chou wrote:
>
>> Hi all,
>>
>>    I found the src/solaris/native/sun/nio/ch/**EPollArrayWrapper.c
>> embedded the epoll data structure epoll_data and epoll_event . It is
>> duplicated with the definition in sys/epoll.h . This redundancy would cause
>> failure if the underlying system has different epoll data structure (eg.
>> different alignment) .
>>
>>    I reported 7166048 for it and made a patch:
>> http://cr.openjdk.java.net/~**zhouyx/7166048/webrev.00/<http://cr.openjdk.java.net/~zhouyx/7166048/webrev.00/><
>> http://cr.openjdk.java.net/%**7Ezhouyx/7166048/webrev.00/<http://cr.openjdk.java.net/%7Ezhouyx/7166048/webrev.00/>>
>>  .
>>
>>
>>  As background, when the epoll Selector was added then the JDK had to be
> build on distributions that were still 2.4 based and didn't have epoll.h.
> We had meant to go back and clear this up in JDK7 but didn't get around to
> it. So thanks for taking this on now. I looked at your patch but it doesn't
> seem to be complete as it doesn't change the usages to call the epoll
> functions directly. Attached is the patch that I had for cleaning this up,
> it should still be current because this code has not changed. The only
> thing I notice is that it doesn't remove the include of dlfcn.h, that
> shouldn't be needed now.
>
> On the RFE that you submitted, I've moved this to the right place as:
>
> 7166048: (se) EPollArrayWrapper.c no longer needs to define epoll data
> structures
>
> -Alan.
>
>
>
> diff --git a/src/solaris/native/sun/nio/**ch/EPollArrayWrapper.c
> b/src/solaris/native/sun/nio/**ch/EPollArrayWrapper.c
> --- a/src/solaris/native/sun/nio/**ch/EPollArrayWrapper.c
> +++ b/src/solaris/native/sun/nio/**ch/EPollArrayWrapper.c
> @@ -34,55 +34,13 @@
>  #include <unistd.h>
>  #include <sys/resource.h>
>  #include <sys/time.h>
> -
> -#ifdef  __cplusplus
> -extern "C" {
> -#endif
> -
> -/* epoll_wait(2) man page */
> -
> -typedef union epoll_data {
> -    void *ptr;
> -    int fd;
> -    __uint32_t u32;
> -    __uint64_t u64;
> -} epoll_data_t;
> -
> -
> -/* x86-64 has same alignment as 32-bit */
> -#ifdef __x86_64__
> -#define EPOLL_PACKED __attribute__((packed))
> -#else
> -#define EPOLL_PACKED
> -#endif
> -
> -struct epoll_event {
> -    __uint32_t events;  /* Epoll events */
> -    epoll_data_t data;  /* User data variable */
> -} EPOLL_PACKED;
> -
> -#ifdef  __cplusplus
> -}
> -#endif
> +#include <sys/epoll.h>
>
>  #define RESTARTABLE(_cmd, _result) do { \
>   do { \
>     _result = _cmd; \
>   } while((_result == -1) && (errno == EINTR)); \
>  } while(0)
> -
> -/*
> - * epoll event notification is new in 2.6 kernel. As the offical build
> - * platform for the JDK is on a 2.4-based distribution then we must
> - * obtain the addresses of the epoll functions dynamically.
> - */
> -typedef int (*epoll_create_t)(int size);
> -typedef int (*epoll_ctl_t)   (int epfd, int op, int fd, struct
> epoll_event *event);
> -typedef int (*epoll_wait_t)  (int epfd, struct epoll_event *events, int
> maxevents, int timeout);
> -
> -static epoll_create_t epoll_create_func;
> -static epoll_ctl_t    epoll_ctl_func;
> -static epoll_wait_t   epoll_wait_func;
>
>  static int
>  iepoll(int epfd, struct epoll_event *events, int numfds, jlong timeout)
> @@ -96,7 +54,7 @@ iepoll(int epfd, struct epoll_event *eve
>     start = t.tv_sec * 1000 + t.tv_usec / 1000;
>
>     for (;;) {
> -        int res = (*epoll_wait_func)(epfd, events, numfds, timeout);
> +        int res = epoll_wait(epfd, events, numfds, timeout);
>         if (res < 0 && errno == EINTR) {
>             if (remaining >= 0) {
>                 gettimeofday(&t, NULL);
> @@ -117,14 +75,6 @@ JNIEXPORT void JNICALL
>  JNIEXPORT void JNICALL
>  Java_sun_nio_ch_**EPollArrayWrapper_init(JNIEnv *env, jclass this)
>  {
> -    epoll_create_func = (epoll_create_t) dlsym(RTLD_DEFAULT,
> "epoll_create");
> -    epoll_ctl_func    = (epoll_ctl_t)    dlsym(RTLD_DEFAULT, "epoll_ctl");
> -    epoll_wait_func   = (epoll_wait_t)   dlsym(RTLD_DEFAULT,
> "epoll_wait");
> -
> -    if ((epoll_create_func == NULL) || (epoll_ctl_func == NULL) ||
> -        (epoll_wait_func == NULL)) {
> -        JNU_ThrowInternalError(env, "unable to get address of epoll
> functions, pre-2.6 kernel?");
> -    }
>  }
>
>  JNIEXPORT jint JNICALL
> @@ -134,7 +84,7 @@ Java_sun_nio_ch_**EPollArrayWrapper_epollC
>      * epoll_create expects a size as a hint to the kernel about how to
>      * dimension internal structures. We can't predict the size in advance.
>      */
> -    int epfd = (*epoll_create_func)(256);
> +    int epfd = epoll_create(256);
>     if (epfd < 0) {
>        JNU_**ThrowIOExceptionWithLastError(**env, "epoll_create failed");
>     }
> @@ -173,7 +123,7 @@ Java_sun_nio_ch_**EPollArrayWrapper_epollC
>     event.events = events;
>     event.data.fd = fd;
>
> -    RESTARTABLE((*epoll_ctl_func)(**epfd, (int)opcode, (int)fd, &event),
> res);
> +    RESTARTABLE(epoll_ctl(epfd, (int)opcode, (int)fd, &event), res);
>
>     /*
>      * A channel may be registered with several Selectors. When each
> Selector
> @@ -199,7 +149,7 @@ Java_sun_nio_ch_**EPollArrayWrapper_epollW
>     int res;
>
>     if (timeout <= 0) {           /* Indefinite or no wait */
> -        RESTARTABLE((*epoll_wait_func)**(epfd, events, numfds, timeout),
> res);
> +        RESTARTABLE(epoll_wait(epfd, events, numfds, timeout), res);
>     } else {                      /* Bounded wait; bounded restarts */
>         res = iepoll(epfd, events, numfds, timeout);
>     }
>
>


-- 
Best Regards,
Sean Chou
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/nio-dev/attachments/20120504/7b222540/attachment.html 


More information about the nio-dev mailing list