diff --git a/display/composer/v1_0/display_command/display_cmd_responser.h b/display/composer/v1_0/display_command/display_cmd_responser.h index 91e5b28c35527efa40d890dfd434f0bfa80ff4f0..e1c5dc2db92f803da6e9e2e06124f8265197e7f2 100755 --- a/display/composer/v1_0/display_command/display_cmd_responser.h +++ b/display/composer/v1_0/display_command/display_cmd_responser.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -56,6 +57,8 @@ static constexpr uint32_t TIME_BUFFER_MAX_LEN = 15; static constexpr uint32_t BUFFER_QUEUE_MAX_SIZE = 6; static constexpr unsigned int REDUCE_COUNT = 50; static sptr g_bufferServiceImpl = nullptr; +static constexpr uint32_t MAX_FD_LIMIT = 1000; +static constexpr uint32_t MAX_FENCE_FD_LIMIT = 10; static constexpr uint32_t COMMIT_PRINT_INTERVAL = 1200; @@ -838,11 +841,35 @@ EXIT: return ret; } + void CheckFenceFd(int32_t fence) + { + static std::queue recvFences; + if (fence >= MAX_FD_LIMIT) { + for (auto fd : recvFences) { + int flags = fcntl(fd, F_GETFD); + if (flags == -1) { + continue; + } + HDF_LOGE("%{public}s, fd:%{public}d not closed, fence:%{public}d", __func__, fd, fence); + if (fd != fence) { + close(fd); + } + } + recvFences.clear(); + } + if (fence >= 0) { + recvFences.push_back(fence); + } + if (recvFences.size() > MAX_FENCE_FD_LIMIT) { + recvFences.pop_front(); + } + } + void OnSetLayerBuffer(CommandDataUnpacker& unpacker, const std::vector& inFds) { DISPLAY_TRACE; - struct LayerBufferData data; + struct LayerBufferData data = {false, 0, 0, 0, -1, nullptr}; std::vector deletingList; int32_t ret = UnPackLayerBufferInfo(unpacker, inFds, &data, deletingList); @@ -872,7 +899,7 @@ EXIT: } errMaps_.emplace(REQUEST_CMD_SET_DISPLAY_CLIENT_BUFFER, ret); } - + CheckFenceFd(fdParcel.GetFd()); return; }