国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

鴻蒙輕內(nèi)核M核源碼分析系列十三(續(xù)) 消息隊列QueueMail接口

開發(fā) 前端
之前分析過隊列(Queue)的源代碼,了解了隊列初始化、隊列創(chuàng)建、刪除、隊列讀取寫入等操作。隊列還提供了兩個接口OsQueueMailAlloc和OsQueueMailFree。

[[425060]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

之前分析過隊列(Queue)的源代碼,了解了隊列初始化、隊列創(chuàng)建、刪除、隊列讀取寫入等操作。隊列還提供了兩個接口OsQueueMailAlloc和OsQueueMailFree。隊列可以和一個靜態(tài)內(nèi)存池關(guān)聯(lián)起來,一個任務(wù)從靜態(tài)內(nèi)存池申請內(nèi)存塊時,如果申請不到,會把該任務(wù)插入到隊列的內(nèi)存阻塞鏈表中,等有其他任務(wù)釋放內(nèi)存時,該任務(wù)會被分配內(nèi)存塊。

接下來,詳細(xì)看下這2個接口的源代碼。

1、隊列結(jié)構(gòu)體定義

1.1 隊列結(jié)構(gòu)體定義

我們回憶下隊列結(jié)構(gòu)體的定義,在文件kernel\include\los_queue.h中定義隊列控制塊結(jié)構(gòu)體為LosQueueCB,結(jié)構(gòu)體源代碼如下。需要看下成員變量memList,當(dāng)任務(wù)從和隊列關(guān)聯(lián)的靜態(tài)內(nèi)存池中申請不到空閑內(nèi)存塊時,會把任務(wù)插入memList內(nèi)存阻塞鏈表,然后調(diào)度,進(jìn)行任務(wù)切換。等有其他任務(wù)釋放空閑內(nèi)存塊到這個靜態(tài)內(nèi)存池時,該任務(wù)申請到空閑內(nèi)存塊,并把任務(wù)從memList內(nèi)存阻塞鏈表移除,插入到任務(wù)就緒隊列,并觸發(fā)任務(wù)調(diào)度。

  1. typedef struct { 
  2.     UINT8 *queue;      /**< 隊列內(nèi)存空間的指針 */ 
  3.     UINT16 queueState; /**< 隊列的使用狀態(tài) */ 
  4.     UINT16 queueLen;   /**< 隊列長度,即消息數(shù)量 */ 
  5.     UINT16 queueSize;  /**< 消息節(jié)點大小 */ 
  6.     UINT16 queueID;    /**< 隊列編號  */ 
  7.     UINT16 queueHead;  /**< 消息頭節(jié)點位置 */ 
  8.     UINT16 queueTail;  /**< 消息尾節(jié)點位置 */ 
  9.     UINT16 readWriteableCnt[OS_READWRITE_LEN]; /**< 2維數(shù)組,可讀、可寫的消息數(shù)量, 0:可讀, 1:可寫 */ 
  10.     LOS_DL_LIST readWriteList[OS_READWRITE_LEN]; /**< 2維雙向鏈表數(shù)組,阻塞讀、寫任務(wù)的雙向鏈表, 0:讀鏈表, 1:寫鏈表 */ 
  11.     LOS_DL_LIST memList; /**< 內(nèi)存節(jié)點雙向鏈表 */ 
  12. } LosQueueCB; 

2、QueueMail接口源碼分析

2.1 OsQueueMailAlloc接口

我們可以使用函數(shù)VOID *OsQueueMailAlloc(UINT32 queueID, VOID *mailPool, UINT32 timeOut)從和隊列關(guān)聯(lián)的靜態(tài)內(nèi)存池中申請空閑內(nèi)存,下面通過分析源碼看看如何申請內(nèi)存。該函數(shù)需要3個參數(shù),queueID是一個在使用狀態(tài)的隊列的編號,*mailPool是和隊列關(guān)聯(lián)的靜態(tài)內(nèi)存池地址,timeOut是超時時間,取值[0,LOS_WAIT_FOREVER]。該接口函數(shù)返回申請到的內(nèi)存地址或者NULL。

⑴處開始對參數(shù)進(jìn)行校驗,⑵處根據(jù)隊列編號獲取隊列控制結(jié)構(gòu)體queueCB,然后校驗該隊列是否為使用狀態(tài)。⑶處調(diào)用靜態(tài)內(nèi)存分配函數(shù)LOS_MemboxAlloc獲取空閑內(nèi)存塊,然后獲取的內(nèi)存地址不為NULL,返回該內(nèi)存塊地址,否則執(zhí)行后續(xù)代碼。⑷處獲取當(dāng)前運(yùn)行的任務(wù)控制結(jié)構(gòu)體,⑸處把當(dāng)前任務(wù)加入隊列的內(nèi)存阻塞鏈表queueCB->memList,然后觸發(fā)任務(wù)調(diào)度。

等有其他其他任務(wù)調(diào)用OsQueueMailFree釋放內(nèi)存后,上述阻塞的任務(wù)獲得內(nèi)存塊,或者因超時退出阻塞列表并調(diào)度運(yùn)行后,會開始執(zhí)行⑹處語句。⑺處表示因為超時返回,任務(wù)沒有獲取到內(nèi)存塊,跳轉(zhuǎn)到END標(biāo)簽,返回NULL內(nèi)存地址。⑻處表示獲取到內(nèi)存塊,把任務(wù)的msg置空,并返回獲取到的內(nèi)存塊的地址。

  1. LITE_OS_SEC_TEXT VOID *OsQueueMailAlloc(UINT32 queueID, VOID *mailPool, UINT32 timeOut) 
  2.     VOID *mem = (VOID *)NULL
  3.     UINT32 intSave; 
  4.     LosQueueCB *queueCB = (LosQueueCB *)NULL
  5.     LosTaskCB *runTsk = (LosTaskCB *)NULL
  6.  
  7. ⑴  if (queueID >= LOSCFG_BASE_IPC_QUEUE_LIMIT) { 
  8.         return NULL
  9.     } 
  10.  
  11.     if (mailPool == NULL) { 
  12.         return NULL
  13.     } 
  14.  
  15.     if (timeOut != LOS_NO_WAIT) { 
  16.         if (OS_INT_ACTIVE) { 
  17.             return NULL
  18.         } 
  19.     } 
  20.  
  21.     intSave = LOS_IntLock(); 
  22. ⑵  queueCB = GET_QUEUE_HANDLE(queueID); 
  23.     if (queueCB->queueState == OS_QUEUE_UNUSED) { 
  24.         goto END
  25.     } 
  26.  
  27. ⑶  mem = LOS_MemboxAlloc(mailPool); 
  28.     if (mem == NULL) { 
  29.         if (timeOut == LOS_NO_WAIT) { 
  30.             goto END
  31.         } 
  32.  
  33. ⑷      runTsk = (LosTaskCB *)g_losTask.runTask; 
  34. ⑸      OsSchedTaskWait(&queueCB->memList, timeOut); 
  35.         LOS_IntRestore(intSave); 
  36.         LOS_Schedule(); 
  37.  
  38. ⑹      intSave = LOS_IntLock(); 
  39.         if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) { 
  40. ⑺          runTsk->taskStatus &= (~OS_TASK_STATUS_TIMEOUT); 
  41.             goto END
  42.         } else { 
  43.             /* When enters the current branch, means the current task already got a available membox, 
  44.              * so the runTsk->msg can not be NULL
  45.              */ 
  46. ⑻          mem = runTsk->msg; 
  47.             runTsk->msg = NULL
  48.         } 
  49.     } 
  50.  
  51. END
  52.     LOS_IntRestore(intSave); 
  53.     return mem; 

