[svn-commits] kpfleming: branch mogorman/zaptel-1.2-transcoder r2050 - in /team/mogorman/za...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Wed Jan 31 09:45:17 MST 2007


Author: kpfleming
Date: Wed Jan 31 10:45:17 2007
New Revision: 2050

URL: http://svn.digium.com/view/zaptel?view=rev&rev=2050
Log:
use bitfields instead of flag definitions
attempt to automatically release references when fds to channels are closed

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=2050&r1=2049&r2=2050
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c (original)
+++ team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c Wed Jan 31 10:45:17 2007
@@ -642,7 +642,7 @@
 			compl_ztc = &(wc->uencode->channels[st->timeslot_in_num >> 1]);
 
 		/* If the channel complement (other half of the encoder/decoder pair) is not being used... */
-		if ((compl_ztc->flags & ZT_TC_FLAG_BUSY) == 0) {
+		if (!compl_ztc->busy) {
 			if (st->encoder)
 				destroy_channel(wc, st->chan_in_num, st->chan_out_num);
 			else

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=2050&r1=2049&r2=2050
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/zaptel.h (original)
+++ team/mogorman/zaptel-1.2-transcoder/zaptel.h Wed Jan 31 10:45:17 2007
@@ -746,7 +746,7 @@
 
 	__u32 magic;		/* Magic value -- ZT_TRANSCODE_MAGIC, read by user */
 	__u32 config;		/* Read/write by user */
-	__u32 status;		/* Read/write by user */
+	__u32 busy:1;		/* Read/write by user */
 	__u8 userhdr[ZT_TRANSCODE_HDRLEN - (sizeof(__u32) * 14)];	/* Storage for user parameters */
 	__u8 srcdata[ZT_TRANSCODE_BUFSIZ / 2];	/* Storage of source data */
 	__u8 dstdata[ZT_TRANSCODE_BUFSIZ / 2];	/* Storage of destination data */
@@ -1408,16 +1408,16 @@
 	wait_queue_head_t ready;
 	int errorstatus;
 	int offset;
-	unsigned int chan_built;
+	unsigned int chan_built:1;
+	unsigned int have_reference:1;
+	unsigned int busy:1;
+	unsigned int transient:1;
 	unsigned int built_fmts;
 	unsigned int flags;
 	unsigned int srcfmt;
 	unsigned int dstfmt;
 	struct zt_transcode_header *tch;
 };
-
-#define ZT_TC_FLAG_BUSY       (1 << 0)
-#define ZT_TC_FLAG_TRANSIENT  (1 << 1)
 
 struct zt_transcoder {
 	struct list_head list;

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=2050&r1=2049&r2=2050
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/zttranscode.c (original)
+++ team/mogorman/zaptel-1.2-transcoder/zttranscode.c Wed Jan 31 10:45:17 2007
@@ -157,7 +157,7 @@
 	if (debug)
 		printk("ZT Transcoder Alert!\n");
 	if (ztc->tch)
-		ztc->tch->status &= ~ZT_TC_FLAG_BUSY;
+		ztc->tch->busy = 0;
 	wake_up_interruptible(&ztc->ready);
 
 	return 0;
@@ -179,7 +179,8 @@
 	
 	memset(ztc, 0, sizeof(*ztc));
 	memset(zth, 0, sizeof(*zth));
-	ztc->flags = ZT_TC_FLAG_TRANSIENT | ZT_TC_FLAG_BUSY;
+	ztc->transient = 1;
+	ztc->busy = 1;
 	ztc->tch = zth;
 	if (debug)
 		printk("Allocated Transcoder Channel, header is at %p!\n", zth);
@@ -201,7 +202,7 @@
 	if (!ztc)
 		return;
 
-	ztc->flags &= ~(ZT_TC_FLAG_BUSY);
+	ztc->busy = 0;
 
 	if (ztc->tch) {
 		for (page = virt_to_page(zth);
@@ -212,9 +213,13 @@
 	}
 
 	ztc->tch = NULL;
-	/* Actually reset the transcoder channel */
-	if (ztc->flags & ZT_TC_FLAG_TRANSIENT)
+
+	if (ztc->have_reference)
+		module_put(ztc->parent->owner);
+
+	if (ztc->transient);
 		kfree(ztc);
+
 	if (debug)
 		printk("Released Transcoder!\n");
 }
@@ -247,16 +252,19 @@
 
 			match = 1;
 			for (x = 0; x < tc->numchannels; x++) {
-				if (tc->channels[x].flags & ZT_TC_FLAG_BUSY)
+				if (tc->channels[x].busy)
 					continue;
-				if ((tc->channels[x].chan_built) && ((zth->srcfmt | zth->dstfmt) != tc->channels[x].built_fmts))
+
+				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;
+				newztc->busy = 1;
+				newztc->have_reference = 1;
 				break;
 			}
 		}
@@ -270,7 +278,7 @@
 		(*ztc) = newztc;
 		(*ztc)->tch = origztc->tch;
 		origztc->tch = NULL;
-		(*ztc)->flags |= (origztc->flags & ~(ZT_TC_FLAG_TRANSIENT));
+		(*ztc)->transient = 0;
 		ztc_release(origztc);
 	}
 
@@ -286,7 +294,7 @@
 	int ret;
 
 	for (;;) {
-		if (!(ztc->tch->status & ZT_TC_FLAG_BUSY))
+		if (!(ztc->tch->busy))
 			return 0;
 		if ((ret = schluffen(&ztc->ready)))
 			return ret;
@@ -346,13 +354,14 @@
 		break;
 	case ZT_TCOP_RELEASE:
 		ret = ztc->parent->operation(ztc, ZT_TCOP_RELEASE);
-		module_put(ztc->parent->owner);
+		if (ztc->have_reference)
+			module_put(ztc->parent->owner);
 		break;
 	case ZT_TCOP_TRANSCODE:
 		if (!ztc->parent->operation)
 			return -EINVAL;
 
-		ztc->tch->status |= ZT_TC_FLAG_BUSY;
+		ztc->tch->busy = 1;
 		if (!(ret = ztc->parent->operation(ztc, ZT_TCOP_TRANSCODE))) {
 			/* Wait for busy to go away if we are in blocking mode */
 			if (!(file->f_flags & O_NONBLOCK)) {
@@ -360,7 +369,7 @@
 					ret = ztc->errorstatus;
 			}
 		} else
-			ztc->tch->status &= ~ZT_TC_FLAG_BUSY;
+			ztc->tch->busy = 0;
 		break;
 	default:
 		ret = -ENOSYS;
@@ -422,7 +431,7 @@
 
 	poll_wait(file, &ztc->ready, wait_table);
 
-	return ztc->tch->status & ZT_TC_FLAG_BUSY ? 0 : POLLPRI;
+	return ztc->tch->busy ? 0 : POLLPRI;
 }
 
 struct file_operations __zt_transcode_fops = {



More information about the svn-commits mailing list