rpms/alsa-lib/FC-5 alsa-lib-1.0.10-ainit-3.patch, NONE, 1.1 alsa-lib.spec, 1.43, 1.44 alsa-lib-1.0.10-ainit-2.patch, 1.1, NONE

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Thu Jun 1 10:04:34 UTC 2006


Author: stransky

Update of /cvs/dist/rpms/alsa-lib/FC-5
In directory cvs.devel.redhat.com:/tmp/cvs-serv11543

Modified Files:
	alsa-lib.spec 
Added Files:
	alsa-lib-1.0.10-ainit-3.patch 
Removed Files:
	alsa-lib-1.0.10-ainit-2.patch 
Log Message:
fixed releasing shared semaphore

alsa-lib-1.0.10-ainit-3.patch:
 pcm_direct.c |   17 ++++++-----
 pcm_direct.h |    7 +++-
 pcm_dmix.c   |   87 +++++++++++++++++++++++++++++++++++++++++++++++++----------
 pcm_dshare.c |   78 +++++++++++++++++++++++++++++++++++++++++++++-------
 pcm_dsnoop.c |   74 ++++++++++++++++++++++++++++++++++++++++++++------
 5 files changed, 220 insertions(+), 43 deletions(-)

--- NEW FILE alsa-lib-1.0.10-ainit-3.patch ---
--- alsa-lib-1.0.10/src/pcm/pcm_direct.h.ainit	2005-09-01 19:31:52.000000000 +0200
+++ alsa-lib-1.0.10/src/pcm/pcm_direct.h	2005-11-24 15:36:53.000000000 +0100
@@ -79,7 +79,10 @@
 
 struct snd_pcm_direct {
 	snd_pcm_type_t type;		/* type (dmix, dsnoop, dshare) */
-	key_t ipc_key;			/* IPC key for semaphore and memory */
+	key_t ipc_mem_direct;		/* IPC key for first memory - for pcm_direct.c */
+	key_t ipc_mem_plug;		/* IPC key for second memory - for dmix/dsnoop/... */
+	key_t ipc_sem;			/* IPC key for semaphore */
+	int share_ipc_key;              /* old ipc_key style */
 	mode_t ipc_perm;		/* IPC socket permissions */
 	int ipc_gid;			/* IPC socket gid */
 	int semid;			/* IPC global semaphore identification */
@@ -135,7 +138,7 @@
 static inline int snd_pcm_direct_semaphore_discard(snd_pcm_direct_t *dmix)
 {
 	if (dmix->semid >= 0) {
-		if (semctl(dmix->semid, 0, IPC_RMID, NULL) < 0)
+		if (dmix->share_ipc_key && semctl(dmix->semid, 0, IPC_RMID, NULL) < 0)
 			return -errno;
 		dmix->semid = -1;
 	}
--- alsa-lib-1.0.10/src/pcm/pcm_dmix.c.ainit	2005-09-19 14:37:08.000000000 +0200
+++ alsa-lib-1.0.10/src/pcm/pcm_dmix.c	2005-11-24 15:00:05.000000000 +0100
@@ -74,12 +74,12 @@
 	       dmix->shmptr->s.buffer_size *
 	       sizeof(signed int);	
 retryshm:
-	dmix->u.dmix.shmid_sum = shmget(dmix->ipc_key + 1, size,
-					IPC_CREAT | dmix->ipc_perm);
+	dmix->u.dmix.shmid_sum = shmget(dmix->ipc_mem_plug, size, 
+                                        IPC_CREAT | dmix->ipc_perm);
 	err = -errno;
 	if (dmix->u.dmix.shmid_sum < 0) {
 		if (errno == EINVAL)
-		if ((tmpid = shmget(dmix->ipc_key + 1, 0, dmix->ipc_perm)) != -1)
+		if ((tmpid = shmget(dmix->ipc_mem_plug, 0, dmix->ipc_perm)) != -1)
 		if (!shmctl(tmpid, IPC_STAT, &buf))
 	    	if (!buf.shm_nattch) 
 		/* no users so destroy the segment */
@@ -119,8 +119,10 @@
 	if (shmctl(dmix->u.dmix.shmid_sum, IPC_STAT, &buf) < 0)
 		return -errno;
 	if (buf.shm_nattch == 0) {	/* we're the last user, destroy the segment */
-		if (shmctl(dmix->u.dmix.shmid_sum, IPC_RMID, NULL) < 0)
-			return -errno;
+		if (dmix->share_ipc_key) {
+			if (shmctl(dmix->u.dmix.shmid_sum, IPC_RMID, NULL) < 0)
+				return -errno;
+                }
 		ret = 1;
 	}
 	dmix->u.dmix.shmid_sum = -1;
@@ -744,7 +746,12 @@
  *          changed in future.
  */
 int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
-		      key_t ipc_key, mode_t ipc_perm, int ipc_gid,
+                      key_t ipc_sem,
+                      key_t ipc_mem_direct,
+                      key_t ipc_mem_plug,
+                      int share_ipc_key,
+                      mode_t ipc_perm,
+		      int ipc_gid,
 		      struct slave_params *params,
 		      snd_config_t *bindings,
 		      int slowptr,
@@ -773,9 +780,15 @@
 	if (ret < 0)
 		goto _err_nosem;
 	
-	dmix->ipc_key = ipc_key;
+	dmix->ipc_sem = ipc_sem;
+        dmix->ipc_mem_direct = ipc_mem_direct;
+        dmix->ipc_mem_plug = ipc_mem_plug;
+
 	dmix->ipc_perm = ipc_perm;
 	dmix->ipc_gid = ipc_gid;
+
+        dmix->share_ipc_key = share_ipc_key;
+
 	dmix->semid = -1;
 	dmix->shmid = -1;
 
@@ -1049,7 +1062,10 @@
 	snd_config_t *slave = NULL, *bindings = NULL, *sconf;
 	struct slave_params params;
 	int bsize, psize, ipc_key_add_uid = 0, slowptr = 0;
-	key_t ipc_key = 0;
+	key_t ipc_sem = 0;
+	key_t ipc_mem_direct = 0;
+	key_t ipc_mem_plug = 0;
+	int share_ipc_key = 0;
 	mode_t ipc_perm = 0600;
 	int ipc_gid = -1;
 	int err;
@@ -1068,7 +1084,40 @@
 
 				return err;
 			}
-			ipc_key = key;
+			ipc_sem = key;
+			ipc_mem_direct = key;
+		        ipc_mem_plug = key+1;
+                        share_ipc_key = 1;
+			continue;
+		}
+		if (strcmp(id, "ipc_sem") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key_mem must be an integer type");
+				return err;
+			}
+			ipc_sem = key;
+			continue;
+		}
+		if (strcmp(id, "ipc_mem_direct") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key_mem must be an integer type");
+				return err;
+			}
+			ipc_mem_direct = key;
+			continue;
+		}
+		if (strcmp(id, "ipc_mem_plug") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key_mem must be an integer type");
+				return err;
+			}
+			ipc_mem_plug = key;
 			continue;
 		}
 		if (strcmp(id, "ipc_perm") == 0) {
@@ -1140,12 +1189,19 @@
 		SNDERR("slave is not defined");
 		return -EINVAL;
 	}