2.2 OsQueueMailFree

我們可以使用函數(shù)UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *mailMem)釋放空閑內(nèi)存到和隊列關(guān)聯(lián)的靜態(tài)內(nèi)存池中,下面通過分析源碼看看如何釋放內(nèi)存。該函數(shù)需要3個參數(shù),queueID是一個在使用狀態(tài)的隊列的編號,*mailPool是和隊列關(guān)聯(lián)的靜態(tài)內(nèi)存池地址,*mailMem表示要釋放的內(nèi)存塊地址。該接口返回值類型為無符號整數(shù),表示是否成功或者錯誤碼。

⑴處開始對參數(shù)進(jìn)行校驗。⑵處調(diào)用靜態(tài)內(nèi)存釋放函數(shù)LOS_MemboxFree釋放空閑內(nèi)存塊,如果釋放失敗,返回錯誤碼。⑶處根據(jù)隊列編號獲取隊列控制結(jié)構(gòu)體queueCB,然后校驗該隊列是否為使用狀態(tài)。成功釋放內(nèi)存后,如果隊列的內(nèi)存阻塞列表不為空,有阻塞任務(wù),則執(zhí)行⑷。⑸處從阻塞列表中獲取第一個任務(wù)控制結(jié)構(gòu)體,然后調(diào)用接口OsSchedTaskWake把任務(wù)從阻塞列表移除,并添加到任務(wù)就緒隊列。⑹處從靜態(tài)內(nèi)存池申請一個內(nèi)存塊,如果申請失敗返回錯誤碼,否則執(zhí)行⑺,把申請到的內(nèi)存賦值到任務(wù)控制結(jié)構(gòu)體的msg成員變量,然后觸發(fā)調(diào)度。

  1. LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *mailMem) 
  2.     VOID *mem = (VOID *)NULL
  3.     UINT32 intSave; 
  4.     LosQueueCB *queueCB = (LosQueueCB *)NULL
  5.     LosTaskCB *resumedTask = (LosTaskCB *)NULL
  6.  
  7. ⑴  if (queueID >= LOSCFG_BASE_IPC_QUEUE_LIMIT) { 
  8.         return LOS_ERRNO_QUEUE_MAIL_HANDLE_INVALID; 
  9.     } 
  10.  
  11.     if (mailPool == NULL) { 
  12.         return LOS_ERRNO_QUEUE_MAIL_PTR_INVALID; 
  13.     } 
  14.  
  15.     intSave = LOS_IntLock(); 
  16.  
  17. ⑵  if (LOS_MemboxFree(mailPool, mailMem)) { 
  18.         LOS_IntRestore(intSave); 
  19.         return LOS_ERRNO_QUEUE_MAIL_FREE_ERROR; 
  20.     } 
  21.  
  22. ⑶  queueCB = GET_QUEUE_HANDLE(queueID); 
  23.     if (queueCB->queueState == OS_QUEUE_UNUSED) { 
  24.         LOS_IntRestore(intSave); 
  25.         return LOS_ERRNO_QUEUE_NOT_CREATE; 
  26.     } 
  27.  
  28. ⑷  if (!LOS_ListEmpty(&queueCB->memList)) { 
  29. ⑸      resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->memList)); 
  30.         OsSchedTaskWake(resumedTask); 
  31. ⑹      mem = LOS_MemboxAlloc(mailPool); 
  32.         if (mem == NULL) { 
  33.             LOS_IntRestore(intSave); 
  34.             return LOS_ERRNO_QUEUE_NO_MEMORY; 
  35.         } 
  36. ⑺      resumedTask->msg = mem; 
  37.         LOS_IntRestore(intSave); 
  38.         LOS_Schedule(); 
  39.     } else { 
  40.         LOS_IntRestore(intSave); 
  41.     } 
  42.     return LOS_OK; 

