Merge "Move ScopedReadMmap to ext/base" into main
diff --git a/Android.bp b/Android.bp
index fa5bf5e..ece4ad0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -9835,6 +9835,7 @@
         "src/base/paged_memory.cc",
         "src/base/periodic_task.cc",
         "src/base/pipe.cc",
+        "src/base/scoped_mmap.cc",
         "src/base/status.cc",
         "src/base/string_splitter.cc",
         "src/base/string_utils.cc",
@@ -9924,6 +9925,7 @@
         "src/base/paged_memory_unittest.cc",
         "src/base/periodic_task_unittest.cc",
         "src/base/scoped_file_unittest.cc",
+        "src/base/scoped_mmap_unittest.cc",
         "src/base/small_vector_unittest.cc",
         "src/base/status_or_unittest.cc",
         "src/base/status_unittest.cc",
@@ -10549,8 +10551,6 @@
         "src/profiling/symbolizer/filesystem_posix.cc",
         "src/profiling/symbolizer/filesystem_windows.cc",
         "src/profiling/symbolizer/local_symbolizer.cc",
-        "src/profiling/symbolizer/scoped_read_mmap_posix.cc",
-        "src/profiling/symbolizer/scoped_read_mmap_windows.cc",
         "src/profiling/symbolizer/subprocess_posix.cc",
         "src/profiling/symbolizer/subprocess_windows.cc",
         "src/profiling/symbolizer/symbolizer.cc",
diff --git a/BUILD b/BUILD
index 20fc39c..367a2fe 100644
--- a/BUILD
+++ b/BUILD
@@ -601,6 +601,7 @@
         "include/perfetto/ext/base/pipe.h",
         "include/perfetto/ext/base/platform.h",
         "include/perfetto/ext/base/scoped_file.h",
+        "include/perfetto/ext/base/scoped_mmap.h",
         "include/perfetto/ext/base/small_set.h",
         "include/perfetto/ext/base/small_vector.h",
         "include/perfetto/ext/base/status_or.h",
@@ -1041,6 +1042,7 @@
         "src/base/paged_memory.cc",
         "src/base/periodic_task.cc",
         "src/base/pipe.cc",
+        "src/base/scoped_mmap.cc",
         "src/base/status.cc",
         "src/base/string_splitter.cc",
         "src/base/string_utils.cc",
@@ -1242,9 +1244,6 @@
         "src/profiling/symbolizer/filesystem_windows.cc",
         "src/profiling/symbolizer/local_symbolizer.cc",
         "src/profiling/symbolizer/local_symbolizer.h",
-        "src/profiling/symbolizer/scoped_read_mmap.h",
-        "src/profiling/symbolizer/scoped_read_mmap_posix.cc",
-        "src/profiling/symbolizer/scoped_read_mmap_windows.cc",
         "src/profiling/symbolizer/subprocess.h",
         "src/profiling/symbolizer/subprocess_posix.cc",
         "src/profiling/symbolizer/subprocess_windows.cc",
diff --git a/include/perfetto/ext/base/BUILD.gn b/include/perfetto/ext/base/BUILD.gn
index 6e38737..2418346 100644
--- a/include/perfetto/ext/base/BUILD.gn
+++ b/include/perfetto/ext/base/BUILD.gn
@@ -37,6 +37,7 @@
     "pipe.h",
     "platform.h",
     "scoped_file.h",
+    "scoped_mmap.h",
     "small_set.h",
     "small_vector.h",
     "status_or.h",