-	if (ipc_key_add_uid)
-		ipc_key += getuid();
-	if (!ipc_key) {
-		SNDERR("Unique IPC key is not defined");
+	if (share_ipc_key && ipc_key_add_uid) {
+		ipc_sem += getuid();
+		ipc_mem_direct += getuid();
+		ipc_mem_plug += getuid();
+        }
+	if (!ipc_sem || !ipc_mem_direct || !ipc_mem_plug) {
+		SNDERR("Unique IPC keys are not defined");
 		return -EINVAL;
 	}
+        if(share_ipc_key && ipc_sem != ipc_mem_direct && ipc_sem != ipc_mem_plug) {
+                SNDERR("New and old IPC keys can't be mixed");
+                return -EINVAL;
+        }
 	/* the default settings, it might be invalid for some hardware */
 	params.format = SND_PCM_FORMAT_S16;
 	params.rate = 48000;
@@ -1181,7 +1237,10 @@
 	params.period_size = psize;
 	params.buffer_size = bsize;
 
-	err = snd_pcm_dmix_open(pcmp, name, ipc_key, ipc_perm, ipc_gid, &params, bindings, slowptr, root, sconf, stream, mode);
+	err = snd_pcm_dmix_open(pcmp, name,
+                                ipc_sem, ipc_mem_direct, ipc_mem_plug, share_ipc_key, 
+                                ipc_perm, ipc_gid, 
+                                &params, bindings, slowptr, root, sconf, stream, mode);
 	if (err < 0)
 		snd_config_delete(sconf);
 	return err;
--- alsa-lib-1.0.10/src/pcm/pcm_dshare.c.ainit	2005-11-01 14:35:52.000000000 +0100
+++ alsa-lib-1.0.10/src/pcm/pcm_dshare.c	2005-11-24 15:00:05.000000000 +0100
@@ -589,7 +589,12 @@
  *          changed in future.
  */
 int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
-			key_t ipc_key, mode_t ipc_perm, int ipc_gid,
+                        key_t ipc_sem,
+                        key_t ipc_mem_direct,
+                        key_t ipc_mem_plug,
+                        int share_ipc_key,
+                        mode_t ipc_perm, 
+                        int ipc_gid,
 			struct slave_params *params,
 			snd_config_t *bindings,
 			int slowptr,
@@ -624,10 +629,16 @@
 		ret = -EINVAL;
 		goto _err_nosem;
 	}
