当前位置:网站首页>OpenHarmony—内核对象事件之源码详解
OpenHarmony—内核对象事件之源码详解
2022-06-28 15:32:00 【InfoQ】
关键数据结构
typedef struct tagEvent {
UINT32 uwEventID;
LOS_DL_LIST stEventList; /**< Event control block linked list */
} EVENT_CB_S, *PEVENT_CB_S;
事件初始化
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
{
if (eventCB == NULL) {
return LOS_ERRNO_EVENT_PTR_NULL;
}
eventCB->uwEventID = 0;
LOS_ListInit(&eventCB->stEventList);
OsHookCall(LOS_HOOK_TYPE_EVENT_INIT, eventCB);
return LOS_OK;
}

事件写操作
LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
{
...
eventCB->uwEventID |= events; ---1
if (!LOS_ListEmpty(&eventCB->stEventList)) { ---2
for (resumedTask = LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext, LosTaskCB, pendList);
&resumedTask->pendList != (&eventCB->stEventList);) { -------3
nextTask = LOS_DL_LIST_ENTRY(resumedTask->pendList.pstNext, LosTaskCB, pendList);
if (((resumedTask->eventMode & LOS_WAITMODE_OR) && (resumedTask->eventMask & events) != 0) ||
((resumedTask->eventMode & LOS_WAITMODE_AND) &&
((resumedTask->eventMask & eventCB->uwEventID) == resumedTask->eventMask))) {
exitFlag = 1;
OsSchedTaskWake(resumedTask); ---4
}
resumedTask = nextTask;
}
if (exitFlag == 1) {
LOS_IntRestore(intSave);
LOS_Schedule(); ---5
return LOS_OK;
}
}
...
}

事件读操作
LITE_OS_SEC_TEXT UINT32 LOS_EventPoll(UINT32 *eventID, UINT32 eventMask, UINT32 mode)
{
UINT32 ret = 0;
UINT32 intSave;
if (eventID == NULL) {
return LOS_ERRNO_EVENT_PTR_NULL;
}
intSave = LOS_IntLock();
if (mode & LOS_WAITMODE_OR) {
if ((*eventID & eventMask) != 0) { ---1
ret = *eventID & eventMask;
}
} else {
if ((eventMask != 0) && (eventMask == (*eventID & eventMask))) { ---2
ret = *eventID & eventMask;
}
}
if (ret && (mode & LOS_WAITMODE_CLR)) { ---3
*eventID = *eventID & ~(ret);
}
LOS_IntRestore(intSave);
return ret;
}
LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeOut)
{
...
ret = LOS_EventPoll(&(eventCB->uwEventID), eventMask, mode); ---1
OsHookCall(LOS_HOOK_TYPE_EVENT_READ, eventCB, eventMask, mode, timeOut);
if (ret == 0) {
if (timeOut == 0) {
LOS_IntRestore(intSave);
return ret;
}
if (g_losTaskLock) {
LOS_IntRestore(intSave);
return LOS_ERRNO_EVENT_READ_IN_LOCK;
}
runTsk = g_losTask.runTask;
runTsk->eventMask = eventMask;
runTsk->eventMode = mode;
OsSchedTaskWait(&eventCB->stEventList, timeOut); ---2
LOS_IntRestore(intSave);
LOS_Schedule(); ---3
intSave = LOS_IntLock();
if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) {
runTsk->taskStatus &= ~OS_TASK_STATUS_TIMEOUT;
LOS_IntRestore(intSave);
return LOS_ERRNO_EVENT_READ_TIMEOUT;
}
ret = LOS_EventPoll(&eventCB->uwEventID, eventMask, mode); ---4
}
...
}

事件销毁操作
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 eventMask)
{
...
eventCB->uwEventID &= eventMask;
...
}
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB)
{
...
eventCB->stEventList.pstNext = (LOS_DL_LIST *)NULL;
eventCB->stEventList.pstPrev = (LOS_DL_LIST *)NULL;
...
}
小结

边栏推荐
- web Worker 轮询请求
- Privacy computing fat - offline prediction
- ROS knowledge points - build an ROS development environment using vscode
- Express template engine
- 看界面控件DevExpress WinForms如何创建一个虚拟键盘
- 石油化工行业供应链系统驱动管理模式创新升级,强化企业内部管理
- How can the digital intelligent supply chain management platform of the smart Park optimize process management and drive the development of the park to increase speed and quality?
- Analysis of PostgreSQL storage structure
- 隆重推出 Qodana:您最爱的 CI 的代码质量平台
- Validate palindrome string
猜你喜欢
当下不做元宇宙,就像20年前没买房!
扩充C盘(将D盘的内存分给C盘)
C语言学习-19-全排列
Innovation and upgrading of supply chain system driven management mode in petrochemical industry and strengthening internal management of enterprises
Experiment 6 8255 parallel interface experiment [microcomputer principle] [experiment]
C语言基础语法
一文教你快速生成MySQL数据库关系图
How to build a 100000 level QPS large flow and high concurrency coupon system from zero
Curve 替换 Ceph 在网易云音乐的实践
What! 一条命令搞定监控?
随机推荐
实验6 8255并行接口实验【微机原理】【实验】
SAP mts/ato/mto/eto topic 9: front and back desk operation in m+m mode, strategy 50, preparation of raw materials and semi-finished products in advance
Grand launch of qodana: your favorite CI code quality platform
论文解读(GCC)《Efficient Graph Convolution for Joint Node RepresentationLearning and Clustering》
MIPS汇编语言学习-03-循环
Fleet | "backstage exploration" issue 3: status management
Oracle11g database uses expdp to back up data every week and upload it to the backup server
环保产品“绿色溢价”高?低碳生活方式离人们还有多远
化学制品制造业智慧供应商管理系统深度挖掘供应商管理领域,提升供应链协同
隆重推出 Qodana:您最爱的 CI 的代码质量平台
从五大能力到 “1+5+N”,华为让政企转型更稳健
Flutter simply implements multilingual internationalization
Talking about open source - Linus and Jim talk about open source in China
当下不做元宇宙,就像20年前没买房!
云杉网络DeepFlow帮助5G核心网和电信云构建可观测性
MIPS assembly language learning-01-sum of two numbers, environment configuration and how to run
Gbase Nantah General Motors appears at the 6th World Intelligence Conference
验证回文串
Not being a meta universe now is like not buying a house 20 years ago!
笔试面试算法经典–最长回文子串