版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xclshwd/article/details/91373560
1、接口说明
2、测试用例
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <string>
#include "list.h"
typedef int (*pCallback)(); //函数指针
struct MEDIA_DATA_CALLBACK_S{
struct list_head list;
pCallback cbFunc;
void *cbArgs;
};
struct list_head g_VideoCbList;
static int OnTestCall1()
{
printf("OnTestCall 1\n");
return 0;
}
static int OnTestCall2()
{
printf("OnTestCall 2\n");
return 0;
}
static int OnTestCall3()
{
printf("OnTestCall 3\n");
return 0;
}
void AddList(pCallback cbFunc, void *cbArgs)
{
struct MEDIA_DATA_CALLBACK_S *_this,*next;
list_for_each_entry_safe(_this,next,&g_VideoCbList,list)
{
if((_this->cbFunc == cbFunc)&&(_this->cbArgs == cbArgs))
{
printf("callback func is exist\n");
return ;
}
}
/*申请元素节点插入队列*/
struct MEDIA_DATA_CALLBACK_S* mediaDataCb = (struct MEDIA_DATA_CALLBACK_S *)malloc(sizeof(struct MEDIA_DATA_CALLBACK_S));
if(mediaDataCb)
{
mediaDataCb->cbFunc = cbFunc;
mediaDataCb->cbArgs = cbArgs;
//list_add(&mediaDataCb->list,&g_VideoCbList);
list_add_tail(&mediaDataCb->list,&g_VideoCbList);
}
}
void DelList(pCallback cbFunc, void *cbArgs)
{
struct MEDIA_DATA_CALLBACK_S *_this,*next;
list_for_each_entry_safe(_this,next,&g_VideoCbList,list)
{
if((_this->cbFunc == cbFunc)&&(_this->cbArgs == cbArgs))
{
printf("list_del_init \n");
list_del_init(&_this->list);
free(_this);
_this = NULL;
break;
}
}
}
void TEST_1()
{
//初始化列表
INIT_LIST_HEAD(&g_VideoCbList);
int listcount = 1;
//注册回调函数
AddList(OnTestCall1,&listcount);
int listcount1 = 2;
AddList(OnTestCall2,&listcount1);
int listcount2 = 3;
AddList(OnTestCall3,&listcount2);
//调用回调函数
struct MEDIA_DATA_CALLBACK_S *mediaDataCb,*next;
list_for_each_entry_safe(mediaDataCb,next,&g_VideoCbList,list)
{
if(mediaDataCb)
{
mediaDataCb->cbFunc();
}
}
//删除回调list
DelList(OnTestCall2, &listcount1);
//调用回调函数
struct MEDIA_DATA_CALLBACK_S *mediaDataCb1,*next2;
list_for_each_entry_safe(mediaDataCb1,next2,&g_VideoCbList,list)
{
if(mediaDataCb1)
{
mediaDataCb1->cbFunc();
}
}
}
int main()
{
TEST_1();
return 0;
}