+
+        dshare->ipc_sem = ipc_sem;
+        dshare->ipc_mem_direct = ipc_mem_direct;
+        dshare->ipc_mem_plug = ipc_mem_plug;
 	
-	dshare->ipc_key = ipc_key;
 	dshare->ipc_perm = ipc_perm;
 	dshare->ipc_gid = ipc_gid;
+
+        dshare->share_ipc_key = share_ipc_key;
+
 	dshare->semid = -1;
 	dshare->shmid = -1;
 
@@ -833,8 +844,11 @@
 	snd_config_t *slave = NULL, *bindings = NULL, *sconf;
 	struct slave_params params;
 	int bsize, psize, ipc_key_add_uid = 0, slowptr = 0;
-	key_t ipc_key = 0;
+        key_t ipc_sem = 0;
+        key_t ipc_mem_direct = 0;
+        key_t ipc_mem_plug = 0;
 	mode_t ipc_perm = 0600;
+        int share_ipc_key = 0;
 	int ipc_gid = -1;
 	
 	int err;
@@ -852,7 +866,40 @@
 				SNDERR("The field ipc_key must be an integer type");
 				return err;
 			}
-			ipc_key = key;
+			ipc_sem = key;
+			ipc_mem_direct = key;
+			ipc_mem_plug = key+1;
+			share_ipc_key = 1;
+			continue;
+		}
+		if (strcmp(id, "ipc_sem") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key must be an integer type");
+				return err;
+			}
+			ipc_sem = key;
+			continue;
+		}
+		if (strcmp(id, "ipc_mem_direct") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key must be an integer type");
+				return err;
+			}
+			ipc_mem_direct = key;
+			continue;
+		}
+		if (strcmp(id, "ipc_mem_plug") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key must be an integer type");
+				return err;
+			}
+			ipc_mem_plug = key;
 			continue;
 		}
 		if (strcmp(id, "ipc_perm") == 0) {
@@ -927,12 +974,19 @@
 		SNDERR("slave is not defined");
 		return -EINVAL;
 	}
-	if (ipc_key_add_uid)
-		ipc_key += getuid();
-	if (!ipc_key) {
-		SNDERR("Unique IPC key is not defined");
-		return -EINVAL;
-	}
+	if (ipc_key_add_uid) {
+                ipc_sem += getuid();
+                ipc_mem_direct += getuid();
+                ipc_mem_plug += getuid();				
+	}
+        if (!ipc_sem || !ipc_mem_direct || !ipc_mem_plug) {
+                SNDERR("Unique IPC keys are not defined");
+                return -EINVAL;
+        }
+        if(share_ipc_key && ipc_sem != ipc_mem_direct && ipc_sem != ipc_mem_plug) {
+                SNDERR("New and old IPC keys can't be mixed");
+                return -EINVAL;
+        }
 	/* the default settings, it might be invalid for some hardware */
 	params.format = SND_PCM_FORMAT_S16;
 	params.rate = 48000;
@@ -959,7 +1013,9 @@
 
 	params.period_size = psize;
 	params.buffer_size = bsize;
-	err = snd_pcm_dshare_open(pcmp, name, ipc_key, ipc_perm, ipc_gid, &params, bindings, slowptr, root, sconf, stream, mode);
+	err = snd_pcm_dshare_open(pcmp, name, 
+                                  ipc_sem, ipc_mem_direct, ipc_mem_plug, share_ipc_key, 
+                                  ipc_perm, ipc_gid, &params, bindings, slowptr, root, sconf, stream, mode);
 	if (err < 0)
 		snd_config_delete(sconf);
 	return err;
