]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcov-io.c (gcov_open): Use open + fdopen instead of fopen.
authorJakub Jelinek <jakub@redhat.com>
Sun, 22 Feb 2004 23:18:53 +0000 (00:18 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 22 Feb 2004 23:18:53 +0000 (00:18 +0100)
* gcov-io.c (gcov_open) [GCOV_LOCKED]: Use open + fdopen instead of
fopen.
* libgcov.c: Include sys/stat.h.
* config/rs6000/linux.h (TARGET_HAS_F_SETLKW): Define.
* config/rs6000/linux64.h (TARGET_HAS_F_SETLKW): Define.
* config/sparc/linux.h (TARGET_HAS_F_SETLKW): Define.
* config/sparc/linux64.h (TARGET_HAS_F_SETLKW): Define.

From-SVN: r78281

gcc/ChangeLog
gcc/config/rs6000/linux.h
gcc/config/rs6000/linux64.h
gcc/config/sparc/linux.h
gcc/config/sparc/linux64.h
gcc/gcov-io.c
gcc/libgcov.c

index e0d0323ff4e546c05ee0062fb37c65019f851215..9e18f300bdecfd40e0ee2ad6583d5adb730b5b21 100644 (file)
@@ -1,3 +1,13 @@
+2004-02-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcov-io.c (gcov_open) [GCOV_LOCKED]: Use open + fdopen instead of
+       fopen.
+       * libgcov.c: Include sys/stat.h.
+       * config/rs6000/linux.h (TARGET_HAS_F_SETLKW): Define.
+       * config/rs6000/linux64.h (TARGET_HAS_F_SETLKW): Define.
+       * config/sparc/linux.h (TARGET_HAS_F_SETLKW): Define.
+       * config/sparc/linux64.h (TARGET_HAS_F_SETLKW): Define.
+
 2004-02-22  Kazu Hirata  <kazu@cs.umass.edu>
 
        * reorg.c: Remove comments about dead ports.
index 1ef484e629dde04cc891d11645ae579de407d9dd..8fe3e3e87edbeb3765c592097e91127f97dd8ca4 100644 (file)
@@ -91,6 +91,8 @@
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
+#define TARGET_HAS_F_SETLKW
+
 /* Do code reading to identify a signal frame, and set the frame
    state data appropriately.  See unwind-dw2.c for the structs.  */
 
index 44f7cb72a558d4cbabd166de7de6c46cbf23b98e..ee381858223b4b2892cf66877070832b01a3e530 100644 (file)
@@ -543,6 +543,8 @@ while (0)
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
+#define TARGET_HAS_F_SETLKW
+
 #define LINK_GCC_C_SEQUENCE_SPEC \
   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
 
index afec8aab37f768feb54c9dd0528ab722cdfbe2aa..187dff6eee8644d7a2d419a394a553ed36696647 100644 (file)
@@ -247,6 +247,8 @@ do {                                                                        \
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
+#define TARGET_HAS_F_SETLKW
+
 #undef LINK_GCC_C_SEQUENCE_SPEC
 #define LINK_GCC_C_SEQUENCE_SPEC \
   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
index 9bfb9462c1ec905348d93c79f49ea4cb41776a15..5cb84e5f916989eee8446efd664e99dc248ed6dc 100644 (file)
@@ -325,6 +325,8 @@ do {                                                                        \
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
+#define TARGET_HAS_F_SETLKW
+
 #undef LINK_GCC_C_SEQUENCE_SPEC
 #define LINK_GCC_C_SEQUENCE_SPEC \
   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
index 99731f79939edb2c1d048db3b58c7d17740b44f6..0349fb821b21e3061d9b36b721e1434bbd6d5de8 100644 (file)
@@ -65,6 +65,7 @@ gcov_open (const char *name, int mode)
 #endif
 #if GCOV_LOCKED
   struct flock s_flock;
+  int fd;
 
   s_flock.l_type = F_WRLCK;
   s_flock.l_whence = SEEK_SET;
@@ -82,6 +83,44 @@ gcov_open (const char *name, int mode)
 #if !IN_LIBGCOV
   gcov_var.endian = 0;
 #endif
+#if GCOV_LOCKED
+  if (mode > 0)
+    fd = open (name, O_RDWR);
+  else
+    fd = open (name, O_RDWR | O_CREAT, 0666);
+  if (fd < 0)
+    return 0;
+
+  while (fcntl (fd, F_SETLKW, &s_flock) && errno == EINTR)
+    continue;
+
+  gcov_var.file = fdopen (fd, "r+b");
+  if (!gcov_var.file)
+    {
+      close (fd);
+      return 0;
+    }
+
+  if (mode > 0)
+    gcov_var.mode = 1;
+  else if (mode == 0)
+    {
+      struct stat st;
+
+      if (fstat (fd, &st) < 0)
+       {
+         fclose (gcov_var.file);
+         gcov_var.file = 0;
+         return 0;
+       }
+      if (st.st_size != 0)
+       gcov_var.mode = 1;
+      else
+       gcov_var.mode = mode * 2 + 1;
+    }
+  else
+    gcov_var.mode = mode * 2 + 1;
+#else
   if (mode >= 0)
     gcov_var.file = fopen (name, "r+b");
   if (gcov_var.file)
@@ -94,15 +133,10 @@ gcov_open (const char *name, int mode)
     }
   if (!gcov_var.file)
     return 0;
-  
-  setbuf (gcov_var.file, (char *)0);
-  
-#if GCOV_LOCKED
-  while (fcntl (fileno (gcov_var.file), F_SETLKW, &s_flock)
-        && errno == EINTR)
-    continue;
 #endif
 
+  setbuf (gcov_var.file, (char *)0);
+  
   return 1;
 }
 
index ffc3d54752c5006ee5257bb5fa6130d01c5a21a4..d5c97a2854d67e4dc0e0691aaf9d3cef6661820c 100644 (file)
@@ -79,6 +79,7 @@ void __gcov_merge_delta (gcov_type *counters  __attribute__ ((unused)),
 #if GCOV_LOCKED
 #include <fcntl.h>
 #include <errno.h>
+#include <sys/stat.h>
 #endif
 
 #ifdef L_gcov