From 31865aa4ce78cbeb832574f32573ec9b001e411d Mon Sep 17 00:00:00 2001 From: yanghaizhou Date: Fri, 31 Dec 2021 20:55:45 +0800 Subject: [PATCH] Remove semaphore logic from PlatformMsg Signed-off-by: yanghaizhou --- model/storage/include/mmc/mmc_corex.h | 1 + model/storage/src/mmc/mmc_core.c | 18 +++++++------ support/platform/include/fwk/platform_queue.h | 3 --- support/platform/include/hdmi/hdmi_event.h | 2 ++ support/platform/src/fwk/platform_queue.c | 17 ------------- support/platform/src/hdmi/hdmi_event.c | 25 ++++++++++++------- .../platform/common/platform_queue_test.c | 21 +++++++++++++--- 7 files changed, 46 insertions(+), 41 deletions(-) diff --git a/model/storage/include/mmc/mmc_corex.h b/model/storage/include/mmc/mmc_corex.h index 818073cb9..693d831ca 100644 --- a/model/storage/include/mmc/mmc_corex.h +++ b/model/storage/include/mmc/mmc_corex.h @@ -279,6 +279,7 @@ enum MmcMsgCode { struct MmcMsg { struct PlatformMsg msg; struct MmcCmd *mmcCmd; + struct OsalSem sem; bool block; }; diff --git a/model/storage/src/mmc/mmc_core.c b/model/storage/src/mmc/mmc_core.c index 00c363e01..a03ba1bc3 100644 --- a/model/storage/src/mmc/mmc_core.c +++ b/model/storage/src/mmc/mmc_core.c @@ -186,8 +186,10 @@ static int32_t MmcMsgHandleDefault(struct PlatformQueue *queue, struct PlatformM break; } - if (mmcMsg->block == false) { + if (!mmcMsg->block) { OsalMemFree(mmcMsg); + } else { + (void)OsalSemPost(&mmcMsg->sem); } return ret; } @@ -303,20 +305,20 @@ static int32_t MmcCntlrPostMsg(struct MmcCntlr *cntlr, struct MmcMsg *mmcMsg) return HDF_ERR_INVALID_PARAM; } - ret = PlatformQueueAddMsg(cntlr->msgQueue, &mmcMsg->msg); - if (ret != HDF_SUCCESS) { - OsalMemFree(mmcMsg); - HDF_LOGE("MmcCntlrPostMsg: add msg failed"); - return ret; + if (mmcMsg->block) { + (void)OsalSemInit(&mmcMsg->sem, 0); } + (void)PlatformQueueAddMsg(cntlr->msgQueue, &mmcMsg->msg); if (!mmcMsg->block) { return HDF_SUCCESS; } - ret = PlatformMsgWait(&mmcMsg->msg, HDF_WAIT_FOREVER); + + ret = OsalSemWait(&mmcMsg->sem, HDF_WAIT_FOREVER); + (void)OsalSemDestroy(&mmcMsg->sem); + OsalMemFree(mmcMsg); if (ret != HDF_SUCCESS) { HDF_LOGE("MmcCntlrPostMsg: wait msg failed:%d", ret); } - OsalMemFree(mmcMsg); return ret; } diff --git a/support/platform/include/fwk/platform_queue.h b/support/platform/include/fwk/platform_queue.h index c6950da39..7c9470848 100644 --- a/support/platform/include/fwk/platform_queue.h +++ b/support/platform/include/fwk/platform_queue.h @@ -25,14 +25,11 @@ struct PlatformQueue; struct PlatformMsg { struct DListHead node; - struct OsalSem sem; int32_t code; int32_t error; - bool block; /* whether need to block thread */ void *data; }; -int32_t PlatformMsgWait(struct PlatformMsg *msg, uint32_t tms); typedef int32_t (*PlatformMsgHandle)(struct PlatformQueue *queue, struct PlatformMsg *msg); struct PlatformQueue { diff --git a/support/platform/include/hdmi/hdmi_event.h b/support/platform/include/hdmi/hdmi_event.h index 0f66458fd..bbb81249d 100644 --- a/support/platform/include/hdmi/hdmi_event.h +++ b/support/platform/include/hdmi/hdmi_event.h @@ -35,6 +35,8 @@ enum HdmiEventType { struct HdmiEventMsg { struct PlatformMsg msg; + struct OsalSem sem; + bool block; void *priv; }; diff --git a/support/platform/src/fwk/platform_queue.c b/support/platform/src/fwk/platform_queue.c index 9a16d0629..356c75297 100644 --- a/support/platform/src/fwk/platform_queue.c +++ b/support/platform/src/fwk/platform_queue.c @@ -52,7 +52,6 @@ static int32_t PlatformQueueThreadWorker(void *data) /* message process */ if (msg != NULL) { (void)(queue->handle(queue, msg)); - (void)OsalSemPost(&msg->sem); } } return HDF_SUCCESS; @@ -132,7 +131,6 @@ int32_t PlatformQueueAddMsg(struct PlatformQueue *queue, struct PlatformMsg *msg return HDF_ERR_INVALID_OBJECT; } - (void)OsalSemInit(&msg->sem, 0); DListHeadInit(&msg->node); msg->error = HDF_SUCCESS; (void)OsalSpinLock(&queue->spin); @@ -142,18 +140,3 @@ int32_t PlatformQueueAddMsg(struct PlatformQueue *queue, struct PlatformMsg *msg (void)OsalSemPost(&queue->sem); return HDF_SUCCESS; } - -int32_t PlatformMsgWait(struct PlatformMsg *msg, uint32_t tms) -{ - int32_t ret; - - if (msg == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - - ret = OsalSemWait(&msg->sem, tms); - if (ret == HDF_SUCCESS) { - OsalSemDestroy(&msg->sem); - } - return ret; -} diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c index 3c44a9313..3f8a933aa 100644 --- a/support/platform/src/hdmi/hdmi_event.c +++ b/support/platform/src/hdmi/hdmi_event.c @@ -23,17 +23,21 @@ static int32_t HdmiEventPostMsg(struct HdmiCntlr *cntlr, struct HdmiEventMsg *ev return HDF_ERR_INVALID_PARAM; } - PlatformQueueAddMsg(cntlr->msgQueue, &event->msg); - ret = PlatformMsgWait(&event->msg, HDF_WAIT_FOREVER); - if (event->msg.block == true) { - (void)OsalSemDestroy(&event->msg.sem); - OsalMemFree(event); + if (event->block) { + (void)OsalSemInit(&event->sem, 0); + } + (void)PlatformQueueAddMsg(cntlr->msgQueue, &event->msg); + if (!event->block) { + return HDF_SUCCESS; } + + ret = OsalSemWait(&event->sem, HDF_WAIT_FOREVER); + (void)OsalSemDestroy(&event->sem); + OsalMemFree(event); if (ret != HDF_SUCCESS) { HDF_LOGE("HdmiEventPostMsg: wait hdmi event msg fail!"); - return ret; } - return HDF_SUCCESS; + return ret; } bool HdmiHpdStatusGet(struct HdmiCntlr *cntlr) @@ -82,7 +86,7 @@ int32_t HdmiAddEventMsgToQueue(struct HdmiCntlr *cntlr, int32_t code, bool block } event->msg.code = code; event->msg.data = (void *)cntlr; - event->msg.block = block; + event->block = block; event->priv = data; return HdmiEventPostMsg(cntlr, event); } @@ -229,9 +233,12 @@ int32_t HdmiEventMsgHandleDefault(struct PlatformQueue *queue, struct PlatformMs break; } - if (event->msg.block == false) { + if (!event->block) { OsalMemFree(event); + } else { + (void)OsalSemPost(&event->sem); } + return ret; } diff --git a/test/unittest/platform/common/platform_queue_test.c b/test/unittest/platform/common/platform_queue_test.c index b15400528..33ef90869 100644 --- a/test/unittest/platform/common/platform_queue_test.c +++ b/test/unittest/platform/common/platform_queue_test.c @@ -23,6 +23,7 @@ struct PlatformQueueTestMsg { struct PlatformMsg msg; + struct OsalSem sem; int32_t status; }; @@ -51,6 +52,7 @@ static int32_t PlatformQueueTestHandle(struct PlatformQueue *queue, struct Platf return HDF_ERR_INVALID_PARAM; } + (void)OsalSemPost(&tmsg->sem); tmsg->status = HDF_SUCCESS; return HDF_SUCCESS; } @@ -65,15 +67,26 @@ static int32_t PlatformQueueTestAddAndWait(struct PlatformQueue *pq) tmsg.msg.data = pq; tmsg.status = -1; + (void)OsalSemInit(&tmsg.sem, 0); //should add msg success ret = PlatformQueueAddMsg(pq, &tmsg.msg); - CHECK_EQ_RETURN(ret, HDF_SUCCESS, ret); + if (!CHECK_EQ(ret, HDF_SUCCESS)) { + (void)OsalSemDestroy(&tmsg.sem); + return ret; + } //should wait msg success - ret = PlatformMsgWait(&tmsg.msg, PLAT_QUEUE_TEST_TIMEOUT); - CHECK_EQ_RETURN(ret, HDF_SUCCESS, ret); - CHECK_EQ_RETURN(tmsg.status, HDF_SUCCESS, HDF_FAILURE); + ret = OsalSemWait(&tmsg.sem, PLAT_QUEUE_TEST_TIMEOUT); + if (!CHECK_EQ(ret, HDF_SUCCESS)) { + (void)OsalSemDestroy(&tmsg.sem); + return ret; + } + if (!CHECK_EQ(tmsg.status, HDF_SUCCESS)) { + (void)OsalSemDestroy(&tmsg.sem); + return tmsg.status; + } + (void)OsalSemDestroy(&tmsg.sem); PLAT_LOGD("%s: exit", __func__); return HDF_SUCCESS; } -- Gitee