Just a note on this part (I havent looked at the code):

On AIX, the constants used for the polling events (i.e. POLLIN, POLLOUT, ...) 
are defined to different values than on other operating systems. The problem is 
however, that these constants are hardcoded as public final static members of 
various, shared Java classes.

Sounds like this should be handled the same way that the other "system constants" are handled - you can either store a platform file in the repo (for cross-compiling) or you generate the class containing the constants at build time.

David

On 14/01/2014 6:40 PM, Volker Simonis wrote:
Hi,

could you please review the following changes for the ppc-aix-port
stage/stage-9 repositories (the changes are planned for integration into
ppc-aix-port/stage-9 and subsequent backporting to ppc-aix-port/stage):

http://cr.openjdk.java.net/~simonis/webrevs/8031581/

I've build and smoke tested without any problems on Linux/x86_64 and
PPC64, Windows/x86_64, MacOSX, Solaris/SPARC64 and AIX7PPC64.

With these changes (and together with the changes from "8028537: PPC64:
Updated jdk/test scripts to understand the AIX os and environment" and
"8031134 : PPC64: implement printing on AIX") our port passes all but
the following 7 jtreg regression tests on AIX (compared to the
Linux/x86_64 baseline from
www.java.net/download/jdk8/testresults/testresults.html
<http://www.java.net/download/jdk8/testresults/testresults.html>‎):

java/net/Inet6Address/B6558853.java
java/nio/channels/AsynchronousChannelGroup/Basic.java (sporadically)
java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java
java/nio/channels/AsynchronousChannelGroup/Unbounded.java (sporadically)
java/nio/channels/Selector/RacyDeregister.java
sun/security/krb5/auto/Unreachable.java (only on IPv6)

Thank you and best regards,
Volker


Following a detailed description of the various changes:


        src/share/native/java/util/zip/zip_util.c
        src/share/native/sun/management/DiagnosticCommandImpl.c

  * According to ISO C it is perfectly legal for malloc to return zero
    if called with a zero argument. Fix various places where malloc can
    potentially correctly return zero because it was called with a zero
    argument.
  * Also fixed |DiagnosticCommandImpl.c| to include |stdlib.h|. This
    only fixes a compiler warning on Linux, but on AIX it prevents a VM
    crash later on because the return value of |malloc()| will be casted
    to |int| which is especially bad if that pointer was bigger than
    32-bit.


        make/CompileJavaClasses.gmk

  * Also use |PollingWatchService| on AIX.


        make/lib/NioLibraries.gmk
        src/aix/native/sun/nio/ch/AixNativeThread.c

  * Put the implementation for the native methods of |NativeThread| into
    |AixNativeThread.c| on AIX.


        src/solaris/native/sun/nio/ch/PollArrayWrapper.c
        src/solaris/native/sun/nio/ch/Net.c
        src/aix/classes/sun/nio/ch/AixPollPort.java
        src/aix/native/sun/nio/ch/AixPollPort.c
        src/aix/native/java/net/aix_close.c

  * On AIX, the constants used for the polling events (i.e. |POLLIN|,
    |POLLOUT|, ...) are defined to different values than on other
    operating systems. The problem is however, that these constants are
    hardcoded as public final static members of various, shared Java
    classes. We therefore have to map them from Java to native every
    time before calling one of the native poll functions and back to
    Java after the call on AIX in order to get the right semantics.


        src/share/classes/java/nio/file/CopyMoveHelper.java

  * As discussed on the core-libs mailing list (see
    
http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-December/024119.html)
    it is not necessary to call |Files.getFileAttributeView()| with any
    |linkOptions| because at that place we've already checked that the
    target file can not be a symbolic link. This change makes the
    implementation more robust on platforms which support symbolic links
    but do not support the |O_NOFOLLOW| flag to the |open| system call.
    It also makes the JDK pass the |demo/zipfs/basic.sh| test on AIX.


        src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java

  * Support "compound text" on AIX in the same way like on other Unix
    platforms.


        
src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider

  * Define the correct attach provider for AIX.


        src/solaris/native/java/net/net_util_md.h
        src/solaris/native/sun/nio/ch/FileDispatcherImpl.c
        src/solaris/native/sun/nio/ch/ServerSocketChannelImpl.c

  * AIX needs a workaround for I/O cancellation (see:
    
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/close.htm).
    "..The |close()| subroutine is blocked until all subroutines which
    use the file descriptor return to usr space. For example, when a
    thread is calling close and another thread is calling select with
    the same file descriptor, the close subroutine does not return until
    the select call returns...". To fix this problem, we have to use the
    various |NET_| wrappers which are declared in |net_util_md.h| and
    defined in |aix_close.c| and we also need some additional wrappers
    for |fcntl()|, |read()| and |write()| on AIX.
    While the current solution isn't really nice because it introduces
    some more AIX-specifc sections in shared code, I think it is the
    best way to go for JDK 8 because it imposes the smallest possible
    changes and risks for the existing platforms. I'm ready to change
    the code to unconditionally use the wrappers for all platforms and
    implement the wrappers empty on platforms which don't need any
    wrapping. I think it would also be nice to clean up the names (e.g.
    |NET_Read()| is currently a wrapper for |recv()| and the |NET_|
    prefix is probably not appropriate any more so maybe change it to
    something like |IO_|). But again, I'll prefer to keep that as a
    follow up change for JDK9.
  * Calling |fsync()| on a "read-only" file descriptor on AIX will
    result in an error (i.e. "EBADF: The FileDescriptor parameter is not
    a valid file descriptor open for writing."). To prevent this error
    we have to query if the corresponding file descriptor is writeable.
    Notice that at that point we can not access the |writable| attribute
    of the corresponding file channel so we have to use |fcntl()|.


        src/solaris/classes/java/lang/UNIXProcess.java.aix

  * On AIX the implementation is especially tricky, because the
    |close()| system call will block if another thread is at the same
    time blocked in a file operation (e.g. 'read()') on the same file
    descriptor. We therefore combine the AIX |ProcessPipeInputStream|
    implemenatation with the |DeferredCloseInputStream| approach used on
    Solaris (see |UNIXProcess.java.solaris|). This means that every
    potentially blocking operation on the file descriptor increments a
    counter before it is executed and decrements it once it finishes.
    The 'close()' operation will only be executed if there are no
    pending operations. Otherwise it is deferred after the last pending
    operation has finished.


        src/share/transport/socket/socketTransport.c

  * On AIX we have to call |shutdown()| on a socket descriptor before
    closing it, otherwise the |close()| call may be blocked. This is the
    same problem as described before. Unfortunately the JDI framework
    doesn't use the same IO wrappers like other class library components
    so we can not easily use the |NET_| abstractions from |aix_close.c|
    here.
  * Without this small change all JDI regression tests will fail on AIX
    because of the way how the tests act as a "debugger" which launches
    another VM (the "debugge") which connects itself back to the
    debugger. In this scenario the "debugge" can not shut down itself
    because one thread will always be blocked in the |close()| call on
    one of the communication sockets.


        src/solaris/native/java/net/NetworkInterface.c

  * Set the scope identifier for IPv6 addresses on AIX.


        src/solaris/native/java/net/net_util_md.c

  * It turns out that we do not always have to replace |SO_REUSEADDR| on
    AIX by |SO_REUSEPORT|. Instead we can simply use the same approach
    like BSD and only use |SO_REUSEPORT| additionally, if several
    datagram sockets try to bind to the same port.
  * Also fixed a comment and removed unused local variables.
  * Fixed the obviously inverted assignment |newTime = prevTime;| which
    should read |prevTime = newTime;|. Otherwise |prevTime| will never
    change and the timeout will be potential reached too fast.


        src/solaris/native/sun/management/OperatingSystemImpl.c

  * AIX does not understand |/proc/self| so we have to query the real
    process ID to access the proc file system.


        src/solaris/native/sun/nio/ch/DatagramChannelImpl.c

  * On AIX, |connect()| may legally return |EAFNOSUPPORT| if called on a
    socket with the address family set to |AF_UNSPEC|.


Reply via email to