diff --git a/include/perfetto/ext/base/scoped_mmap.h b/include/perfetto/ext/base/scoped_mmap.h
new file mode 100644
index 0000000..1af620b
--- /dev/null
+++ b/include/perfetto/ext/base/scoped_mmap.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INCLUDE_PERFETTO_EXT_BASE_SCOPED_MMAP_H_
+#define INCLUDE_PERFETTO_EXT_BASE_SCOPED_MMAP_H_
+
+#include <cstddef>
+
+#include "perfetto/base/build_config.h"
+#include "perfetto/ext/base/scoped_file.h"
+
+namespace perfetto::base {
+
+// RAII wrapper that holds ownership of an mmap()d area and of a file. Calls
+// unmap() and close() on destruction.
+class ScopedMmap {
+ public:
+  // Creates a memory mapping for the first `length` bytes of `file`.
+  static ScopedMmap FromHandle(base::ScopedPlatformHandle file, size_t length);
+
+  ScopedMmap() {}
+  ~ScopedMmap();
+  ScopedMmap(ScopedMmap&& other) noexcept;
+
+  ScopedMmap& operator=(ScopedMmap&& other) noexcept;
+
+  // Returns a pointer to the mapped memory area. Only valid if `IsValid()` is
+  // true.
+  void* data() const { return ptr_; }
+
+  // Returns true if this object contains a successfully mapped area.
+  bool IsValid() const { return ptr_ != nullptr; }
+
+  // Returns the length of the mapped area.
+  size_t length() const { return length_; }
+
+  // Unmaps the area and closes the file. Returns false if this held a mmap()d
+  // area and unmapping failed. In any case, after this method, `IsValid()` will
+  // return false.
+  bool reset() noexcept;
+
+ private:
+  ScopedMmap(const ScopedMmap&) = delete;
+  ScopedMmap& operator=(const ScopedMmap&) = delete;
+
+  size_t length_ = 0;
+  void* ptr_ = nullptr;
+  ScopedPlatformHandle file_;
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+  ScopedPlatformHandle map_;
+#endif
+};
+
+// Tries to open `fname` and maps its first `length` bytes in memory.
+ScopedMmap ReadMmapFilePart(const char* fname, size_t length);
+
+// Tries to open `fname` and maps the whole file into memory.
+ScopedMmap ReadMmapWholeFile(const char* fname);
+
+}  // namespace perfetto::base
+
+#endif  // INCLUDE_PERFETTO_EXT_BASE_SCOPED_MMAP_H_
diff --git a/src/base/BUILD.gn b/src/base/BUILD.gn
index bb2e11b..d8d00a7 100644
--- a/src/base/BUILD.gn
+++ b/src/base/BUILD.gn
@@ -46,6 +46,7 @@
     "paged_memory.cc",
     "periodic_task.cc",
     "pipe.cc",
+    "scoped_mmap.cc",
     "status.cc",
     "string_splitter.cc",
     "string_utils.cc",
@@ -201,6 +202,7 @@
     "paged_memory_unittest.cc",
     "periodic_task_unittest.cc",
     "scoped_file_unittest.cc",
+    "scoped_mmap_unittest.cc",
     "small_vector_unittest.cc",
     "status_or_unittest.cc",
     "status_unittest.cc",
