上层app多线程操作驱动时驱动的一些改动
第一个就是现在上层应用去多线程操作驱动时会失败,这是由于驱动层互斥的问题,换句话说,驱动要去支持上层应用的多线程操作,则驱动中要加相应的互斥锁。
第二个就是多线程操作时,会牵扯到全局数据的不同进程进程操作。这样就要对open和release函数进行改动,因为每个线程都会去open和close节点,此时必定会调用open和release函数,如果release中做了一些对全局变量或者标志的撤销或改变,那就要注意了。
假设有A,B两个线程去open和close节点,两个是并行的去访问,此时A线程早于B线程close的节点,那么也将通过release函数改变了一些全局的变量资源,但此时B线程还在操作这个在使用这写全局资源,这样就会导致B线程出问题,
为了避免这些问题,可以做一个计数器来保证open和release的动作是一致的,即只有最后一个线程close节点时调用release执行时才让其撤销所有的全局资源。即每open一次,全局计数器flag++,每close一次flag--,当release检测到flag = 0时即可执行真正的撤销动作。
eg:
static RET_CODE dev_open(struct inode *inode, struct file *file)
{
UINT8 dev_idx = 0;
dev_idx = MINOR(inode->i_rdev);
if(dev_idx >= MAX_TUNER_SUPPORT_NUM)
PRINTF(LOG_DBG,"[%s]line=%d,dev_idx set error!\n", __FUNCTION__, __LINE__);
return ERR_FAILED;
}
my_dev_priv[dev_idx]->dev_used++;//使用计数器记录open次数
file->private_data = (void *)&my_dev[dev_idx];
return RET_SUCCESS;
}
-------------------------------------------------------------------------------------------------------------------------------
RET_CODE dev_release(struct inode *inode, struct file *file)
{
struct my_device *dev = file->private_data;
struct my_private *priv = dev->priv;
priv->nim_used--;//每调用一次close即flag--,然后检测是否是最后一次close,若不是直接退出,若是,执行真正的注销动作
if(priv->dev_used)
return RET_SUCCESS;
if (priv->opened && priv->dev_close)
{
priv->dev_close();
}
dev_ctrl(dev, DEMOD_CTRL_0X90);
dev_set_acq_workmode(dev, OPTR_HW_CLOSE);
//g_work_alive = 0;
priv->work_alive = 0;
if (dev->work_queue)
{
flush_workqueue(dev->work_queue);
destroy_workqueue(dev->work_queue);
dev->work_queue = NULL;
}
if (dev->workqueue)
{
flush_workqueue(dev->workqueue);
destroy_workqueue(dev->workqueue);
dev->workqueue = NULL;
}
priv->dev_init = FALSE;
return RET_SUCCESS;
}