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, ¶ms, 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,
+ ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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