diff --git a/src/base/file_utils.cc b/src/base/file_utils.cc
index 65fcc46..db0105c 100644
--- a/src/base/file_utils.cc
+++ b/src/base/file_utils.cc
@@ -410,8 +410,7 @@
 
 std::optional<size_t> GetFileSize(const std::string& file_path) {
 #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
-  // This does not use base::OpenFile because to avoid getting an exclusive
-  // lock.
+  // This does not use base::OpenFile to avoid getting an exclusive lock.
   HANDLE file =
       CreateFileA(file_path.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr,
                   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
diff --git a/src/base/scoped_mmap.cc b/src/base/scoped_mmap.cc
new file mode 100644
index 0000000..c12d33b
--- /dev/null
+++ b/src/base/scoped_mmap.cc
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "perfetto/ext/base/scoped_mmap.h"
+
+#include <utility>
+
+#include "perfetto/ext/base/file_utils.h"
+#include "perfetto/ext/base/scoped_file.h"
+
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
+#include <sys/mman.h>
+#include <unistd.h>
+#elif PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+#include <Windows.h>
+#endif
+
+namespace perfetto::base {
+namespace {
+
+ScopedPlatformHandle OpenFileForMmap(const char* fname) {
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
+  return OpenFile(fname, O_RDONLY);
+#elif PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+  // This does not use base::OpenFile to avoid getting an exclusive lock.
+  return ScopedPlatformHandle(CreateFileA(fname, GENERIC_READ, FILE_SHARE_READ,
+                                          nullptr, OPEN_EXISTING,
+                                          FILE_ATTRIBUTE_NORMAL, nullptr));
+#else
+  // mmap is not supported. Do not even open the file.
+  base::ignore_result(fname);
+  return ScopedPlatformHandle();
+#endif
+}
+
+std::optional<size_t> GetPlatformHandleFileSize(PlatformHandle file) {
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
+  off_t file_size_offset = lseek(file, 0, SEEK_END);
+  if (file_size_offset <= 0) {
+    return std::nullopt;
+  }
+
+  lseek(file, 0, SEEK_SET);
+
+  size_t file_size = static_cast<size_t>(file_size_offset);
+  if (static_cast<off_t>(file_size) != file_size_offset) {
+    return std::nullopt;
+  }
+  return file_size;
+#elif PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+  LARGE_INTEGER fs;
+  fs.QuadPart = 0;
+  if (!GetFileSizeEx(file, &fs)) {
+    return std::nullopt;
+  }
+
+  size_t file_size = static_cast<size_t>(fs.QuadPart);
+  if (static_cast<decltype(fs.QuadPart)>(file_size) != fs.QuadPart) {
+    return std::nullopt;
+  }
+  return file_size;
+#else
+  // mmap is not supported. This does not matter.
+  base::ignore_result(file);
+  return std::nullopt;
+#endif
+}
+
+}  // namespace
+
+ScopedMmap::ScopedMmap(ScopedMmap&& other) noexcept {
+  *this = std::move(other);
+}
+
+ScopedMmap& ScopedMmap::operator=(ScopedMmap&& other) noexcept {
+  reset();
+  std::swap(ptr_, other.ptr_);
+  std::swap(length_, other.length_);
+  std::swap(file_, other.file_);
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+  std::swap(map_, other.map_);
+#endif
+  return *this;
+}
+
+ScopedMmap::~ScopedMmap() {
+  reset();
+}
+
+// static
+ScopedMmap ScopedMmap::FromHandle(base::ScopedPlatformHandle file,
+                                  size_t length) {
+  ScopedMmap ret;
+  if (!file) {
+    return ret;
+  }
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
+  void* ptr = mmap(nullptr, length, PROT_READ, MAP_PRIVATE, *file, 0);
+  if (ptr != MAP_FAILED) {
+    ret.ptr_ = ptr;
+    ret.length_ = length;
+    ret.file_ = std::move(file);
+  }
+#elif PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+  ScopedPlatformHandle map(
+      CreateFileMapping(*file, nullptr, PAGE_READONLY, 0, 0, nullptr));
+  if (!map) {
+    return ret;
+  }
+  void* ptr = MapViewOfFile(*map, FILE_MAP_READ, 0, 0, length);
+  if (ptr != nullptr) {
+    ret.ptr_ = ptr;
+    ret.length_ = length;
+    ret.file_ = std::move(file);
+    ret.map_ = std::move(map);
+  }
+#else
+  base::ignore_result(length);
+#endif
+  return ret;
+}
+
+bool ScopedMmap::reset() noexcept {
+  bool ret = true;
+#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
+    PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
+  if (ptr_ != nullptr) {
+    ret = munmap(ptr_, length_) == 0;
+  }
+#elif PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+  if (ptr_ != nullptr) {
+    ret = UnmapViewOfFile(ptr_);
+  }
+  map_.reset();
+#endif
+  ptr_ = nullptr;
+  length_ = 0;
+  file_.reset();
+  return ret;
+}
+
+ScopedMmap ReadMmapFilePart(const char* fname, size_t length) {
+  return ScopedMmap::FromHandle(OpenFileForMmap(fname), length);
+}
+
+ScopedMmap ReadMmapWholeFile(const char* fname) {
+  ScopedPlatformHandle file = OpenFileForMmap(fname);
+  if (!file) {
+    return ScopedMmap();
+  }
+  std::optional<size_t> file_size = GetPlatformHandleFileSize(file.get());
+  if (!file_size.has_value()) {
+    return ScopedMmap();
+  }
+  return ScopedMmap::FromHandle(std::move(file), *file_size);
+}
+
+}  // namespace perfetto::base
diff --git a/src/base/scoped_mmap_unittest.cc b/src/base/scoped_mmap_unittest.cc
new file mode 100644
index 0000000..2c6b004
--- /dev/null
+++ b/src/base/scoped_mmap_unittest.cc
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "perfetto/ext/base/scoped_mmap.h"
+
+#include "src/base/test/tmp_dir_tree.h"
+#include "test/gtest_and_gmock.h"
+
+namespace perfetto::base {
+namespace {
+
+class ScopedMmapTest : public ::testing::Test {
+  void SetUp() override {
+#if !PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) &&   \
+    !PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && \
+    !PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) &&   \
+    !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
+    GTEST_SKIP() << "mmap not supported";
+#endif
+  }
+};
+
+TEST_F(ScopedMmapTest, WholeNonExistingFile) {
+  base::TmpDirTree tmp;
+
+  ScopedMmap mapped = ReadMmapWholeFile(tmp.AbsolutePath("f1.txt").c_str());
+
+  EXPECT_FALSE(mapped.IsValid());
+}
+
+TEST_F(ScopedMmapTest, PartNonExistingFile) {
+  base::TmpDirTree tmp;
+
+  ScopedMmap mapped = ReadMmapFilePart(tmp.AbsolutePath("f1.txt").c_str(), 4);
+
+  EXPECT_FALSE(mapped.IsValid());
+}
+
+TEST_F(ScopedMmapTest, WholeOneByteFile) {
+  base::TmpDirTree tmp;
+  tmp.AddFile("f1.txt", "c");
+
+  ScopedMmap mapped = ReadMmapWholeFile(tmp.AbsolutePath("f1.txt").c_str());
+
+  ASSERT_TRUE(mapped.IsValid());
+  ASSERT_NE(mapped.data(), nullptr);
+  ASSERT_EQ(mapped.length(), 1u);
+  EXPECT_EQ(*static_cast<char*>(mapped.data()), 'c');
+}
+
+TEST_F(ScopedMmapTest, PartThreeBytes) {
+  base::TmpDirTree tmp;
+  tmp.AddFile("f1.txt", "ccccc");
+
+  ScopedMmap mapped = ReadMmapFilePart(tmp.AbsolutePath("f1.txt").c_str(), 3);
+
+  ASSERT_TRUE(mapped.IsValid());
+  ASSERT_NE(mapped.data(), nullptr);
+  ASSERT_EQ(mapped.length(), 3u);
+}
+
+TEST_F(ScopedMmapTest, Reset) {
+  base::TmpDirTree tmp;
+  tmp.AddFile("f1.txt", "ccccc");
+  ScopedMmap mapped = ReadMmapWholeFile(tmp.AbsolutePath("f1.txt").c_str());
+  ASSERT_TRUE(mapped.IsValid());
+
+  EXPECT_TRUE(mapped.reset());
+
+  EXPECT_FALSE(mapped.IsValid());
+}
+
+}  // namespace
+}  // namespace perfetto::base
diff --git a/src/profiling/symbolizer/BUILD.gn b/src/profiling/symbolizer/BUILD.gn
index c81dbb1..722d1cf 100644
--- a/src/profiling/symbolizer/BUILD.gn
+++ b/src/profiling/symbolizer/BUILD.gn
@@ -29,9 +29,6 @@
     "filesystem_windows.cc",
     "local_symbolizer.cc",
     "local_symbolizer.h",
