#include <sys/mman.h>
#include <unistd.h>
#include <set>
+#include <string>
#include <vector>
-#include <base/logging.h>
+#include <android-base/file.h>
+#include <android-base/logging.h>
#include "perf_event.h"
#include "record.h"
std::unique_ptr<RecordFileWriter> RecordFileWriter::CreateInstance(const std::string& filename) {
// Remove old perf.data to avoid file ownership problems.
- if (!RemovePossibleFile(filename)) {
+ std::string err;
+ if (!android::base::RemoveFileIfExists(filename, &err)) {
+ LOG(ERROR) << "failed to remove file " << filename << ": " << err;
return nullptr;
}
FILE* fp = fopen(filename.c_str(), "web+");
return true;
}
-bool RecordFileWriter::ReadDataSection(std::vector<std::unique_ptr<Record>>* records) {
- if (fflush(record_fp_) != 0) {
- PLOG(ERROR) << "fflush() failed";
- return false;
- }
- uint64_t file_size;
- if (!SeekFileEnd(&file_size)) {
- return false;
- }
- size_t mmap_len = static_cast<size_t>(file_size);
- void* mmap_addr = mmap(nullptr, mmap_len, PROT_READ, MAP_SHARED, fileno(record_fp_), 0);
- if (mmap_addr == MAP_FAILED) {
- PLOG(ERROR) << "mmap() failed";
- return false;
- }
- const char* data_section = reinterpret_cast<char*>(mmap_addr) + data_section_offset_;
- std::vector<std::unique_ptr<Record>> result =
- ReadRecordsFromBuffer(event_attr_, data_section, data_section_size_);
- if (munmap(mmap_addr, mmap_len) == -1) {
- PLOG(ERROR) << "munmap() failed";
- return false;
- }
- *records = std::move(result);
- return true;
-}
-
bool RecordFileWriter::SeekFileEnd(uint64_t* file_end) {
if (fseek(record_fp_, 0, SEEK_END) == -1) {
PLOG(ERROR) << "fseek() failed";