小結(jié)

本文帶領(lǐng)大家一起剖析了鴻蒙輕內(nèi)核的隊列模塊的QueueMail兩個接口的源代碼。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-06-04 14:15:10

鴻蒙HarmonyOS應(yīng)用

2021-06-04 09:57:49

鴻蒙HarmonyOS應(yīng)用

2022-01-12 10:50:23

鴻蒙HarmonyOS應(yīng)用

2022-01-10 15:31:44

鴻蒙HarmonyOS應(yīng)用

2021-05-12 09:45:20

鴻蒙HarmonyOS應(yīng)用

2021-10-20 16:08:57

鴻蒙HarmonyOS應(yīng)用

2021-05-25 09:28:34

鴻蒙HarmonyOS應(yīng)用

2021-05-08 15:14:50

鴻蒙HarmonyOS應(yīng)用

2021-05-17 09:28:59

鴻蒙HarmonyOS應(yīng)用

2021-05-31 20:30:55

鴻蒙HarmonyOS應(yīng)用

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-03 18:28:28

Harmony進(jìn)程任務(wù)管理模塊

2022-03-11 20:23:14

鴻蒙源碼分析進(jìn)程管理

2021-05-21 09:25:11

鴻蒙HarmonyOS應(yīng)用

2021-06-09 09:48:01

