src/os/solaris/vm/perfMemory_solaris.cpp

Print this page
rev 5874 : Solaris Parfait Fixes

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -429,15 +429,17 @@
 
     for (size_t remaining = sizeof(psinfo_t); remaining > 0;) {
 
       RESTARTABLE(::read(fd, addr, remaining), result);
       if (result == OS_ERR) {
+        ::close(fd);
         THROW_MSG_0(vmSymbols::java_io_IOException(), "Read error");
-      }
+      } else {
       remaining-=result;
       addr+=result;
     }
+    }
 
     ::close(fd);
 
     // get the user name for the effective user id of the process
     char* user_name = get_user_name(psinfo.pr_euid);

@@ -904,13 +906,21 @@
   if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
   FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
   FREE_C_HEAP_ARRAY(char, filename, mtInternal);
 
   // open the shared memory file for the give vmid
-  fd = open_sharedmem_file(rfilename, file_flags, CHECK);
-  assert(fd != OS_ERR, "unexpected value");
+  fd = open_sharedmem_file(rfilename, file_flags, THREAD);
 
+  if (fd == OS_ERR) {
+    return;
+  }
+
+  if (HAS_PENDING_EXCEPTION) {
+    ::close(fd);
+    return;
+  }
+
   if (*sizep == 0) {
     size = sharedmem_filesize(fd, CHECK);
   } else {
     size = *sizep;
   }