wow-singleton文件说明

wow-singleton文件说明

  • 项目地址:https://gitee.com/wow-iot/wow-iot7
  • 内部使用atomic原子操作,支持接口初始化与退出只被执行1次 ,不被重复执行;

初始化与退出:

typedef struct{
	singleton_exit_func_t  exit;	 
	atomic_t 	           instance;    				 
}__data_aligned__ Singleton_T;

static bool gb_singletonInited = false;
static Singleton_T gst_singletons[SINGLETON_TYPE_MAXN] = {{0}};

int _wow_singleton_init(void)
{
	if(gb_singletonInited == false){
		memset(&gst_singletons, 0, sizeof(gst_singletons));	
		gb_singletonInited = true;
	}

	return 0;
}

int _wow_singleton_exit(void)
{
	size_t i = SINGLETON_TYPE_MAXN;
	while (i--)
	{
		if (gst_singletons[i].exit){
			int instance = atomic_get(&gst_singletons[i].instance);
			if (instance && instance == 1 && gst_singletons[i].exit) {	
				gst_singletons[i].exit();
			}
		}
	}
	memset(&gst_singletons, 0, sizeof(gst_singletons));

	return 0;
}

接口执行

int wow_singleton_instance(SingletonType_E eIndex, singleton_init_func_t fInit, singleton_exit_func_t fExit)
{
	CHECK_RET_VAL_P(eIndex < SINGLETON_TYPE_MAXN, -PARAM_INPUT_ARG_INVALID, "param input arg invalid!\n");
	CHECK_RET_VAL_P(fInit, -PARAM_INPUT_FUNC_IS_NULL, "param input func invalid!\n");


	bool instance = atomic_compare_and_swap_bool(&gst_singletons[eIndex].instance, 0, 1);
	CHECK_RET_VAL(instance && gst_singletons[eIndex].instance == 1,0);

	CHECK_RET_VAL_P(fInit() == 0, -WOW_CB_FAILED,"eIndex(%d) init failed!\n",eIndex);

	atomic_set(&gst_singletons[eIndex].instance,1);
	gst_singletons[eIndex].exit = fExit;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值