зеркало из https://github.com/mozilla/gecko-dev.git
150 строки
4.7 KiB
Diff
150 строки
4.7 KiB
Diff
From 0b881f23c6f2a637ab97d71e964cc3743fef98b8 Mon Sep 17 00:00:00 2001
|
|
From: Marco Castelluccio <mcastelluccio@mozilla.com>
|
|
Date: Wed, 7 Nov 2018 09:38:26 +0000
|
|
Subject: [PATCH] [GCOV] Close file mapping handle on Windows, so flushed gcda
|
|
files can be removed while the process is in execution
|
|
|
|
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@346300 91177308-0d34-0410-b5e6-96231b3b80d8
|
|
---
|
|
lib/profile/GCDAProfiling.c | 49 +++++++++++++++++++
|
|
lib/profile/WindowsMMap.c | 8 ---
|
|
lib/profile/WindowsMMap.h | 8 +++
|
|
.../instrprof-gcov-__gcov_flush-multiple.c | 16 ++++++
|
|
...nstrprof-gcov-__gcov_flush-multiple.c.gcov | 21 ++++++++
|
|
.../instrprof-gcov-__gcov_flush-multiple.test | 10 ++++
|
|
6 files changed, 104 insertions(+), 8 deletions(-)
|
|
create mode 100644 test/profile/Inputs/instrprof-gcov-__gcov_flush-multiple.c
|
|
create mode 100644 test/profile/Inputs/instrprof-gcov-__gcov_flush-multiple.c.gcov
|
|
create mode 100644 test/profile/instrprof-gcov-__gcov_flush-multiple.test
|
|
|
|
diff --git a/compiler-rt/lib/profile/GCDAProfiling.c b/compiler-rt/lib/profile/GCDAProfiling.c
|
|
index cbca36551..0665a680c 100644
|
|
--- a/compiler-rt/lib/profile/GCDAProfiling.c
|
|
+++ b/compiler-rt/lib/profile/GCDAProfiling.c
|
|
@@ -29,6 +29,8 @@
|
|
#include <string.h>
|
|
|
|
#if defined(_WIN32)
|
|
+#define WIN32_LEAN_AND_MEAN
|
|
+#include <windows.h>
|
|
#include "WindowsMMap.h"
|
|
#else
|
|
#include <sys/mman.h>
|
|
@@ -86,6 +88,9 @@ static uint64_t cur_buffer_size = 0;
|
|
static uint64_t cur_pos = 0;
|
|
static uint64_t file_size = 0;
|
|
static int new_file = 0;
|
|
+#if defined(_WIN32)
|
|
+static HANDLE mmap_handle = NULL;
|
|
+#endif
|
|
static int fd = -1;
|
|
|
|
typedef void (*fn_ptr)();
|
|
@@ -255,6 +260,28 @@ static int map_file() {
|
|
if (file_size == 0)
|
|
return -1;
|
|
|
|
+#if defined(_WIN32)
|
|
+ HANDLE mmap_fd;
|
|
+ if (fd == -1)
|
|
+ mmap_fd = INVALID_HANDLE_VALUE;
|
|
+ else
|
|
+ mmap_fd = (HANDLE)_get_osfhandle(fd);
|
|
+
|
|
+ mmap_handle = CreateFileMapping(mmap_fd, NULL, PAGE_READWRITE, DWORD_HI(file_size), DWORD_LO(file_size), NULL);
|
|
+ if (mmap_handle == NULL) {
|
|
+ fprintf(stderr, "profiling: %s: cannot create file mapping: %d\n", filename,
|
|
+ GetLastError());
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ write_buffer = MapViewOfFile(mmap_handle, FILE_MAP_WRITE, 0, 0, file_size);
|
|
+ if (write_buffer == NULL) {
|
|
+ fprintf(stderr, "profiling: %s: cannot map: %d\n", filename,
|
|
+ GetLastError());
|
|
+ CloseHandle(mmap_handle);
|
|
+ return -1;
|
|
+ }
|
|
+#else
|
|
write_buffer = mmap(0, file_size, PROT_READ | PROT_WRITE,
|
|
MAP_FILE | MAP_SHARED, fd, 0);
|
|
if (write_buffer == (void *)-1) {
|
|
@@ -263,10 +290,30 @@ static int map_file() {
|
|
strerror(errnum));
|
|
return -1;
|
|
}
|
|
+#endif
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
static void unmap_file() {
|
|
+#if defined(_WIN32)
|
|
+ if (!FlushViewOfFile(write_buffer, file_size)) {
|
|
+ fprintf(stderr, "profiling: %s: cannot flush mapped view: %d\n", filename,
|
|
+ GetLastError());
|
|
+ }
|
|
+
|
|
+ if (!UnmapViewOfFile(write_buffer)) {
|
|
+ fprintf(stderr, "profiling: %s: cannot unmap mapped view: %d\n", filename,
|
|
+ GetLastError());
|
|
+ }
|
|
+
|
|
+ if (!CloseHandle(mmap_handle)) {
|
|
+ fprintf(stderr, "profiling: %s: cannot close file mapping handle: %d\n", filename,
|
|
+ GetLastError());
|
|
+ }
|
|
+
|
|
+ mmap_handle = NULL;
|
|
+#else
|
|
if (msync(write_buffer, file_size, MS_SYNC) == -1) {
|
|
int errnum = errno;
|
|
fprintf(stderr, "profiling: %s: cannot msync: %s\n", filename,
|
|
@@ -277,6 +324,8 @@ static void unmap_file() {
|
|
* is written and we don't care.
|
|
*/
|
|
(void)munmap(write_buffer, file_size);
|
|
+#endif
|
|
+
|
|
write_buffer = NULL;
|
|
file_size = 0;
|
|
}
|
|
diff --git a/compiler-rt/lib/profile/WindowsMMap.c b/compiler-rt/lib/profile/WindowsMMap.c
|
|
index dc87a888a..41cc67f41 100644
|
|
--- a/compiler-rt/lib/profile/WindowsMMap.c
|
|
+++ b/compiler-rt/lib/profile/WindowsMMap.c
|
|
@@ -24,14 +24,6 @@
|
|
|
|
#include "InstrProfiling.h"
|
|
|
|
-#ifdef __USE_FILE_OFFSET64
|
|
-# define DWORD_HI(x) (x >> 32)
|
|
-# define DWORD_LO(x) ((x) & 0xffffffff)
|
|
-#else
|
|
-# define DWORD_HI(x) (0)
|
|
-# define DWORD_LO(x) (x)
|
|
-#endif
|
|
-
|
|
COMPILER_RT_VISIBILITY
|
|
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
|
|
{
|
|
diff --git a/compiler-rt/lib/profile/WindowsMMap.h b/compiler-rt/lib/profile/WindowsMMap.h
|
|
index ac2c911c8..51a130b31 100644
|
|
--- a/compiler-rt/lib/profile/WindowsMMap.h
|
|
+++ b/compiler-rt/lib/profile/WindowsMMap.h
|
|
@@ -45,6 +45,14 @@
|
|
#define LOCK_NB 4 /* don't block when locking */
|
|
#define LOCK_UN 8 /* unlock */
|
|
|
|
+#ifdef __USE_FILE_OFFSET64
|
|
+# define DWORD_HI(x) (x >> 32)
|
|
+# define DWORD_LO(x) ((x) & 0xffffffff)
|
|
+#else
|
|
+# define DWORD_HI(x) (0)
|
|
+# define DWORD_LO(x) (x)
|
|
+#endif
|
|
+
|
|
void *mmap(void *start, size_t length, int prot, int flags, int fd,
|
|
off_t offset);
|
|
|