summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2022-07-31 06:15:18 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2022-07-31 06:15:18 -0700
commit14a22c006cda71d43982448183c36c1c6ac7b6d8 (patch)
tree74c5f82a5a471e8d487ac6c2b830f4711c5d92a7
parentb56ff22e22de5d6c586b3b0649d733246918ced4 (diff)
parent4c82d628a70a44740269d10a7989bb55547843fc (diff)
Merge "composer: use shared pointer for QueueNode"
-rw-r--r--composer/hwc_session.h15
-rw-r--r--composer/hwc_session_services.cpp14
2 files changed, 17 insertions, 12 deletions
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index 6e9a566c..c3a77641 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -409,6 +409,15 @@ class HWCSession : hwc2_device_t, HWCUEventListener, public qClient::BnQClient,
const hidl_handle &buf, hwc2_display_t disp_type)
: callback(cb), cwb_config(cwb_conf), buffer(buf), display_type(disp_type) {}
+ ~QueueNode() {
+ if (!buffer) {
+ return;
+ }
+
+ native_handle_close(buffer);
+ native_handle_delete(const_cast<native_handle_t *>(buffer));
+ }
+
std::weak_ptr<DisplayConfig::ConfigCallback> callback;
CwbConfig cwb_config = {};
const native_handle_t *buffer;
@@ -419,10 +428,10 @@ class HWCSession : hwc2_device_t, HWCUEventListener, public qClient::BnQClient,
void PerformFenceWaits();
static void AsyncTask(CWB *cwb);
static void AsyncFenceWaits(CWB *cwb);
- void NotifyCWBStatus(int status, QueueNode *cwb_node);
+ void NotifyCWBStatus(int status, shared_ptr<QueueNode> cwb_node);
- std::queue<QueueNode *> queue_;
- std::queue<pair<shared_ptr<Fence>, QueueNode *>> fence_wait_queue_;
+ std::queue<shared_ptr<QueueNode>> queue_;
+ std::queue<pair<shared_ptr<Fence>, shared_ptr<QueueNode>>> fence_wait_queue_;
std::future<void> future_;
std::future<void> fence_wait_future_;
diff --git a/composer/hwc_session_services.cpp b/composer/hwc_session_services.cpp
index 28ae8eaa..4672fe1c 100644
--- a/composer/hwc_session_services.cpp
+++ b/composer/hwc_session_services.cpp
@@ -1161,7 +1161,7 @@ int32_t HWCSession::CWB::PostBuffer(std::weak_ptr<DisplayConfig::ConfigCallback>
if (!post_future) { // if queue_ is not empty
// reject the cwb request if it's made on another display than the currently cwb active display
- QueueNode *node = queue_.front();
+ shared_ptr<QueueNode> node = queue_.front();
if (node->display_type != display_type) {
native_handle_close(buffer);
native_handle_delete(const_cast<native_handle_t *>(buffer));
@@ -1169,7 +1169,7 @@ int32_t HWCSession::CWB::PostBuffer(std::weak_ptr<DisplayConfig::ConfigCallback>
}
}
- QueueNode *node = new QueueNode(callback, cwb_config, buffer, display_type);
+ shared_ptr<QueueNode> node(new QueueNode(callback, cwb_config, buffer, display_type));
queue_.push(node);
if (post_future) {
@@ -1186,7 +1186,7 @@ int32_t HWCSession::CWB::PostBuffer(std::weak_ptr<DisplayConfig::ConfigCallback>
void HWCSession::CWB::ProcessRequests() {
while (true) {
- QueueNode *node = nullptr;
+ shared_ptr<QueueNode> node = nullptr;
int status = 0;
HWC2::Error error = HWC2::Error::None;
@@ -1290,7 +1290,7 @@ void HWCSession::CWB::ProcessRequests() {
void HWCSession::CWB::PerformFenceWaits() {
while (true) {
shared_ptr<Fence> release_fence = nullptr;
- QueueNode *cwb_node = nullptr;
+ shared_ptr<QueueNode> cwb_node = nullptr;
{
SCOPE_LOCK(fence_queue_lock_);
if (!fence_wait_queue_.size()) {
@@ -1325,17 +1325,13 @@ void HWCSession::CWB::PerformFenceWaits() {
}
}
-void HWCSession::CWB::NotifyCWBStatus(int status, QueueNode *cwb_node) {
+void HWCSession::CWB::NotifyCWBStatus(int status, shared_ptr<QueueNode> cwb_node) {
// Notify client about buffer status and erase the node from pending request queue.
std::shared_ptr<DisplayConfig::ConfigCallback> callback = cwb_node->callback.lock();
if (callback) {
DLOGI("Notify the client about buffer status %d.", status);
callback->NotifyCWBBufferDone(status, cwb_node->buffer);
}
-
- native_handle_close(cwb_node->buffer);
- native_handle_delete(const_cast<native_handle_t *>(cwb_node->buffer));
- delete cwb_node;
}
void HWCSession::CWB::AsyncTask(CWB *cwb) {