File: libgcc2.c-patch

package info (click to toggle)
lsh-utils 2.1-14
  • links: PTS
  • area: main
  • in suites: sid
  • size: 12,900 kB
  • sloc: ansic: 51,017; sh: 5,683; lisp: 657; makefile: 381; perl: 63
file content (94 lines) | stat: -rw-r--r-- 2,348 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
This patch, relative to gcc-2.95.3, improves gcov support by properly
locking the output files that are written at process exit.

/Niels Mller <nisse@lysator.liu.se>

--- libgcc2.c.orig	Fri Jun 11 05:11:43 1999
+++ libgcc2.c	Thu Mar 22 20:48:39 2001
@@ -1459,6 +1459,10 @@
 #include "gcov-io.h"
 #include <string.h>
 
+/* For O_RDWR and O_CREAT */
+#include <fcntl.h>
+#include <errno.h>
+
 static struct bb *bb_head;
 
 /* Return the number of digits needed to print a value */
@@ -1478,6 +1482,23 @@
   return ret;
 }
 
+/* Opens a file, locking it for exclusive access. Used for .da files
+ * below. 
+ */
+static FILE *
+lopen(const char *name)
+{
+  int fd = open(name, O_RDWR | O_CREAT, 0666);
+  if (fd < 0)
+    return NULL;
+
+  while ( (lockf(fd, F_LOCK, 0) < 0))
+    if (errno != EINTR)
+      return NULL;
+
+  return fdopen(fd, "r+b");
+}
+
 void
 __bb_exit_func (void)
 {
@@ -1502,18 +1523,21 @@
 	  /* If the file exists, and the number of counts in it is the same,
 	     then merge them in.  */
 	     
-	  if ((da_file = fopen (ptr->filename, "r")) != 0)
+	  long n_counts = 0;
+
+	  /* If the file exists, and the number of counts in it is the same,
+	     then merge them in.  */
+
+
+	  if ((da_file = lopen (ptr->filename)) == 0)
 	    {
-	      long n_counts = 0;
-	      
-	      if (__read_long (&n_counts, da_file, 8) != 0)
-		{
-		  fprintf (stderr, "arc profiling: Can't read output file %s.\n",
-			   ptr->filename);
-		  continue;
-		}
+	      fprintf (stderr, "arc profiling: Can't open output file %s.\n",
+		       ptr->filename);
+	      continue;
+	    }
 
-	      if (n_counts == ptr->ncounts)
+	  if ( (__read_long (&n_counts, da_file, 8) == 0)
+	       && (n_counts == ptr->ncounts) )
 		{
 		  int i;
 
@@ -1531,16 +1555,9 @@
 		    }
 		}
 
-	      if (fclose (da_file) == EOF)
-		fprintf (stderr, "arc profiling: Error closing output file %s.\n",
-			 ptr->filename);
-	    }
-	  if ((da_file = fopen (ptr->filename, "w")) == 0)
-	    {
-	      fprintf (stderr, "arc profiling: Can't open output file %s.\n",
-		       ptr->filename);
-	      continue;
-	    }
+          /* Perhaps we should also truncate the file before
+	   * writing? */
+	  rewind(da_file);
 
 	  /* ??? Should first write a header to the file.  Preferably, a 4 byte
 	     magic number, 4 bytes containing the time the program was