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

Alan Bateman Alan.Bateman at oracle.com
Fri May 4 00:59:09 PDT 2012


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/%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);
      }



More information about the nio-dev mailing list