Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 88f6ce6

Browse files
committed
started tracking usage of free in instance variable
1 parent 3ec4433 commit 88f6ce6

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

fml/mapping.cc

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,37 @@ const uint8_t* DataMapping::GetMapping() const {
8383

8484
// NonOwnedMapping
8585
NonOwnedMapping::NonOwnedMapping()
86-
: data_(nullptr), size_(0), release_proc_() {}
86+
: data_(nullptr), size_(0), release_proc_(), uses_free_(false) {}
8787

8888
NonOwnedMapping::NonOwnedMapping(const uint8_t* data,
8989
size_t size,
9090
const ReleaseProc& release_proc)
91-
: data_(data), size_(size), release_proc_(release_proc) {}
91+
: data_(data),
92+
size_(size),
93+
release_proc_(release_proc),
94+
uses_free_(false) {}
9295

9396
NonOwnedMapping::NonOwnedMapping(fml::NonOwnedMapping&& mapping)
9497
: data_(mapping.data_),
9598
size_(mapping.size_),
96-
release_proc_(mapping.release_proc_) {
99+
release_proc_(mapping.release_proc_),
100+
uses_free_(mapping.uses_free_) {
97101
mapping.data_ = nullptr;
98102
mapping.size_ = 0;
99103
mapping.release_proc_ = nullptr;
104+
mapping.uses_free_ = false;
105+
}
106+
107+
namespace {
108+
void FreeProc(const uint8_t* data, size_t size) {
109+
free(const_cast<uint8_t*>(data));
110+
}
111+
} // namespace
112+
113+
NonOwnedMapping NonOwnedMapping::WithFree(const uint8_t* data, size_t size) {
114+
auto result = NonOwnedMapping(data, size, FreeProc);
115+
result.uses_free_ = true;
116+
return result;
100117
}
101118

102119
NonOwnedMapping::~NonOwnedMapping() {
@@ -113,10 +130,6 @@ const uint8_t* NonOwnedMapping::GetMapping() const {
113130
return data_;
114131
}
115132

116-
void NonOwnedMapping::FreeProc(const uint8_t* data, size_t size) {
117-
free(const_cast<uint8_t*>(data));
118-
}
119-
120133
const uint8_t* NonOwnedMapping::Release() {
121134
const uint8_t* result = data_;
122135
data_ = nullptr;

fml/mapping.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,14 @@ class NonOwnedMapping final : public Mapping {
115115

116116
~NonOwnedMapping() override;
117117

118-
/// A ReleaseProc that uses `free` which interfaces well with C/ObjC.
119-
static void FreeProc(const uint8_t* data, size_t size);
120-
121118
/// Copies the data from `begin` to `end`.
122119
/// It's templated since void* arithemetic isn't allowed and we want support
123120
/// for `uint8_t` and `char`.
124121
template <typename T>
125122
static NonOwnedMapping Copy(const T* begin, const T* end) {
126123
size_t length = end - begin;
127-
auto result = NonOwnedMapping(reinterpret_cast<uint8_t*>(malloc(length)),
128-
length, FreeProc);
124+
auto result = NonOwnedMapping::WithFree(
125+
reinterpret_cast<uint8_t*>(malloc(length)), length);
129126
memcpy(const_cast<uint8_t*>(result.GetMapping()), begin, length);
130127
return result;
131128
}
@@ -139,12 +136,19 @@ class NonOwnedMapping final : public Mapping {
139136
/// Removes ownership of the data buffer.
140137
const uint8_t* Release();
141138

142-
ReleaseProc GetReleaseProc() const { return release_proc_; }
139+
/// Returns true if the Mapping uses `free` to delete the memory.
140+
/// This is important for passing ownership to C/ObjC code like NSData. It
141+
/// has to be a special case because std::function comparisions aren't
142+
/// possible.
143+
bool UsesFree() const { return uses_free_; }
143144

144145
private:
146+
static NonOwnedMapping WithFree(const uint8_t* data, size_t size);
147+
145148
const uint8_t* data_;
146149
size_t size_;
147150
ReleaseProc release_proc_;
151+
bool uses_free_;
148152

149153
FML_DISALLOW_COPY_AND_ASSIGN(NonOwnedMapping);
150154
};

0 commit comments

Comments
 (0)