-    "scoped_read_mmap.h",
-    "scoped_read_mmap_posix.cc",
-    "scoped_read_mmap_windows.cc",
     "subprocess.h",
     "subprocess_posix.cc",
     "subprocess_windows.cc",
diff --git a/src/profiling/symbolizer/local_symbolizer.cc b/src/profiling/symbolizer/local_symbolizer.cc
index 9ade8b4..eee5076 100644
--- a/src/profiling/symbolizer/local_symbolizer.cc
+++ b/src/profiling/symbolizer/local_symbolizer.cc
@@ -30,10 +30,10 @@
 #include "perfetto/base/logging.h"
 #include "perfetto/ext/base/file_utils.h"
 #include "perfetto/ext/base/scoped_file.h"
+#include "perfetto/ext/base/scoped_mmap.h"
 #include "perfetto/ext/base/string_utils.h"
 #include "src/profiling/symbolizer/elf.h"
 #include "src/profiling/symbolizer/filesystem.h"
-#include "src/profiling/symbolizer/scoped_read_mmap.h"
 
 namespace perfetto {
 namespace profiling {
@@ -222,12 +222,12 @@
   static_assert(EI_CLASS > EI_MAG3, "mem[EI_MAG?] accesses are in range.");
   if (size <= EI_CLASS)
     return std::nullopt;
-  ScopedReadMmap map(fname, size);
+  base::ScopedMmap map = base::ReadMmapFilePart(fname, size);
   if (!map.IsValid()) {
-    PERFETTO_PLOG("mmap");
+    PERFETTO_PLOG("Failed to mmap %s", fname);
     return std::nullopt;
   }
-  char* mem = static_cast<char*>(*map);
+  char* mem = static_cast<char*>(map.data());
 
   if (!IsElf(mem, size))
     return std::nullopt;
diff --git a/src/profiling/symbolizer/scoped_read_mmap.h b/src/profiling/symbolizer/scoped_read_mmap.h
deleted file mode 100644
index 69a028a..0000000
--- a/src/profiling/symbolizer/scoped_read_mmap.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef SRC_PROFILING_SYMBOLIZER_SCOPED_READ_MMAP_H_
-#define SRC_PROFILING_SYMBOLIZER_SCOPED_READ_MMAP_H_
-
-#include "perfetto/ext/base/scoped_file.h"
-
-namespace perfetto {
-namespace profiling {
-
-class ScopedReadMmap {
- public:
-  ScopedReadMmap(const char* fname, size_t length);
-  virtual ~ScopedReadMmap();
-
-  void* operator*() { return ptr_; }
-
-  bool IsValid();
-
- private:
-  size_t length_;
-  void* ptr_;
-#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
-  void* file_ = nullptr;
-  void* map_ = nullptr;
-#else
-  base::ScopedFile fd_;
-#endif
-};
-
-}  // namespace profiling
-}  // namespace perfetto
-
-#endif  // SRC_PROFILING_SYMBOLIZER_SCOPED_READ_MMAP_H_
diff --git a/src/profiling/symbolizer/scoped_read_mmap_posix.cc b/src/profiling/symbolizer/scoped_read_mmap_posix.cc
deleted file mode 100644
index f6c3276..0000000
--- a/src/profiling/symbolizer/scoped_read_mmap_posix.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "src/profiling/symbolizer/scoped_read_mmap.h"
-
-#if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
-
-#include "perfetto/base/logging.h"
-#include "perfetto/ext/base/file_utils.h"
-
-#include <sys/mman.h>
-
-namespace perfetto {
-namespace profiling {
-
-ScopedReadMmap::ScopedReadMmap(const char* fname, size_t length)
-    : length_(length), fd_(base::OpenFile(fname, O_RDONLY)) {
-  if (!fd_) {
-    PERFETTO_PLOG("Failed to open %s", fname);
-    return;
-  }
-  ptr_ = mmap(nullptr, length, PROT_READ, MAP_PRIVATE, *fd_, 0);
-}
-
-ScopedReadMmap::~ScopedReadMmap() {
-  if (ptr_ != MAP_FAILED)
-    munmap(ptr_, length_);
-}
-
-bool ScopedReadMmap::IsValid() {
-  return ptr_ != MAP_FAILED;
-}
-
-}  // namespace profiling
-}  // namespace perfetto
-
-#endif  // !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
diff --git a/src/profiling/symbolizer/scoped_read_mmap_windows.cc b/src/profiling/symbolizer/scoped_read_mmap_windows.cc
deleted file mode 100644
index d56d913..0000000
--- a/src/profiling/symbolizer/scoped_read_mmap_windows.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "src/profiling/symbolizer/scoped_read_mmap.h"
-
-#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
-
-#include <Windows.h>
-
-namespace perfetto {
-namespace profiling {
-
-ScopedReadMmap::ScopedReadMmap(const char* fName, size_t length)
-    : length_(length), ptr_(nullptr) {
-  file_ = CreateFileA(fName, GENERIC_READ, FILE_SHARE_READ, nullptr,
-                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
-  if (file_ == INVALID_HANDLE_VALUE) {
-    PERFETTO_DLOG("Failed to open file: %s", fName);
-    return;
-  }
-  map_ = CreateFileMapping(file_, nullptr, PAGE_READONLY, 0, 0, nullptr);
-  if (map_ == INVALID_HANDLE_VALUE) {
-    PERFETTO_DLOG("Failed to mmap file");
-    return;
-  }
-  ptr_ = MapViewOfFile(map_, FILE_MAP_READ, 0, 0, length_);
-  if (ptr_ == nullptr) {
-    PERFETTO_DLOG("Failed to map view of file");
-  }
-}
-
-ScopedReadMmap::~ScopedReadMmap() {
-  if (ptr_ != nullptr) {
-    UnmapViewOfFile(ptr_);
-  }
-  if (map_ != nullptr && map_ != INVALID_HANDLE_VALUE) {
-    CloseHandle(map_);
-  }
-  if (file_ != nullptr && file_ != INVALID_HANDLE_VALUE) {
-    CloseHandle(file_);
-  }
-}
-
-bool ScopedReadMmap::IsValid() {
-  return ptr_ != nullptr;
-}
-
-}  // namespace profiling
-}  // namespace perfetto
-
-#endif  // PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)