Skip to content

Commit

Permalink
fix(dom): fix dom memory leak
Browse files Browse the repository at this point in the history
  • Loading branch information
ilikethese committed Nov 22, 2023
1 parent 7ed0049 commit 0a93210
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 11 deletions.
6 changes: 6 additions & 0 deletions dom/src/dom/deserializer_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ void CheckInt32(int32_t value) {

footstone::value::HippyValue hippy_value;
deserializer.ReadObject(hippy_value);
footstone::value::SerializerHelper::DestroyBuffer(buffer);
EXPECT_TRUE(hippy_value.GetType() == footstone::value::HippyValue::Type::kNumber);
EXPECT_TRUE(hippy_value.GetNumberType() == footstone::value::HippyValue::NumberType::kInt32);
EXPECT_TRUE(hippy_value.ToInt32Checked() == value);
Expand All @@ -76,6 +77,7 @@ void CheckDouble(double value) {

footstone::value::HippyValue hippy_value;
deserializer.ReadObject(hippy_value);
footstone::value::SerializerHelper::DestroyBuffer(buffer)
EXPECT_TRUE(hippy_value.GetType() == footstone::value::HippyValue::Type::kNumber);
EXPECT_TRUE(hippy_value.GetNumberType() == footstone::value::HippyValue::NumberType::kDouble);
EXPECT_TRUE(hippy_value.ToDoubleChecked() == value);
Expand All @@ -92,6 +94,7 @@ void CheckString(std::string value) {

footstone::value::HippyValue hippy_value;
deserializer.ReadObject(hippy_value);
footstone::value::SerializerHelper::DestroyBuffer(buffer);
EXPECT_TRUE(hippy_value.GetType() == footstone::value::HippyValue::Type::kString);
EXPECT_TRUE(hippy_value.ToStringChecked() == value);
EXPECT_TRUE(hippy_value.ToStringChecked().length() == value.length());
Expand All @@ -108,6 +111,7 @@ void CheckMap(footstone::value::HippyValue::HippyValueObjectType value) {

footstone::value::HippyValue hippy_value;
deserializer.ReadObject(hippy_value);
footstone::value::SerializerHelper::DestroyBuffer(buffer);
EXPECT_TRUE(hippy_value.GetType() == footstone::value::HippyValue::Type::kObject);
EXPECT_TRUE(hippy_value.IsObject());
EXPECT_TRUE(hippy_value.ToObjectChecked().size() == value.size());
Expand All @@ -134,6 +138,7 @@ void CheckArray(footstone::value::HippyValue::HippyValueArrayType value) {

footstone::value::HippyValue hippy_value;
deserializer.ReadObject(hippy_value);
footstone::value::SerializerHelper::DestroyBuffer(buffer);
EXPECT_TRUE(hippy_value.GetType() == footstone::value::HippyValue::Type::kArray);
EXPECT_TRUE(hippy_value.IsArray());
EXPECT_TRUE(hippy_value.ToArrayChecked().size() == value.size());
Expand All @@ -157,6 +162,7 @@ TEST(DeserializerTest, ReadHeader) {
footstone::value::Deserializer deserializer(buffer.first, buffer.second);
deserializer.ReadHeader();
EXPECT_EQ(deserializer.version_, tdf::base::kLatestVersion);
footstone::value::SerializerHelper::DestroyBuffer(buffer);
}

TEST(DeserializerTest, Uint32) {
Expand Down
1 change: 1 addition & 0 deletions dom/src/dom/dom_argument.cc
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ bool DomArgument::ConvertObjectToBson(const footstone::value::HippyValue& hippy_
std::pair<uint8_t*, size_t> pair = serializer.Release();
bson.resize(pair.second);
memcpy(&bson[0], pair.first, sizeof(uint8_t) * pair.second);
footstone::value::SerializerHelper::DestroyBuffer(pair);
return true;
}

Expand Down
6 changes: 4 additions & 2 deletions dom/src/dom/dom_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,10 @@ DomManager::byte_string DomManager::GetSnapShot(const std::shared_ptr<RootNode>&
Serializer serializer;
serializer.WriteHeader();
serializer.WriteValue(HippyValue(array));
auto ret = serializer.Release();
return {reinterpret_cast<const char*>(ret.first), ret.second};
auto buffer_pair = serializer.Release();
byte_string bs = {reinterpret_cast<const char*>(buffer_pair.first), buffer_pair.second};
footstone::value::SerializerHelper::DestroyBuffer(buffer_pair);
return bs;
}

bool DomManager::SetSnapShot(const std::shared_ptr<RootNode>& root_node, const byte_string& buffer) {
Expand Down
2 changes: 1 addition & 1 deletion dom/src/dom/serializer_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ void CheckString(footstone::value::Serializer& serializer, std::string value, si

TEST(SerializerTest, Release) {
footstone::value::Serializer serializer;
serializer.Release();
footstone::value::SerializerHelper(serializer.Release());
EXPECT_EQ(serializer.buffer_ == nullptr, true) << "Serializer buffer is not equal to nullptr.";
EXPECT_EQ(serializer.buffer_size_, 0) << "Serializer buffer_size is not equal to 0.";
EXPECT_EQ(serializer.buffer_capacity_, 0) << "Serializer buffer_capacity is not equal to 0.";
Expand Down
13 changes: 13 additions & 0 deletions modules/footstone/include/footstone/serializer.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,15 @@ enum class SerializationTag : uint8_t {
kEndDenseJSArray = '$',
};

class SerializerHelper {
public:
static void DestroyBuffer(const std::pair<uint8_t*, size_t>& pair) {
if (pair.first) {
free(pair.first);
}
}
};

class Serializer {
public:
Serializer();
Expand All @@ -80,7 +89,11 @@ class Serializer {

void WriteValue(const HippyValue& hippy_value);

/**
* @brief 获取 HippyValue 对应序列化数据,注意 Release 后指针交给外部管理,需要自行释放
*/
std::pair<uint8_t*, size_t> Release();

private:

void WriteOddball(Oddball oddball);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ void NativeRenderManager::CreateRenderNode(std::weak_ptr<RootNode> root_node,
}
uint32_t root_id = root->GetId();

serializer_->Release();
footstone::value::SerializerHelper::DestroyBuffer(serializer_->Release());
serializer_->WriteHeader();

auto len = nodes.size();
Expand Down Expand Up @@ -182,8 +182,8 @@ void NativeRenderManager::CreateRenderNode(std::weak_ptr<RootNode> root_node,
}
serializer_->WriteValue(HippyValue(dom_node_array));
std::pair<uint8_t*, size_t> buffer_pair = serializer_->Release();

CallNativeMethod("createNode", root->GetId(), buffer_pair);
footstone::value::SerializerHelper::DestroyBuffer(buffer_pair);
}

void NativeRenderManager::UpdateRenderNode(std::weak_ptr<RootNode> root_node,
Expand All @@ -201,7 +201,7 @@ void NativeRenderManager::UpdateRenderNode(std::weak_ptr<RootNode> root_node,
}
}

serializer_->Release();
footstone::value::SerializerHelper::DestroyBuffer(serializer_->Release());
serializer_->WriteHeader();

auto len = nodes.size();
Expand Down Expand Up @@ -242,8 +242,8 @@ void NativeRenderManager::UpdateRenderNode(std::weak_ptr<RootNode> root_node,
}
serializer_->WriteValue(HippyValue(dom_node_array));
std::pair<uint8_t*, size_t> buffer_pair = serializer_->Release();

CallNativeMethod("updateNode", root->GetId(), buffer_pair);
footstone::value::SerializerHelper::DestroyBuffer(buffer_pair);
}

void NativeRenderManager::MoveRenderNode(std::weak_ptr<RootNode> root_node,
Expand All @@ -253,7 +253,7 @@ void NativeRenderManager::MoveRenderNode(std::weak_ptr<RootNode> root_node,
return;
}

serializer_->Release();
footstone::value::SerializerHelper::DestroyBuffer(serializer_->Release());
serializer_->WriteHeader();

auto len = nodes.size();
Expand Down Expand Up @@ -295,6 +295,7 @@ void NativeRenderManager::MoveRenderNode(std::weak_ptr<RootNode> root_node,
JNIEnvironment::ClearJEnvException(j_env);
j_env->DeleteLocalRef(j_buffer);
j_env->DeleteLocalRef(j_class);
footstone::value::SerializerHelper::DestroyBuffer(buffer_pair);
}

void NativeRenderManager::DeleteRenderNode(std::weak_ptr<RootNode> root_node,
Expand Down Expand Up @@ -343,7 +344,7 @@ void NativeRenderManager::UpdateLayout(std::weak_ptr<RootNode> root_node,
return;
}

serializer_->Release();
footstone::value::SerializerHelper::DestroyBuffer(serializer_->Release());
serializer_->WriteHeader();

auto len = nodes.size();
Expand All @@ -367,8 +368,8 @@ void NativeRenderManager::UpdateLayout(std::weak_ptr<RootNode> root_node,
}
serializer_->WriteValue(HippyValue(dom_node_array));
std::pair<uint8_t*, size_t> buffer_pair = serializer_->Release();

CallNativeMethod("updateLayout", root->GetId(), buffer_pair);
footstone::value::SerializerHelper::DestroyBuffer(buffer_pair);
}

void NativeRenderManager::MoveRenderNode(std::weak_ptr<RootNode> root_node,
Expand Down Expand Up @@ -637,11 +638,12 @@ void NativeRenderManager::HandleListenerOps(std::weak_ptr<RootNode> root_node,
return;
}

serializer_->Release();
footstone::value::SerializerHelper::DestroyBuffer(serializer_->Release());
serializer_->WriteHeader();
serializer_->WriteValue(HippyValue(event_listener_ops));
std::pair<uint8_t*, size_t> buffer_pair = serializer_->Release();
CallNativeMethod(method_name, root->GetId(), buffer_pair);
footstone::value::SerializerHelper::DestroyBuffer(buffer_pair);
}

void NativeRenderManager::MarkTextDirty(std::weak_ptr<RootNode> weak_root_node, uint32_t node_id) {
Expand Down

0 comments on commit 0a93210

Please sign in to comment.