From ffa957e7c1475029aefd35becbf7046e5a44f88b Mon Sep 17 00:00:00 2001 From: wangyikai Date: Wed, 21 May 2025 11:20:25 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90hdf=5Fcore=E3=80=91SharedMemQueue?= =?UTF-8?q?=E6=96=B0=E5=A2=9EReset=E6=8E=A5=E5=8F=A3=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangyikai --- adapter/uhdf2/hdi/src/hdi_smq_syncer.cpp | 9 +++++ interfaces/inner_api/hdi/base/hdi_smq.h | 33 +++++++++++++++++++ .../inner_api/hdi/base/hdi_smq_syncer.h | 8 +++++ 3 files changed, 50 insertions(+) diff --git a/adapter/uhdf2/hdi/src/hdi_smq_syncer.cpp b/adapter/uhdf2/hdi/src/hdi_smq_syncer.cpp index 1c9a156bc..4717577d1 100644 --- a/adapter/uhdf2/hdi/src/hdi_smq_syncer.cpp +++ b/adapter/uhdf2/hdi/src/hdi_smq_syncer.cpp @@ -98,6 +98,15 @@ int SharedMemQueueSyncer::Wake(uint32_t bitset) return HDF_SUCCESS; } +int SharedMemQueueSyncer::CheckSyncStatus(uint32_t bitset) +{ + uint32_t syncWordOld = std::atomic_load(syncAddr_); + if (syncWordOld & bitset) { + return HDF_SUCCESS; + } + return HDF_FAILURE; +} + void SharedMemQueueSyncer::TimeoutToRealtime(int64_t timeout, struct timespec &realtime) { constexpr int64_t nano = SEC_TO_NANOSEC; diff --git a/interfaces/inner_api/hdi/base/hdi_smq.h b/interfaces/inner_api/hdi/base/hdi_smq.h index 887897694..b0207428e 100644 --- a/interfaces/inner_api/hdi/base/hdi_smq.h +++ b/interfaces/inner_api/hdi/base/hdi_smq.h @@ -196,6 +196,16 @@ public: */ int ReadNonBlocking(T *data, size_t count); + /** + * @brief Reset all the status in SharedMemQueue. + * + * all the data in SMQ will be discard. + * + * @param. + * @return Returns 0 if the operation is successful; returns a non-zero value otherwise. + */ + int Reset(); + /** * @brief Obtains the number of elements that can be written to the SMQ. * @@ -477,6 +487,29 @@ int SharedMemQueue::Write(const T *data, size_t count, int64_t waitTimeNanoSe return ret; } +template +int SharedMemQueue::Reset() +{ + // do not invoke this function in multi-thread in same side + if (meta_->GetType() != SmqType::SYNCED_SMQ) { + HDF_LOGW("unsynecd smq reset status"); + readOffset_->exchange(writeOffset_->load(std::memory_order_acquire)); + return HDF_SUCCESS; + } + int ret = syncer_->CheckSyncStatus(SharedMemQueueSyncer::SYNC_WORD_READ); + if (ret == HDF_SUCCESS) { + HDF_LOGI("Currently reset by read side, reset and wake write side."); + readOffset_->exchange(writeOffset_->load(std::memory_order_acquire)); + syncer_->Wake(SharedMemQueueSyncer::SYNC_WORD_WRITE); + return HDF_SUCCESS; + } else { + HDF_LOGI("Currently reset by write side."); + readOffset_->exchange(writeOffset_->load(std::memory_order_acquire)); + } + + return HDF_SUCCESS; +} + template int SharedMemQueue::Read(T *data, size_t count, int64_t waitTimeNanoSec) { diff --git a/interfaces/inner_api/hdi/base/hdi_smq_syncer.h b/interfaces/inner_api/hdi/base/hdi_smq_syncer.h index 00d83e6fc..246d10164 100644 --- a/interfaces/inner_api/hdi/base/hdi_smq_syncer.h +++ b/interfaces/inner_api/hdi/base/hdi_smq_syncer.h @@ -79,6 +79,14 @@ public: */ int Wake(uint32_t bitset); + /** + * @brief Check the sync word. + * + * @param bitset Indicates the synchronization type. + * @return Returns 0 if the waiter is woken up. + */ + int CheckSyncStatus(uint32_t bitset); + private: /** * @brief Waits until a certain condition becomes true. -- Gitee