solution to onWindowAnimationFlagChange_ data race

Signed-off-by: unknown <wanglonghao3@h-partners.com>
This commit is contained in:
unknown 2024-08-05 14:39:01 +08:00
parent 453105e4f3
commit bcd0caf328
3 changed files with 21 additions and 10 deletions

View File

@ -571,21 +571,14 @@ void JsSceneSession::ClearCbMap(bool needRemove, int32_t persistentId)
void JsSceneSession::ProcessSessionDefaultAnimationFlagChangeRegister()
{
auto sessionchangeCallback = sessionchangeCallback_.promote();
if (sessionchangeCallback == nullptr) {
WLOGFE("sessionchangeCallback is nullptr");
return;
}
sessionchangeCallback->onWindowAnimationFlagChange_ = [this](bool isNeedDefaultAnimationFlag) {
this->OnDefaultAnimationFlagChange(isNeedDefaultAnimationFlag);
};
auto session = weakSession_.promote();
if (session == nullptr) {
WLOGFE("session is nullptr");
return;
}
sessionchangeCallback->onWindowAnimationFlagChange_(session->IsNeedDefaultAnimation());
WLOGFD("ProcessSessionDefaultAnimationFlagChangeRegister success");
session->RegisterDefaultAnimationFlagChangeCallback([this](bool isNeedDefaultAnimationFlag) {
this->OnDefaultAnimationFlagChange(isNeedDefaultAnimationFlag);
});
}
void JsSceneSession::OnDefaultAnimationFlagChange(bool isNeedDefaultAnimationFlag)

View File

@ -292,6 +292,7 @@ public:
void NotifySessionForeground(uint32_t reason, bool withAnimation);
void NotifySessionBackground(uint32_t reason, bool withAnimation, bool isFromInnerkits);
void RegisterSessionChangeCallback(const sptr<SceneSession::SessionChangeCallback>& sessionChangeCallback);
void RegisterDefaultAnimationFlagChangeCallback(NotifyWindowAnimationFlagChangeFunc&& callback);
void RegisterForceSplitListener(const NotifyForceSplitFunc& func);
void ClearSpecificSessionCbMap();
void SendPointerEventToUI(std::shared_ptr<MMI::PointerEvent> pointerEvent);

View File

@ -450,6 +450,23 @@ void SceneSession::RegisterSessionChangeCallback(const sptr<SceneSession::Sessio
sessionChangeCallback_ = sessionChangeCallback;
}
void SceneSession::RegisterDefaultAnimationFlagChangeCallback(NotifyWindowAnimationFlagChangeFunc&& callback)
{
auto task = [weakThis = wptr(this), callback = std::move(callback)] {
auto session = weakThis.promote();
if (!session) {
TLOGE(WmsLogTag::WMS_LIFE, "session is null");
return WSError::WS_ERROR_DESTROYED_OBJECT;
}
if (session->sessionChangeCallback_) {
session->sessionChangeCallback_->onWindowAnimationFlagChange_ = std::move(callback);
session->sessionChangeCallback_->onWindowAnimationFlagChange_(session->IsNeedDefaultAnimation());
}
return WSError::WS_OK;
};
PostTask(task, "RegisterDefaultAnimationFlagChangeCallback");
}
WSError SceneSession::SetGlobalMaximizeMode(MaximizeMode mode)
{
auto task = [weakThis = wptr(this), mode]() {