skypopen: OSS driver has active timers only on active devices (eg: when it's actually used by a skypeclient)
This commit is contained in:
parent
5a0f43d956
commit
eb79128d8e
|
@ -203,6 +203,9 @@ static int skypopen_c_open(struct inode *inode, struct file *filp)
|
||||||
/* look for a skypopenc device in the list */
|
/* look for a skypopenc device in the list */
|
||||||
spin_lock(&skypopen_c_lock);
|
spin_lock(&skypopen_c_lock);
|
||||||
dev = skypopen_c_lookfor_device(key);
|
dev = skypopen_c_lookfor_device(key);
|
||||||
|
if (dev){
|
||||||
|
dev->opened++;
|
||||||
|
}
|
||||||
spin_unlock(&skypopen_c_lock);
|
spin_unlock(&skypopen_c_lock);
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
|
@ -215,10 +218,30 @@ static int skypopen_c_open(struct inode *inode, struct file *filp)
|
||||||
|
|
||||||
static int skypopen_c_release(struct inode *inode, struct file *filp)
|
static int skypopen_c_release(struct inode *inode, struct file *filp)
|
||||||
{
|
{
|
||||||
/*
|
dev_t key;
|
||||||
* Nothing to do, because the device is persistent.
|
struct skypopen_dev *dev = filp->private_data;
|
||||||
* A `real' cloned device should be freed on last close
|
int ret;
|
||||||
*/
|
|
||||||
|
key = current->tgid;
|
||||||
|
|
||||||
|
spin_lock(&skypopen_c_lock);
|
||||||
|
dev->opened--;
|
||||||
|
spin_unlock(&skypopen_c_lock);
|
||||||
|
|
||||||
|
if(!dev->opened){
|
||||||
|
#ifdef WANT_HRTIMER
|
||||||
|
if(dev->timer_inq_started){
|
||||||
|
ret = hrtimer_cancel( &dev->timer_inq );
|
||||||
|
//printk( "Stopped skypopen OSS driver read HRtimer skype client:(%d) ret=%d\n", key, ret);
|
||||||
|
dev->timer_inq_started=0;
|
||||||
|
}
|
||||||
|
if(dev->timer_outq_started){
|
||||||
|
ret = hrtimer_cancel( &dev->timer_outq );
|
||||||
|
//printk( "Stopped skypopen OSS driver write HRtimer skype client:(%d) ret=%d\n", key, ret);
|
||||||
|
dev->timer_outq_started=0;
|
||||||
|
}
|
||||||
|
#endif// WANT_HRTIMER
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,6 +254,9 @@ static ssize_t skypopen_read(struct file *filp, char __user *buf, size_t count,
|
||||||
{
|
{
|
||||||
DEFINE_WAIT(wait);
|
DEFINE_WAIT(wait);
|
||||||
struct skypopen_dev *dev = filp->private_data;
|
struct skypopen_dev *dev = filp->private_data;
|
||||||
|
dev_t key;
|
||||||
|
|
||||||
|
key = current->tgid;
|
||||||
|
|
||||||
if(unload)
|
if(unload)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -244,6 +270,7 @@ static ssize_t skypopen_read(struct file *filp, char __user *buf, size_t count,
|
||||||
dev->timer_inq.function = &my_hrtimer_callback_inq;
|
dev->timer_inq.function = &my_hrtimer_callback_inq;
|
||||||
hrtimer_start( &dev->timer_inq, ktime_inq, HRTIMER_MODE_REL );
|
hrtimer_start( &dev->timer_inq, ktime_inq, HRTIMER_MODE_REL );
|
||||||
dev->timer_inq_started = 1;
|
dev->timer_inq_started = 1;
|
||||||
|
//printk( "Started skypopen OSS driver read HRtimer skype client:(%d) \n", key);
|
||||||
}
|
}
|
||||||
#endif// WANT_HRTIMER
|
#endif// WANT_HRTIMER
|
||||||
|
|
||||||
|
@ -259,6 +286,9 @@ static ssize_t skypopen_write(struct file *filp, const char __user *buf, size_t
|
||||||
{
|
{
|
||||||
DEFINE_WAIT(wait);
|
DEFINE_WAIT(wait);
|
||||||
struct skypopen_dev *dev = filp->private_data;
|
struct skypopen_dev *dev = filp->private_data;
|
||||||
|
dev_t key;
|
||||||
|
|
||||||
|
key = current->tgid;
|
||||||
|
|
||||||
if(unload)
|
if(unload)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -272,6 +302,7 @@ static ssize_t skypopen_write(struct file *filp, const char __user *buf, size_t
|
||||||
dev->timer_outq.function = &my_hrtimer_callback_outq;
|
dev->timer_outq.function = &my_hrtimer_callback_outq;
|
||||||
hrtimer_start( &dev->timer_outq, ktime_outq, HRTIMER_MODE_REL );
|
hrtimer_start( &dev->timer_outq, ktime_outq, HRTIMER_MODE_REL );
|
||||||
dev->timer_outq_started = 1;
|
dev->timer_outq_started = 1;
|
||||||
|
//printk( "Started skypopen OSS driver write HRtimer skype client:(%d) \n", key);
|
||||||
}
|
}
|
||||||
#endif// WANT_HRTIMER
|
#endif// WANT_HRTIMER
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ struct skypopen_dev {
|
||||||
#endif// WANT_HRTIMER
|
#endif// WANT_HRTIMER
|
||||||
int timer_inq_started;
|
int timer_inq_started;
|
||||||
int timer_outq_started;
|
int timer_outq_started;
|
||||||
|
int opened;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue