[svn-commits] kpfleming: branch mogorman/zaptel-1.2-transcoder
r2049 - in /team/mogorman/za...
svn-commits at lists.digium.com
svn-commits at lists.digium.com
Wed Jan 31 09:17:10 MST 2007
Author: kpfleming
Date: Wed Jan 31 10:17:09 2007
New Revision: 2049
URL: http://svn.digium.com/view/zaptel?view=rev&rev=2049
Log:
manage reference counts on transcoder modules when there are channels open in them
Modified:
team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c
team/mogorman/zaptel-1.2-transcoder/zaptel.h
team/mogorman/zaptel-1.2-transcoder/zttranscode.c
Modified: team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c
URL: http://svn.digium.com/view/zaptel/team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c?view=diff&rev=2049&r1=2048&r2=2049
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c (original)
+++ team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c Wed Jan 31 10:17:09 2007
@@ -1489,8 +1489,8 @@
wc->udecode->channels[x].pvt = &decoders[x];
}
- zt_transcoder_register(wc->uencode);
- zt_transcoder_register(wc->udecode);
+ zt_transcoder_register(wc->uencode, THIS_MODULE);
+ zt_transcoder_register(wc->udecode, THIS_MODULE);
/* Enable bus mastering */
pci_set_master(pdev);
Modified: team/mogorman/zaptel-1.2-transcoder/zaptel.h
URL: http://svn.digium.com/view/zaptel/team/mogorman/zaptel-1.2-transcoder/zaptel.h?view=diff&rev=2049&r1=2048&r2=2049
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/zaptel.h (original)
+++ team/mogorman/zaptel-1.2-transcoder/zaptel.h Wed Jan 31 10:17:09 2007
@@ -1421,6 +1421,7 @@
struct zt_transcoder {
struct list_head list;
+ struct module *owner;
char name[80];
int numchannels;
unsigned int srcfmts;
@@ -1484,7 +1485,7 @@
void zt_transcoder_free(struct zt_transcoder *ztc);
/* Register a transcoder */
-int zt_transcoder_register(struct zt_transcoder *tc);
+int zt_transcoder_register(struct zt_transcoder *tc, struct module *owner);
/* Unregister a transcoder */
int zt_transcoder_unregister(struct zt_transcoder *tc);
Modified: team/mogorman/zaptel-1.2-transcoder/zttranscode.c
URL: http://svn.digium.com/view/zaptel/team/mogorman/zaptel-1.2-transcoder/zttranscode.c?view=diff&rev=2049&r1=2048&r2=2049
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/zttranscode.c (original)
+++ team/mogorman/zaptel-1.2-transcoder/zttranscode.c Wed Jan 31 10:17:09 2007
@@ -105,8 +105,7 @@
kfree(ztc);
}
-/* Register a transcoder */
-int zt_transcoder_register(struct zt_transcoder *tc)
+int zt_transcoder_register(struct zt_transcoder *tc, struct module *owner)
{
struct zt_transcoder *cur;
@@ -118,6 +117,7 @@
}
}
+ tc->owner = owner;
list_add(&tc->list, &trans);
printk("Registered codec translator '%s' with %d transcoders (srcs=%08x, dsts=%08x)\n",
tc->name, tc->numchannels, tc->srcfmts, tc->dstfmts);
@@ -172,7 +172,7 @@
if (!(ztc = kmalloc(sizeof(*ztc), GFP_KERNEL)))
return -ENOMEM;
- if (!(zth = kmalloc(sizeof(*zth), GFP_KERNEL | GFP_DMA))) {
+ if (!(zth = kmalloc(sizeof(*zth), GFP_KERNEL))) {
kfree(ztc);
return -ENOMEM;
}
@@ -203,7 +203,7 @@
ztc->flags &= ~(ZT_TC_FLAG_BUSY);
- if(ztc->tch) {
+ if (ztc->tch) {
for (page = virt_to_page(zth);
page < virt_to_page((unsigned long) zth + sizeof(*zth));
page++)
@@ -226,7 +226,7 @@
return 0;
}
-static int do_reset(struct zt_transcoder_channel **ztc)
+static int do_allocate(struct zt_transcoder_channel **ztc)
{
struct zt_transcoder_channel *newztc = NULL, *origztc = NULL;
struct zt_transcode_header *zth = (*ztc)->tch;
@@ -252,6 +252,9 @@
if ((tc->channels[x].chan_built) && ((zth->srcfmt | zth->dstfmt) != tc->channels[x].built_fmts))
continue;
+ if (!try_module_get(tc->owner))
+ continue;
+
newztc = &tc->channels[x];
newztc->flags = ZT_TC_FLAG_BUSY;
break;
@@ -338,12 +341,12 @@
ret = zt_tc_getinfo(data);
break;
case ZT_TCOP_ALLOCATE:
- /* Reset transcoder, possibly changing who we point to */
- ret = do_reset(&ztc);
+ ret = do_allocate(&ztc);
file->private_data = ztc;
break;
case ZT_TCOP_RELEASE:
ret = ztc->parent->operation(ztc, ZT_TCOP_RELEASE);
+ module_put(ztc->parent->owner);
break;
case ZT_TCOP_TRANSCODE:
if (!ztc->parent->operation)
@@ -351,7 +354,7 @@
ztc->tch->status |= ZT_TC_FLAG_BUSY;
if (!(ret = ztc->parent->operation(ztc, ZT_TCOP_TRANSCODE))) {
- /* Wait for busy to go away if we're not non-blocking */
+ /* Wait for busy to go away if we are in blocking mode */
if (!(file->f_flags & O_NONBLOCK)) {
if (!(ret = wait_busy(ztc)))
ret = ztc->errorstatus;
@@ -418,6 +421,7 @@
return -EINVAL;
poll_wait(file, &ztc->ready, wait_table);
+
return ztc->tch->status & ZT_TC_FLAG_BUSY ? 0 : POLLPRI;
}
@@ -456,7 +460,7 @@
}
#ifdef LINUX26
-module_param(debug, int, 0600);
+module_param(debug, int, S_IRUGO | S_IWUSR);
#else
MODULE_PARM(debug, "i");
#endif
More information about the svn-commits
mailing list