鴻蒙HarmonyOS應(yīng)用

2021-05-27 09:43:56

鴻蒙HarmonyOS應(yīng)用

2021-05-11 09:54:55

鴻蒙HarmonyOS應(yīng)用

2021-07-06 09:45:03

鴻蒙HarmonyOS應(yīng)用

2022-01-14 08:39:47

鴻蒙HarmonyOS應(yīng)用

2021-05-10 15:05:56

鴻蒙HarmonyOS應(yīng)用
點贊
收藏

51CTO技術(shù)棧公眾號

一区二区影视| 狠狠操夜夜操| 93在线视频精品免费观看| 亚洲一区二三区| 色综合久久影院| 亚洲自拍偷拍av| jizzjizz亚洲中国少妇| 欧美一区二区免费视频| 国产精品45p| 中文字幕日本精品| 交视频在线观看国产| 成人短片线上看| 亚洲精品美女久久久| 91偷拍一区二区三区精品| 综合网在线视频| 国产原创精品| 麻豆精品国产传媒mv男同| 婷婷综合六月| 欧美极品videos大乳护士| 久久久久久穴| 久久久三级国产网站| 欧美伊人久久久久久午夜久久久久| 精品国产一区探花在线观看| 色偷偷av亚洲男人的天堂| 亚洲第一福利专区| 久草热久草热线频97精品| 亚洲精品国产成人影院| 欧洲在线视频一区| 久久精品综合| 欧美国产日韩一区二区在线观看| 欧美久久在线观看| 国模视频一区二区| 三级资源在线| 暴力调教一区二区三区| 国产精品黄视频| 黄色永久免费网站| 日本午夜一区二区| 国产日韩久久| 亚洲欧美日韩精品一区二区| 色偷偷亚洲男人天堂| 国产精品久久一区二区三区不卡| 国产在线播放一区| 欧美日韩精品免费看| 伦一区二区三区中文字幕v亚洲| 亚洲区在线播放| 99久re热视频精品98| 成人福利在线看| 国产精品夜间视频香蕉| 成人午夜私人影院| www.久草| 国内精品400部情侣激情| 国产精品我不卡| 精品久久国产老人久久综合| 三级中文字幕在线观看| 91精品国产一区二区人妖| 久久亚洲精品小早川怜子| 日本不卡影院| 国产日韩在线看片| 亚洲国产天堂| 97视频网站入口| 欧美天堂亚洲电影院在线观看| 久久久久久久久一区| 成人综合婷婷国产精品久久免费| 99热最新网址| 2021中文字幕在线| 欧美人在线观看| 羞羞的视频网站| 成年无码av片在线| www久久日com| 一区二区免费视频| 91综合视频| 国产a一区二区| 国产农村妇女毛片精品久久莱园子| 伊人久久av导航| 99久久婷婷国产综合精品| 中文字幕第88页| 欧美日韩激情在线| 高潮久久久久久久久久久久久久| 欧美一乱一性一交一视频| 欧美aaaa视频| 国产精品无码av在线播放| 一本大道久久a久久综合婷婷| 国产精品任我爽爆在线播放| 亚洲网址你懂得| 成人在线观看a| 亚洲欧美日韩系列| 色呦呦久久久| 国产二区视频在线| 国产欧美久久久久久| 国产成人精品一区二区三区视频| 国产精品自产拍高潮在线观看| 老司机免费视频一区二区三区| eeuss鲁片一区| 亚洲午夜精品久久久久久久久久久久| 久久在线视频免费观看| 免费在线观看的av网站| 8x国产一区二区三区精品推荐| 欧美中文字幕一区二区三区| 激情图片在线观看高清国产| 久久成人av网站| 蜜桃一区二区三区在线观看| 一区二区欧美精品| 国产精品麻豆成人av电影艾秋| av三级在线播放| 亚洲精品高清无码视频| 亚洲高清乱码| 久久综合色综合88| 蜜桃精品噜噜噜成人av| 神马久久资源| 18videosex性欧美麻豆| 午夜男人视频在线观看| 怡红院av亚洲一区二区三区h| 成人欧美在线观看| 久久久亚洲欧洲日产国码aⅴ| 亚洲电影第1页| 欧美日韩国产精选| 香蕉乱码成人久久天堂爱免费| 26uuuu精品一区二区| 日韩电影网1区2区| 婷婷伊人综合| 9999在线视频| 亚洲国产一区在线| 精品性高朝久久久久久久| 国产乱码精品一区二区三| 青春草在线免费视频| 免费在线观看黄色| 亚洲级视频在线观看免费1级| 国产精品久久一区二区三区不卡| 国产精品户外野外| 亚洲国产精品成人久久综合一区| 日本欧美不卡| 日本天堂免费a| 日韩精品中文字幕有码专区| 国产自产高清不卡| 欧美日夜夜逼| 庆余年2免费日韩剧观看大牛| 91年精品国产| 91麻豆精品一二三区在线| 丁香色欲久久久久久综合网| 精品在线欧美视频| 成人性生交大片免费看视频在线| 国产日韩电影| 精品久久一二三| 美女视频久久黄| 久久精品夜夜夜夜久久| 天堂av一区| 国产va在线| 久久综合九色综合97婷婷| 国产精品久久久久久久久动漫 | 国产美女福利在线观看| 黄色片久久久久| 欧美视频观看一区| 欧美中文字幕在线观看| 日韩精品高清在线| 91丨九色丨黑人外教| 久久久久久久久久久久久久| 亚洲欧洲专区| 第84页国产精品| 福利片在线看| 中文字幕日产av一二三区| 日韩av电影在线观看| 日本三级视频在线观看| 91免费在线观看网站| 色乱码一区二区三区88| 在线成人黄色| 国产v日韩v欧美v| 777777av| 国产精品久在线观看| 欧美电影免费网站| 国产无遮挡又黄又爽免费软件| 国产日韩欧美另类| 精品国产乱码久久久久久久久| 国产精品中文字幕一区二区三区| 国产一区2区在线观看| 黑巨人与欧美精品一区| 精品视频在线观看| 色妞欧美日韩在线| 午夜精品久久久久久久99樱桃| 亚洲专区在线| 欧洲亚洲精品久久久久| 在线黄色国产视频| 青青在线免费视频| 日韩美女毛茸茸| 亚洲精品在线观看网站| 久久综合色鬼综合色| 在线电影一区二区| 日本肉肉一区 | 亚洲成人av电影在线| 福利在线导航136| 成人中文字幕av| 91久久精品美女高潮| 800av在线免费观看| 亚洲精品国产精品久久| 日韩小视频在线观看| 亚洲精品国产无套在线观| 国内精品久久久久久久影视麻豆| 黄色漫画在线免费看| 四虎成人在线视频| 亚洲精品久久区二区三区蜜桃臀 | 日本中文字幕一区二区|