RFR: 8237830: support O_CLOEXEC in os::open on other OS than Linux

Baesken, Matthias matthias.baesken at sap.com
Wed Feb 12 08:31:38 UTC 2020


New webrev  :


http://cr.openjdk.java.net/~mbaesken/webrevs/8237830.3/

   * this time ,  only touching  os_aix.cpp  ( I leave os_bsd.cpp as it is , might

     make the discussion   more  simple )

   * Added handling of  failing O_CLOEXEC   ( O_CLOEXEC_is_known_to_work

     == -1  … case )

 Best regards, Matthias




From: Baesken, Matthias
Sent: Donnerstag, 6. Februar 2020 08:55
To: 'Thomas Stüfe' <thomas.stuefe at gmail.com>
Cc: David Holmes <david.holmes at oracle.com>; hotspot-dev at openjdk.java.net
Subject: RE: RFR: 8237830: support O_CLOEXEC in os::open on other OS than Linux

Hi Thomas , the coding was borrowed from linux, see :

https://hg.openjdk.java.net/jdk/jdk/file/7b57401deb0c/src/hotspot/os/linux/os_linux.cpp#l5616

I would be fine with  always calling fcntl (your suggestion 1) ,  do you think  it was done otherwise  back then   in os_linux because of performance issues ?
Probably os::open in os_linux  should be adjusted then  to the  new “always call fcntl” approach too, right ?


Best regards, Matthias



Hi Matthias:

+ // Validate that the use of the O_CLOEXEC flag on open above worked.

+  static sig_atomic_t O_CLOEXEC_is_known_to_work = 0;

+  if (!O_CLOEXEC_is_known_to_work) {

     int flags = ::fcntl(fd, F_GETFD);

-    if (flags != -1)

+    if (flags != -1) {

+      if ((flags & FD_CLOEXEC) != 0) {

+        O_CLOEXEC_is_known_to_work = 1;

+      } else {

       ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);

   }

-#endif

+    }

+  }

This is either too complicated or not complicated enough :)

if we know for a fact that open(..O_CLOEXEC) did work at least once, we never again check.
if we know for a fact that open(..O_CLOEXEC) failed to work, we recheck again and again. Do we expect it to suddenly start working? If yes, could it also suddenly start failing? Should we then not check always?

I propose the following change:

1) If open(..O_CLOEXEC) could sometimes fail and sometimes not, or we are just not sure, I would do the fcntl test every time. Or, even just always set the flag again with fcntl. So, just remove the O_CLOEXEC_is_known_to_work conditional variable.

Which would reduce the code to a one liner:

+ ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);

2) If you are sure that it either always works or fails, you need a conditional with three states: unknown, works, does not work. And only check if unknown.

I personally would prefer (1) because it is way simpler and fcntl is not such an expensive operation that we have to save time (also, how often do we open files anyway?).
----

Otherwise looks fine. This is a useful fix.


Cheers, Thomas







On Tue, Jan 28, 2020 at 12:32 PM Baesken, Matthias <matthias.baesken at sap.com<mailto:matthias.baesken at sap.com>> wrote:
New webrev :

http://cr.openjdk.java.net/~mbaesken/webrevs/8237830.1/

(one 'c' got lost somehow in the older webrev)

Best regards, Matthias


More information about the hotspot-dev mailing list