Mercurial > hg > CbC > CbC_gcc
diff gcc/gcov-io.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | a06113de4d67 |
children | 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/gcov-io.c Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/gcov-io.c Fri Feb 12 23:39:51 2010 +0900 @@ -46,11 +46,13 @@ /* Open a gcov file. NAME is the name of the file to open and MODE indicates whether a new file should be created, or an existing file - opened for modification. If MODE is >= 0 an existing file will be - opened, if possible, and if MODE is <= 0, a new file will be - created. Use MODE=0 to attempt to reopen an existing file and then - fall back on creating a new one. Return zero on failure, >0 on - opening an existing file and <0 on creating a new one. */ + opened. If MODE is >= 0 an existing file will be opened, if + possible, and if MODE is <= 0, a new file will be created. Use + MODE=0 to attempt to reopen an existing file and then fall back on + creating a new one. If MODE < 0, the file will be opened in + read-only mode. Otherwise it will be opened for modification. + Return zero on failure, >0 on opening an existing file and <0 on + creating a new one. */ GCOV_LINKAGE int #if IN_LIBGCOV @@ -66,13 +68,12 @@ struct flock s_flock; int fd; - s_flock.l_type = F_WRLCK; s_flock.l_whence = SEEK_SET; s_flock.l_start = 0; s_flock.l_len = 0; /* Until EOF. */ s_flock.l_pid = getpid (); #endif - + gcc_assert (!gcov_var.file); gcov_var.start = 0; gcov_var.offset = gcov_var.length = 0; @@ -83,16 +84,25 @@ #endif #if GCOV_LOCKED if (mode > 0) - fd = open (name, O_RDWR); + { + /* Read-only mode - acquire a read-lock. */ + s_flock.l_type = F_RDLCK; + fd = open (name, O_RDONLY); + } else - fd = open (name, O_RDWR | O_CREAT, 0666); + { + /* Write mode - acquire a write-lock. */ + s_flock.l_type = F_WRLCK; + 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"); + gcov_var.file = fdopen (fd, (mode > 0) ? "rb" : "r+b"); + if (!gcov_var.file) { close (fd); @@ -120,7 +130,8 @@ gcov_var.mode = mode * 2 + 1; #else if (mode >= 0) - gcov_var.file = fopen (name, "r+b"); + gcov_var.file = fopen (name, (mode > 0) ? "rb" : "r+b"); + if (gcov_var.file) gcov_var.mode = 1; else if (mode <= 0) @@ -134,7 +145,7 @@ #endif setbuf (gcov_var.file, (char *)0); - + return 1; } @@ -189,12 +200,12 @@ gcov_allocate (unsigned length) { size_t new_size = gcov_var.alloc; - + if (!new_size) new_size = GCOV_BLOCK_SIZE; new_size += length; new_size *= 2; - + gcov_var.alloc = new_size; gcov_var.buffer = XRESIZEVAR (gcov_unsigned_t, gcov_var.buffer, new_size << 2); } @@ -237,7 +248,7 @@ #endif result = &gcov_var.buffer[gcov_var.offset]; gcov_var.offset += words; - + return result; } @@ -285,7 +296,7 @@ length = strlen (string); alloc = (length + 4) >> 2; } - + buffer = gcov_write_words (1 + alloc); buffer[0] = alloc; @@ -306,7 +317,7 @@ buffer[0] = tag; buffer[1] = 0; - + return result; } @@ -378,7 +389,7 @@ { const gcov_unsigned_t *result; unsigned excess = gcov_var.length - gcov_var.offset; - + gcc_assert (gcov_var.mode > 0); if (excess < words) { @@ -461,7 +472,7 @@ gcov_read_string (void) { unsigned length = gcov_read_unsigned (); - + if (!length) return 0; @@ -474,7 +485,7 @@ { unsigned ix; struct gcov_ctr_summary *csum; - + summary->checksum = gcov_read_unsigned (); for (csum = summary->ctrs, ix = GCOV_COUNTERS_SUMMABLE; ix--; csum++) { @@ -527,7 +538,7 @@ gcov_time (void) { struct stat status; - + if (fstat (fileno (gcov_var.file), &status)) return 0; else