--- alsa-lib-1.0.10/src/pcm/pcm_direct.c.ainit	2005-09-19 14:37:08.000000000 +0200
+++ alsa-lib-1.0.10/src/pcm/pcm_direct.c	2005-11-24 15:00:05.000000000 +0100
@@ -60,8 +60,9 @@
 	struct semid_ds buf;
 	int i;
 
-	dmix->semid = semget(dmix->ipc_key, DIRECT_IPC_SEMS,
-			     IPC_CREAT | dmix->ipc_perm);
+        dmix->semid = semget(dmix->ipc_sem, DIRECT_IPC_SEMS,
+                             IPC_CREAT | dmix->ipc_perm);
+
 	if (dmix->semid < 0)
 		return -errno;
 	if (dmix->ipc_gid < 0)
@@ -90,12 +91,12 @@
 	int tmpid, err;
 	
 retryget:
-	dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t),
-			     IPC_CREAT | dmix->ipc_perm);
+	dmix->shmid = shmget(dmix->ipc_mem_direct, sizeof(snd_pcm_direct_share_t), 
+                             IPC_CREAT | dmix->ipc_perm);
 	err = -errno;
 	if (dmix->shmid < 0){
 		if (errno == EINVAL)
-		if ((tmpid = shmget(dmix->ipc_key, 0, dmix->ipc_perm)) != -1)
+		if ((tmpid = shmget(dmix->ipc_mem_direct, 0, dmix->ipc_perm)) != -1)
 		if (!shmctl(tmpid, IPC_STAT, &buf))
 		if (!buf.shm_nattch)
 	    	/* no users so destroy the segment */
@@ -144,8 +145,10 @@
 	if (shmctl(dmix->shmid, IPC_STAT, &buf) < 0)
 		return -errno;
 	if (buf.shm_nattch == 0) {	/* we're the last user, destroy the segment */
-		if (shmctl(dmix->shmid, IPC_RMID, NULL) < 0)
-			return -errno;
+                if(dmix->share_ipc_key) {
+                   if (shmctl(dmix->shmid, IPC_RMID, NULL) < 0)
+                      return -errno;
+                }
 		ret = 1;
 	}
 	dmix->shmid = -1;
--- alsa-lib-1.0.10/src/pcm/pcm_dsnoop.c.ainit	2005-11-01 14:35:52.000000000 +0100
+++ alsa-lib-1.0.10/src/pcm/pcm_dsnoop.c	2005-11-24 15:00:05.000000000 +0100
@@ -485,7 +485,12 @@
  *          changed in future.
  */
 int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
-			key_t ipc_key, mode_t ipc_perm, int ipc_gid,
+                        key_t ipc_sem,
+                        key_t ipc_mem_direct,
+                        key_t ipc_mem_plug,
+                        int share_ipc_key,
+                        mode_t ipc_perm, 
+                        int ipc_gid,
 			struct slave_params *params,
 			snd_config_t *bindings,
 			int slowptr,
@@ -513,9 +518,15 @@
 	if (ret < 0)
 		goto _err_nosem;
 	
-	dsnoop->ipc_key = ipc_key;
+        dsnoop->ipc_sem = ipc_sem;
+        dsnoop->ipc_mem_direct = ipc_mem_direct;
+        dsnoop->ipc_mem_plug = ipc_mem_plug;
+
 	dsnoop->ipc_perm = ipc_perm;
 	dsnoop->ipc_gid = ipc_gid;
+
+        dsnoop->share_ipc_key = share_ipc_key;
+
 	dsnoop->semid = -1;
 	dsnoop->shmid = -1;
 
@@ -711,7 +722,10 @@
 	snd_config_t *slave = NULL, *bindings = NULL, *sconf;
 	struct slave_params params;
 	int bsize, psize, ipc_key_add_uid = 0, slowptr = 0;
-	key_t ipc_key = 0;
+	key_t ipc_sem = 0;
+	key_t ipc_mem_direct = 0;
+	key_t ipc_mem_plug = 0;
+	int share_ipc_key = 0;
 	mode_t ipc_perm = 0600;
 	int ipc_gid = -1;
 	int err;
@@ -730,9 +744,42 @@
 				SNDERR("The field ipc_key must be an integer type");
 				return err;
 			}
