对AEECallback结构体及其基础函数的分析

本文详细解析了AEECallback结构体及其相关函数的工作原理。包括AEECallback_Setup、AEECallback_Fire和AEECallback_CancelNotify等函数的作用及内部实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

----2006.1.22

typedef struct _AEECallback AEECallback;
struct _AEECallback
{
 AEECallback *pNext;  //保留,并且调用程序不得修改此成员
 void        *pmc;  //保留,并且调用程序不得修改此成员
 PFNCBCANCEL  pfnCancel;  //回调被取消时,指向回调处理程序所调用函数的指针。调用程序必须将此指针设置为 NULL。
 void        *pCancelData; //传递给 pfnCancel 的数据。 调用程序不得修改此成员。
 PFNNOTIFY    pfnNotify;  //AEE 调用的回调函数。调用程序必须将此指针设为指向 AEE 回调处理程序所调用的函数。
 void        *pNotifyData; //传递给 pfnNotify 的数据,调用程序必须将此指针设为指向须传递给 pfnNotify函数的数据。
 void        *pReserved;  //保留,并由回调处理程序使用此成员
};
该结构体,前两个参数pNext和pmc都是不可修改的,是系统维护其值;pfnCancel和pCancelData是在取消回调时使用的;pfnNotify和pNotifyData是在回调时使用的;最后一个pReserved是保留参数,可以存储任何数据。

AEECallback_Setup函数:
1、通过CALLBACK_Cancel宏调用了pcb中的pfnCancel函数。
2、给pfnCancel赋值,给pCancelData赋值
3、给pReserved赋值,其值是pfnCancelNotify
备注:猜想该函数的功能就是为pcb结构体赋值,按次序分别是pfnCancel、pCancelData、pReserved

static void AEECallback_Setup(AEECallback *pcb, PFNCBCANCEL pfnCancel,
                              void *pvCancel, PFNSCHEDNOTIFY pfnCancelNotify)
{
   CALLBACK_Cancel(pcb);
   pcb->pfnCancel   = pfnCancel;
   pcb->pCancelData = pvCancel;
   pcb->pReserved   = (void *)pfnCancelNotify;
}

AEECallback_Fire函数:
1、把参数强制类型转换为AEECallback类型
2、把pfnCancel赋值为0
3、调用pfnNotify函数
备注:猜想该函数的功能就是调用notify函数

static void AEECallback_Fire(void *pvCxt)
{
   AEECallback *pcb = (AEECallback *)pvCxt;

   pcb->pfnCancel = 0;
   pcb->pfnNotify(pcb->pNotifyData);
}

AEECallback_CancelNotify函数:
1、从pReserved指针中取出保存的pfnCancelNofity,并且强制类型转换,猜想该成员的职责就是保存一些需要保存的指针
2、把pfnCancel置为0
3、调用pfnCancelNotify函数
备注:该函数其实就是要调用其中的CancelNotify函数,只是该函数指针保存在了void类型的pReserved成员里头,需要进行强制类型转换,注意的一点是在调用notify类函数的时候都把pfcCancel置为了0,不知道是何用意

static void AEECallback_CancelNotify(AEECallback *pcb)
{
   PFNSCHEDNOTIFY pfnCancelNotify = (PFNSCHEDNOTIFY)pcb->pReserved;

   pcb->pfnCancel = 0;
   pfnCancelNotify(pcb->pCancelData, AEECallback_Fire, pcb);
}

AEECallback_SchedNotifyWait函数:
1、先通过AEECallback_Setup函数来填充pcb结构体
2、再调用pfnSched函数
备注:不明白这个函数什么意思

void AEECallback_SchedNotifyWait(AEECallback *pcb, void *pSchedNotifyObj,
                                 PFNSCHEDNOTIFY pfnSched,
                                 PFNSCHEDNOTIFY pfnCancel)
{
   AEECallback_Setup(pcb, AEECallback_CancelNotify, pSchedNotifyObj, pfnCancel);
   pfnSched(pSchedNotifyObj, AEECallback_Fire, pcb);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值