已合并
sync render pipeline code: hold pipeline via weak_ptr in RSRenderPipelineAgent #30688
LyBbq创建于 6月12日
sync render pipeline code: hold pipeline via weak_ptr in RSRenderPipelineAgent #30688
已合并
共 3 个文件变更+397-278
| @@ -26,7 +26,7 @@ class SurfaceUtils; | |||
| 26 | namespace Rosen { | 26 | namespace Rosen { |
| 27 | class RSRenderPipelineAgent : public RefBase { | 27 | class RSRenderPipelineAgent : public RefBase { |
| 28 | public: | 28 | public: |
| 29 | - explicit RSRenderPipelineAgent(std::shared_ptr<RSRenderPipeline>& rsRenderPipeline); | 29 | + explicit RSRenderPipelineAgent(std::shared_ptr<RSRenderPipeline> rsRenderPipeline); |
| 30 | ~RSRenderPipelineAgent() = default; | 30 | ~RSRenderPipelineAgent() = default; |
| 31 | 31 | ||
| 32 | ErrCode CommitTransaction(pid_t callingPid, bool isTokenTypeValid, bool isNonSystemAppCalling, | 32 | ErrCode CommitTransaction(pid_t callingPid, bool isTokenTypeValid, bool isNonSystemAppCalling, |
| @@ -238,7 +238,7 @@ private: | |||
| 238 | void ConfigureForceTunnelLayer( | 238 | void ConfigureForceTunnelLayer( |
| 239 | const RSSurfaceRenderNodeConfig& config, const sptr<IConsumerSurface>& surface, SurfaceUtils* utils); | 239 | const RSSurfaceRenderNodeConfig& config, const sptr<IConsumerSurface>& surface, SurfaceUtils* utils); |
| 240 | 240 | ||
| 241 | - std::shared_ptr<RSRenderPipeline>& rsRenderPipeline_; | 241 | + std::weak_ptr<RSRenderPipeline> rsRenderPipeline_; |
| 242 | std::unordered_map<pid_t, std::string> pidToBundleName_; | 242 | std::unordered_map<pid_t, std::string> pidToBundleName_; |
| 243 | mutable std::mutex pidToBundleMutex_; | 243 | mutable std::mutex pidToBundleMutex_; |
| 244 | mutable std::mutex mutex_; | 244 | mutable std::mutex mutex_; |
| @@ -639,14 +639,14 @@ HWTEST_F(RSRenderPipelineAgentTest, CleanTest_NullPipeline, TestSize.Level1) | |||
| 639 | std::shared_ptr<RSRenderPipeline> renderPipeline = nullptr; | 639 | std::shared_ptr<RSRenderPipeline> renderPipeline = nullptr; |
| 640 | sptr<RSRenderPipelineAgent> agent = sptr<RSRenderPipelineAgent>::MakeSptr(renderPipeline); | 640 | sptr<RSRenderPipelineAgent> agent = sptr<RSRenderPipelineAgent>::MakeSptr(renderPipeline); |
| 641 | ASSERT_NE(agent, nullptr); | 641 | ASSERT_NE(agent, nullptr); |
| 642 | - ASSERT_EQ(agent->rsRenderPipeline_, nullptr); | 642 | + ASSERT_EQ(agent->rsRenderPipeline_.lock(), nullptr); |
| 643 | 643 | ||
| 644 | pid_t testPid = 12345; | 644 | pid_t testPid = 12345; |
| 645 | // Should return early without crash when rsRenderPipeline_ is nullptr | 645 | // Should return early without crash when rsRenderPipeline_ is nullptr |
| 646 | agent->Clean(testPid, false); | 646 | agent->Clean(testPid, false); |
| 647 | agent->Clean(testPid, true); | 647 | agent->Clean(testPid, true); |
| 648 | // Verify agent state remains unchanged after Clean | 648 | // Verify agent state remains unchanged after Clean |
| 649 | - EXPECT_EQ(agent->rsRenderPipeline_, nullptr); | 649 | + EXPECT_EQ(agent->rsRenderPipeline_.lock(), nullptr); |
| 650 | } | 650 | } |
| 651 | 651 | ||
| 652 | /** | 652 | /** |
| @@ -663,14 +663,14 @@ HWTEST_F(RSRenderPipelineAgentTest, CleanTest_ForRefreshFalse, TestSize.Level1) | |||
| 663 | renderPipeline->mainThread_ = mainThread_; | 663 | renderPipeline->mainThread_ = mainThread_; |
| 664 | 664 | ||
| 665 | pid_t testPid = 12345; | 665 | pid_t testPid = 12345; |
| 666 | - ASSERT_NE(agent->rsRenderPipeline_, nullptr); | 666 | + ASSERT_NE(agent->rsRenderPipeline_.lock(), nullptr); |
| 667 | - ASSERT_NE(agent->rsRenderPipeline_->mainThread_, nullptr); | 667 | + ASSERT_NE(agent->rsRenderPipeline_.lock()->mainThread_, nullptr); |
| 668 | 668 | ||
| 669 | // Execute Clean with forRefresh=false | 669 | // Execute Clean with forRefresh=false |
| 670 | agent->Clean(testPid, false); | 670 | agent->Clean(testPid, false); |
| 671 | // Verify agent and pipeline remain valid after Clean | 671 | // Verify agent and pipeline remain valid after Clean |
| 672 | - EXPECT_NE(agent->rsRenderPipeline_, nullptr); | 672 | + EXPECT_NE(agent->rsRenderPipeline_.lock(), nullptr); |
| 673 | - EXPECT_NE(agent->rsRenderPipeline_->mainThread_, nullptr); | 673 | + EXPECT_NE(agent->rsRenderPipeline_.lock()->mainThread_, nullptr); |
| 674 | } | 674 | } |
| 675 | 675 | ||
| 676 | /** | 676 | /** |
| @@ -687,14 +687,14 @@ HWTEST_F(RSRenderPipelineAgentTest, CleanTest_ForRefreshTrue, TestSize.Level1) | |||
| 687 | renderPipeline->mainThread_ = mainThread_; | 687 | renderPipeline->mainThread_ = mainThread_; |
| 688 | 688 | ||
| 689 | pid_t testPid = 12345; | 689 | pid_t testPid = 12345; |
| 690 | - ASSERT_NE(agent->rsRenderPipeline_, nullptr); | 690 | + ASSERT_NE(agent->rsRenderPipeline_.lock(), nullptr); |
| 691 | - ASSERT_NE(agent->rsRenderPipeline_->mainThread_, nullptr); | 691 | + ASSERT_NE(agent->rsRenderPipeline_.lock()->mainThread_, nullptr); |
| 692 | 692 | ||
| 693 | // Execute Clean with forRefresh=true | 693 | // Execute Clean with forRefresh=true |
| 694 | agent->Clean(testPid, true); | 694 | agent->Clean(testPid, true); |
| 695 | // Verify agent and pipeline remain valid after Clean | 695 | // Verify agent and pipeline remain valid after Clean |
| 696 | - EXPECT_NE(agent->rsRenderPipeline_, nullptr); | 696 | + EXPECT_NE(agent->rsRenderPipeline_.lock(), nullptr); |
| 697 | - EXPECT_NE(agent->rsRenderPipeline_->mainThread_, nullptr); | 697 | + EXPECT_NE(agent->rsRenderPipeline_.lock()->mainThread_, nullptr); |
| 698 | } | 698 | } |
| 699 | 699 | ||
| 700 | /** | 700 | /** |