-			ipc_key = key;
+			ipc_sem = key;
+			ipc_mem_direct = key;
+		        ipc_mem_plug = key+1;
+			share_ipc_key = 1;
 			continue;
 		}
+                if (strcmp(id, "ipc_sem") == 0) {
+                        long key;
+                        err = snd_config_get_integer(n, &key);
+                        if (err < 0) {
+                                SNDERR("The field ipc_key must be an integer type");
+                                return err;
+                        }
+                        ipc_sem = key;
+                        continue;
+                }	
+		if (strcmp(id, "ipc_mem_direct") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key_mem must be an integer type");
+				return err;
+			}
+			ipc_mem_direct = key;
+			continue;
+		}
+		if (strcmp(id, "ipc_mem_plug") == 0) {
+			long key;
+			err = snd_config_get_integer(n, &key);
+			if (err < 0) {
+				SNDERR("The field ipc_key_mem must be an integer type");
+				return err;
+			}
+			ipc_mem_plug = key;
+			continue;
+		}	
 		if (strcmp(id, "ipc_perm") == 0) {
 			char *perm;
 			char *endp;
@@ -805,12 +852,19 @@
 		SNDERR("slave is not defined");
 		return -EINVAL;
 	}
-	if (ipc_key_add_uid)
-		ipc_key += getuid();
-	if (!ipc_key) {
-		SNDERR("Unique IPC key is not defined");
+	if (share_ipc_key && ipc_key_add_uid) {
+                ipc_sem += getuid();
+                ipc_mem_direct += getuid();
+                ipc_mem_plug += getuid();
+	}
+	if (!ipc_sem || !ipc_mem_direct || !ipc_mem_plug) {
+		SNDERR("Unique IPC keys are not defined");
 		return -EINVAL;
 	}
+        if(share_ipc_key && ipc_sem != ipc_mem_direct && ipc_sem != ipc_mem_plug) {
+                SNDERR("New and old IPC keys can't be mixed");
+                return -EINVAL;
+        }
 	/* the default settings, it might be invalid for some hardware */
 	params.format = SND_PCM_FORMAT_S16;
 	params.rate = 48000;
@@ -837,7 +891,9 @@
 
 	params.period_size = psize;
 	params.buffer_size = bsize;
-	err = snd_pcm_dsnoop_open(pcmp, name, ipc_key, ipc_perm, ipc_gid, &params, bindings, slowptr, root, sconf, stream, mode);
+	err = snd_pcm_dsnoop_open(pcmp, name, 
+                                  ipc_sem, ipc_mem_direct, ipc_mem_plug, share_ipc_key,
+                                  ipc_perm, ipc_gid, &params, bindings, slowptr, root, sconf, stream, mode);
 	if (err < 0)
 		snd_config_delete(sconf);
 	return err;


Index: alsa-lib.spec
===================================================================
RCS file: /cvs/dist/rpms/alsa-lib/FC-5/alsa-lib.spec,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- alsa-lib.spec	11 Feb 2006 01:33:41 -0000	1.43
+++ alsa-lib.spec	1 Jun 2006 10:04:32 -0000	1.44
@@ -5,12 +5,12 @@
 Summary: The Advanced Linux Sound Architecture (ALSA) library.
 Name:    alsa-lib
 Version: %{version_main}
-Release: 3.rc2.2
+Release: 4.rc2
 License: LGPL
 Group:   System Environment/Libraries
 Source:  ftp://ftp.alsa-project.org/pub/lib/%{name}-%{version_main}%{?prever}.tar.bz2
 Source1: ainit-%{version_ainit}.tar.gz
-Patch0:  alsa-lib-1.0.10-ainit-2.patch
+Patch0:  alsa-lib-1.0.10-ainit-3.patch
 Patch1:  alsa-lib-1.0.11-group.patch
 Patch2:  alsa-lib-1.0.11-ainit-start.patch
 URL:     http://www.alsa-project.org/
@@ -149,6 +149,9 @@
 %{_datadir}/aclocal/alsa.m4
 
 %changelog
+* Thu Jun 1 2006 Martin Stransky <stransky at redhat.com> 1.0.11-4.rc2
+- fixed releasing shared semaphore
+
 * Fri Feb 10 2006 Jesse Keating <jkeating at redhat.com> - 1.0.11-3.rc2.2
 - bump again for double-long bug on ppc(64)
 


--- alsa-lib-1.0.10-ainit-2.patch DELETED ---




More information about the fedora-cvs-commits mailing list