git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3094 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.1
@@ -23,6 +23,10 @@ Michael Voigt | |||||
Jackdmp changes log | Jackdmp changes log | ||||
--------------------------- | --------------------------- | ||||
2008-11-31 Stephane Letz <letz@grame.fr> | |||||
* Better isolation of server and clients system resources to allow starting the server in several user account at the same time. | |||||
2008-11-19 Stephane Letz <letz@grame.fr> | 2008-11-19 Stephane Letz <letz@grame.fr> | ||||
* Libjack shutdown handler does not "deactivate" (fActive = false) the client anymore, so that jack_deactivate correctly does the job later on. | * Libjack shutdown handler does not "deactivate" (fActive = false) the client anymore, so that jack_deactivate correctly does the job later on. | ||||
@@ -32,7 +32,7 @@ | |||||
*/ | */ | ||||
#include "JackConstants.h" | #include "JackConstants.h" | ||||
#ifdef WIN32 | #ifdef WIN32 | ||||
#include <process.h> | #include <process.h> | ||||
#else | #else | ||||
@@ -57,6 +57,17 @@ | |||||
#include "shm.h" | #include "shm.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
static int GetUID() | |||||
{ | |||||
#ifdef WIN32 | |||||
return _getpid(); | |||||
//#error "No getuid function available" | |||||
#else | |||||
return getuid(); | |||||
#endif | |||||
} | |||||
#ifdef USE_POSIX_SHM | #ifdef USE_POSIX_SHM | ||||
static jack_shmtype_t jack_shmtype = shm_POSIX; | static jack_shmtype_t jack_shmtype = shm_POSIX; | ||||
#elif WIN32 | #elif WIN32 | ||||
@@ -263,14 +274,8 @@ jack_shm_validate_registry () | |||||
static void | static void | ||||
jack_set_server_prefix (const char *server_name) | jack_set_server_prefix (const char *server_name) | ||||
{ | { | ||||
#ifdef WIN32 | |||||
snprintf (jack_shm_server_prefix, sizeof (jack_shm_server_prefix), | snprintf (jack_shm_server_prefix, sizeof (jack_shm_server_prefix), | ||||
"jack-%d:%s:", _getpid (), server_name); // steph TO CHECK | |||||
#else | |||||
snprintf (jack_shm_server_prefix, sizeof (jack_shm_server_prefix), | |||||
"/jack-%d:%s:", getuid (), server_name); | |||||
#endif | |||||
"jack-%d:%s:", GetUID(), server_name); | |||||
} | } | ||||
/* gain server addressability to shared memory registration segment | /* gain server addressability to shared memory registration segment | ||||
@@ -770,7 +775,7 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si) | |||||
* registry index for uniqueness and ignore the shm_name | * registry index for uniqueness and ignore the shm_name | ||||
* parameter. Bah! | * parameter. Bah! | ||||
*/ | */ | ||||
snprintf (name, sizeof (name), "/jackmp-%d", registry->index); | |||||
snprintf (name, sizeof (name), "/jack-%d-%d", GetUID(), registry->index); | |||||
if (strlen (name) >= sizeof (registry->id)) { | if (strlen (name) >= sizeof (registry->id)) { | ||||
jack_error ("shm segment name too long %s", name); | jack_error ("shm segment name too long %s", name); | ||||
@@ -959,7 +964,7 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si) | |||||
goto unlock; | goto unlock; | ||||
} | } | ||||
snprintf (name, sizeof (name), "jack-%d", registry->index); | |||||
snprintf (name, sizeof (name), "jack-%d-%d", GetUID(), registry->index); | |||||
if (strlen (name) >= sizeof (registry->id)) { | if (strlen (name) >= sizeof (registry->id)) { | ||||
jack_error ("shm segment name too long %s", name); | jack_error ("shm segment name too long %s", name); | ||||
@@ -2262,6 +2262,7 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, | |||||
fPlaybackChannels = ((alsa_driver_t *)fDriver)->playback_nchannels; | fPlaybackChannels = ((alsa_driver_t *)fDriver)->playback_nchannels; | ||||
return 0; | return 0; | ||||
} else { | } else { | ||||
JackAudioDriver::Close(); | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
@@ -695,6 +695,7 @@ int JackFFADODriver::Open(ffado_jack_settings_t *params) | |||||
//fPlaybackChannels = ((ffado_driver_t *)fDriver)->playback_nchannels_audio; | //fPlaybackChannels = ((ffado_driver_t *)fDriver)->playback_nchannels_audio; | ||||
return 0; | return 0; | ||||
} else { | } else { | ||||
JackAudioDriver::Close(); | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
@@ -827,6 +827,7 @@ int JackFreebobDriver::Open(freebob_jack_settings_t *params) | |||||
fPlaybackChannels = ((freebob_driver_t *)fDriver)->playback_nchannels_audio; | fPlaybackChannels = ((freebob_driver_t *)fDriver)->playback_nchannels_audio; | ||||
return 0; | return 0; | ||||
} else { | } else { | ||||
JackAudioDriver::Close(); | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
@@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#include "JackMachClientChannel.h" | #include "JackMachClientChannel.h" | ||||
#include "JackRPCEngine.h" | #include "JackRPCEngine.h" | ||||
#include "JackTools.h" | |||||
#include "JackRPCClientServer.c" | #include "JackRPCClientServer.c" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include "JackLibClient.h" | #include "JackLibClient.h" | ||||
@@ -43,7 +44,7 @@ int JackMachClientChannel::ServerCheck(const char* server_name) | |||||
{ | { | ||||
jack_log("JackMachClientChannel::ServerCheck = %s", server_name); | jack_log("JackMachClientChannel::ServerCheck = %s", server_name); | ||||
char jack_server_entry_name[512]; | char jack_server_entry_name[512]; | ||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s.%d_%s", jack_server_entry, JackTools::GetUID(), server_name); | |||||
// Connect to server | // Connect to server | ||||
if (!fServerPort.ConnectPort(jack_server_entry_name)) { | if (!fServerPort.ConnectPort(jack_server_entry_name)) { | ||||
@@ -58,7 +59,7 @@ int JackMachClientChannel::Open(const char* server_name, const char* name, char* | |||||
{ | { | ||||
jack_log("JackMachClientChannel::Open name = %s", name); | jack_log("JackMachClientChannel::Open name = %s", name); | ||||
char jack_server_entry_name[512]; | char jack_server_entry_name[512]; | ||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s.%d_%s", jack_server_entry, JackTools::GetUID(), server_name); | |||||
// Connect to server | // Connect to server | ||||
if (!fServerPort.ConnectPort(jack_server_entry_name)) { | if (!fServerPort.ConnectPort(jack_server_entry_name)) { | ||||
@@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#include "JackMachSemaphore.h" | #include "JackMachSemaphore.h" | ||||
#include "JackTools.h" | |||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <stdio.h> | #include <stdio.h> | ||||
@@ -28,7 +29,7 @@ mach_port_t JackMachSemaphore::fBootPort = 0; | |||||
void JackMachSemaphore::BuildName(const char* name, const char* server_name, char* res) | void JackMachSemaphore::BuildName(const char* name, const char* server_name, char* res) | ||||
{ | { | ||||
sprintf(res, "jack_mach_sem.%s_%s", server_name, name); | |||||
sprintf(res, "jack_mach_sem.%d_%s_%s", JackTools::GetUID(), server_name, name); | |||||
} | } | ||||
bool JackMachSemaphore::Signal() | bool JackMachSemaphore::Signal() | ||||
@@ -17,6 +17,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#include "JackTools.h" | |||||
#include "JackMachServerChannel.h" | #include "JackMachServerChannel.h" | ||||
#include "JackRPCEngineServer.c" | #include "JackRPCEngineServer.c" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
@@ -41,7 +42,7 @@ int JackMachServerChannel::Open(const char* server_name, JackServer* server) | |||||
{ | { | ||||
jack_log("JackMachServerChannel::Open"); | jack_log("JackMachServerChannel::Open"); | ||||
char jack_server_entry_name[512]; | char jack_server_entry_name[512]; | ||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s.%d_%s", jack_server_entry, JackTools::GetUID(), server_name); | |||||
if (!fServerPort.AllocatePort(jack_server_entry_name, 16)) { // 16 is the max possible value | if (!fServerPort.AllocatePort(jack_server_entry_name, 16)) { // 16 is the max possible value | ||||
jack_error("Cannot check in Jack server"); | jack_error("Cannot check in Jack server"); | ||||
@@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#include "JackMachServerNotifyChannel.h" | #include "JackMachServerNotifyChannel.h" | ||||
#include "JackRPCEngineUser.c" | #include "JackRPCEngineUser.c" | ||||
#include "JackTools.h" | |||||
#include "JackConstants.h" | #include "JackConstants.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <stdio.h> | #include <stdio.h> | ||||
@@ -30,7 +31,7 @@ int JackMachServerNotifyChannel::Open(const char* server_name) | |||||
{ | { | ||||
jack_log("JackMachServerChannel::Open"); | jack_log("JackMachServerChannel::Open"); | ||||
char jack_server_entry_name[512]; | char jack_server_entry_name[512]; | ||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||||
snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s.%d_%s", jack_server_entry, JackTools::GetUID(), server_name); | |||||
if (!fClientPort.ConnectPort(jack_server_entry_name)) { | if (!fClientPort.ConnectPort(jack_server_entry_name)) { | ||||
jack_error("Cannot connect to server port"); | jack_error("Cannot connect to server port"); | ||||
@@ -17,11 +17,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#if defined(HAVE_CONFIG_H) | |||||
#include "config.h" | |||||
#endif | |||||
#include "JackFifo.h" | #include "JackFifo.h" | ||||
#include "JackTools.h" | |||||
#include "JackError.h" | #include "JackError.h" | ||||
#include "JackConstants.h" | #include "JackConstants.h" | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
@@ -35,7 +32,7 @@ namespace Jack | |||||
void JackFifo::BuildName(const char* name, const char* server_name, char* res) | void JackFifo::BuildName(const char* name, const char* server_name, char* res) | ||||
{ | { | ||||
sprintf(res, "%s/jack_fifo.%s_%s", jack_client_dir, server_name, name); | |||||
sprintf(res, "%s/jack_fifo.%d_%s_%s", jack_client_dir, JackTools::GetUID(), server_name, name); | |||||
} | } | ||||
bool JackFifo::Signal() | bool JackFifo::Signal() | ||||
@@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#include "JackPosixSemaphore.h" | #include "JackPosixSemaphore.h" | ||||
#include "JackTools.h" | |||||
#include "JackConstants.h" | #include "JackConstants.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <fcntl.h> | #include <fcntl.h> | ||||
@@ -29,7 +30,7 @@ namespace Jack | |||||
void JackPosixSemaphore::BuildName(const char* name, const char* server_name, char* res) | void JackPosixSemaphore::BuildName(const char* name, const char* server_name, char* res) | ||||
{ | { | ||||
sprintf(res, "jack_sem.%s_%s", server_name, name); | |||||
sprintf(res, "jack_sem.%d_%s_%s", JackTools::GetUID(), server_name, name); | |||||
} | } | ||||
bool JackPosixSemaphore::Signal() | bool JackPosixSemaphore::Signal() | ||||
@@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#include "JackSocket.h" | #include "JackSocket.h" | ||||
#include "JackTools.h" | |||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <string.h> | #include <string.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
@@ -67,7 +68,7 @@ int JackClientSocket::Connect(const char* dir, const char* name, int which) // A | |||||
} | } | ||||
addr.sun_family = AF_UNIX; | addr.sun_family = AF_UNIX; | ||||
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d", dir, name, which); | |||||
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d_%d", dir, name, JackTools::GetUID(), which); | |||||
jack_log("Connect: addr.sun_path %s", addr.sun_path); | jack_log("Connect: addr.sun_path %s", addr.sun_path); | ||||
if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { | if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { | ||||
@@ -96,7 +97,7 @@ int JackClientSocket::Connect(const char* dir, int which) | |||||
} | } | ||||
addr.sun_family = AF_UNIX; | addr.sun_family = AF_UNIX; | ||||
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%d", dir, which); | |||||
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%d_%d", dir, JackTools::GetUID(), which); | |||||
jack_log("Connect: addr.sun_path %s", addr.sun_path); | jack_log("Connect: addr.sun_path %s", addr.sun_path); | ||||
if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { | if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { | ||||
@@ -170,7 +171,7 @@ int JackServerSocket::Bind(const char* dir, const char* name, int which) // A re | |||||
addr.sun_family = AF_UNIX; | addr.sun_family = AF_UNIX; | ||||
// TO CORRECT: always reuse the same name for now... | // TO CORRECT: always reuse the same name for now... | ||||
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d", dir, name, which); | |||||
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d_%d", dir, name, JackTools::GetUID(), which); | |||||
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | ||||
/* | /* | ||||
if (access(addr.sun_path, F_OK) == 0) { | if (access(addr.sun_path, F_OK) == 0) { | ||||
@@ -221,7 +222,7 @@ int JackServerSocket::Bind(const char* dir, int which) // A revoir : utilisation | |||||
*/ | */ | ||||
// TO CORRECT: always reuse the same name for now... | // TO CORRECT: always reuse the same name for now... | ||||
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%d", dir, which); | |||||
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%d_%d", dir, JackTools::GetUID(), which); | |||||
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | ||||
/* | /* | ||||
if (access(addr.sun_path, F_OK) == 0) { | if (access(addr.sun_path, F_OK) == 0) { | ||||
@@ -258,7 +259,7 @@ JackClientSocket* JackServerSocket::Accept() | |||||
memset(&client_addr, 0, sizeof(client_addr)); | memset(&client_addr, 0, sizeof(client_addr)); | ||||
client_addrlen = sizeof(client_addr); | client_addrlen = sizeof(client_addr); | ||||
int fd = accept(fSocket, (struct sockaddr*) & client_addr, &client_addrlen); | |||||
int fd = accept(fSocket, (struct sockaddr*)&client_addr, &client_addrlen); | |||||
if (fd < 0) { | if (fd < 0) { | ||||
jack_error("Cannot accept new connection err = %s", strerror(errno)); | jack_error("Cannot accept new connection err = %s", strerror(errno)); | ||||
return 0; | return 0; | ||||
@@ -18,6 +18,7 @@ This program is free software; you can redistribute it and/or modify | |||||
*/ | */ | ||||
#include "JackWinEvent.h" | #include "JackWinEvent.h" | ||||
#include "JackTools.h" | |||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <assert.h> | #include <assert.h> | ||||
@@ -29,7 +30,7 @@ namespace Jack | |||||
void JackWinEvent::BuildName(const char* name, const char* server_name, char* res) | void JackWinEvent::BuildName(const char* name, const char* server_name, char* res) | ||||
{ | { | ||||
sprintf(res, "jack_pipe.%s_%s", server_name, name); | |||||
sprintf(res, "jack_pipe.%d_%s_%s", JackTools::GetUID(), server_name, name); | |||||
} | } | ||||
bool JackWinEvent::Signal() | bool JackWinEvent::Signal() | ||||
@@ -18,6 +18,7 @@ This program is free software; you can redistribute it and/or modify | |||||
*/ | */ | ||||
#include "JackWinSemaphore.h" | #include "JackWinSemaphore.h" | ||||
#include "JackTools.h" | |||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <stdio.h> | #include <stdio.h> | ||||
@@ -26,7 +27,7 @@ namespace Jack | |||||
void JackWinSemaphore::BuildName(const char* name, const char* server_name, char* res) | void JackWinSemaphore::BuildName(const char* name, const char* server_name, char* res) | ||||
{ | { | ||||
sprintf(res, "jack_pipe.%s_%s", server_name, name); | |||||
sprintf(res, "jack_pipe.%d_%s_%s", JackTools::GetUID(), server_name, name); | |||||
} | } | ||||
bool JackWinSemaphore::Signal() | bool JackWinSemaphore::Signal() | ||||
@@ -173,6 +173,7 @@ namespace Jack | |||||
return 0; | return 0; | ||||
error: | error: | ||||
JackAudioDriver::Close(); | |||||
jack_error ( "Can't open default PortAudio device : %s", Pa_GetErrorText(err) ); | jack_error ( "Can't open default PortAudio device : %s", Pa_GetErrorText(err) ); | ||||
return -1; | return -1; | ||||
} | } | ||||