From 0d325c56a1053043db05d53a6c8083f4d35f116b Mon Sep 17 00:00:00 2001 From: arvinzzz Date: Mon, 13 Dec 2021 20:33:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20los=5Fcir=5Fbuf.c=E4=B8=AD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=95=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将循环buf的上/解锁操作合进读/写操作里,删除对外上/解锁接口 BREAKING CHANGE: 1. 删除 LOS_CirBufLock(),LOS_CirBufUnlock()内核对外接口 2. LOS_CirBufWrite(),LOS_CirBufRead()由原先内部不进行上/解锁操作,变为默认已包含上/解锁操作。 close: #I4MC13 Signed-off-by: arvinzzz Change-Id: Ie3cc1abde7fa0e5479ccbf4e596426e509b5cef5 --- kernel/common/console.c | 10 +++++----- lib/libscrew/include/los_cir_buf.h | 16 ---------------- lib/libscrew/src/los_cir_buf.c | 23 +++++++++++++++++------ 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/kernel/common/console.c b/kernel/common/console.c index 89597a08..5b6a6fa1 100644 --- a/kernel/common/console.c +++ b/kernel/common/console.c @@ -60,6 +60,7 @@ STATIC UINT32 ConsoleSendTask(UINTPTR param); STATIC UINT8 g_taskConsoleIDArray[LOSCFG_BASE_CORE_TSK_LIMIT]; STATIC SPIN_LOCK_INIT(g_consoleSpin); +STATIC SPIN_LOCK_INIT(g_consoleWriteSpinLock); #define SHELL_ENTRYID_INVALID 0xFFFFFFFF #define SHELL_TASK_PRIORITY 9 @@ -749,7 +750,8 @@ STATIC ssize_t DoWrite(CirBufSendCB *cirBufSendCB, CHAR *buffer, size_t bufLen) return 0; } #endif - LOS_CirBufLock(&cirBufSendCB->cirBufCB, &intSave); + + LOS_SpinLockSave(&g_consoleWriteSpinLock, &intSave); while (written < (INT32)bufLen) { /* Transform for CR/LR mode */ if ((buffer[written] == '\n') || (buffer[written] == '\r')) { @@ -763,7 +765,8 @@ STATIC ssize_t DoWrite(CirBufSendCB *cirBufSendCB, CHAR *buffer, size_t bufLen) toWrite -= cnt; written += cnt; } - LOS_CirBufUnlock(&cirBufSendCB->cirBufCB, intSave); + LOS_SpinUnlockRestore(&g_consoleWriteSpinLock, intSave); + /* Log is cached but not printed when a system exception occurs */ if (OsGetSystemStatus() == OS_SYSTEM_NORMAL) { (VOID)LOS_EventWrite(&cirBufSendCB->sendEvent, CONSOLE_CIRBUF_EVENT); @@ -1629,7 +1632,6 @@ STATIC UINT32 ConsoleSendTask(UINTPTR param) CirBufSendCB *cirBufSendCB = consoleCB->cirBufSendCB; CirBuf *cirBufCB = &cirBufSendCB->cirBufCB; UINT32 ret, size; - UINT32 intSave; CHAR *buf = NULL; (VOID)LOS_EventWrite(&cirBufSendCB->sendEvent, CONSOLE_SEND_TASK_RUNNING); @@ -1648,9 +1650,7 @@ STATIC UINT32 ConsoleSendTask(UINTPTR param) } (VOID)memset_s(buf, size + 1, 0, size + 1); - LOS_CirBufLock(cirBufCB, &intSave); (VOID)LOS_CirBufRead(cirBufCB, buf, size); - LOS_CirBufUnlock(cirBufCB, intSave); (VOID)WriteToTerminal(consoleCB, buf, size); (VOID)LOS_MemFree(m_aucSysMem1, buf); diff --git a/lib/libscrew/include/los_cir_buf.h b/lib/libscrew/include/los_cir_buf.h index 9e990ec0..62def915 100644 --- a/lib/libscrew/include/los_cir_buf.h +++ b/lib/libscrew/include/los_cir_buf.h @@ -56,22 +56,6 @@ typedef struct { CHAR *fifo; } CirBuf; -STATIC INLINE VOID LOS_CirBufLock(CirBuf *cirbufCB, UINT32 *intSave) -{ - if (cirbufCB == NULL) { - return; - } - LOS_SpinLockSave(&cirbufCB->lock, intSave); -} - -STATIC INLINE VOID LOS_CirBufUnlock(CirBuf *cirbufCB, UINT32 intSave) -{ - if (cirbufCB == NULL) { - return; - } - LOS_SpinUnlockRestore(&cirbufCB->lock, intSave); -} - extern UINT32 LOS_CirBufInit(CirBuf *cirbufCB, CHAR *fifo, UINT32 size); extern VOID LOS_CirBufDeinit(CirBuf *cirbufCB); extern UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size); diff --git a/lib/libscrew/src/los_cir_buf.c b/lib/libscrew/src/los_cir_buf.c index c090ed16..27462913 100644 --- a/lib/libscrew/src/los_cir_buf.c +++ b/lib/libscrew/src/los_cir_buf.c @@ -30,6 +30,7 @@ */ #include "los_cir_buf.h" +#include "los_spinlock.h" UINT32 LOS_CirBufUsedSize(CirBuf *cirbufCB) @@ -103,14 +104,17 @@ STATIC UINT32 OsCirBufWriteLoop(CirBuf *cirbufCB, const CHAR *buf, UINT32 size) UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size) { - UINT32 cpSize; + UINT32 cpSize = 0; + UINT32 intSave; - if ((cirbufCB == NULL) || (buf == NULL) || (size == 0)) { + if ((cirbufCB == NULL) || (buf == NULL) || (size == 0) || (cirbufCB->status != CBUF_USED)) { return 0; } + LOS_SpinLockSave(&cirbufCB->lock, &intSave); + if ((cirbufCB->fifo == NULL) || (cirbufCB->remain == 0)) { - return 0; + goto EXIT;; } if (cirbufCB->startIdx <= cirbufCB->endIdx) { @@ -119,6 +123,8 @@ UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size) cpSize = OsCirBufWriteLinear(cirbufCB, buf, size); } +EXIT: + LOS_SpinUnlockRestore(&cirbufCB->lock, intSave); return cpSize; } @@ -173,14 +179,17 @@ STATIC UINT32 OsCirBufReadLoop(CirBuf *cirbufCB, CHAR *buf, UINT32 size) UINT32 LOS_CirBufRead(CirBuf *cirbufCB, CHAR *buf, UINT32 size) { - UINT32 cpSize; + UINT32 cpSize = 0; + UINT32 intSave; - if ((cirbufCB == NULL) || (buf == NULL) || (size == 0)) { + if ((cirbufCB == NULL) || (buf == NULL) || (size == 0) || (cirbufCB->status != CBUF_USED)) { return 0; } + LOS_SpinLockSave(&cirbufCB->lock, &intSave); + if ((cirbufCB->fifo == NULL) || (cirbufCB->remain == cirbufCB->size)) { - return 0; + goto EXIT; } if (cirbufCB->startIdx >= cirbufCB->endIdx) { @@ -189,6 +198,8 @@ UINT32 LOS_CirBufRead(CirBuf *cirbufCB, CHAR *buf, UINT32 size) cpSize = OsCirBufReadLinear(cirbufCB, buf, size); } +EXIT: + LOS_SpinUnlockRestore(&cirbufCB->lock, intSave); return cpSize; } -- GitLab