gcov-io.c (gcov_open): Use open + fdopen instead of fopen.

* 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
This commit is contained in:
Jakub Jelinek 2004-02-23 00:18:53 +01:00 committed by Jakub Jelinek
parent fcfcb20e67
commit c2cd64b5a9
7 changed files with 60 additions and 7 deletions

View 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.

View 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. */

View 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}"

View 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}"

View 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}"

View 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;
}

View 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