From a7fd397819dec088f0250332bf60e469964e5166 Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 21 Nov 2008 13:15:53 +0000 Subject: [PATCH] Better isolation of server and clients system resources to allow starting the server in several user account at the same time. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3094 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 4 ++++ common/shm.c | 25 ++++++++++++++--------- linux/alsa/JackAlsaDriver.cpp | 1 + linux/firewire/JackFFADODriver.cpp | 1 + linux/freebob/JackFreebobDriver.cpp | 1 + macosx/JackMachClientChannel.cpp | 5 +++-- macosx/JackMachSemaphore.cpp | 3 ++- macosx/JackMachServerChannel.cpp | 3 ++- macosx/JackMachServerNotifyChannel.cpp | 3 ++- posix/JackFifo.cpp | 7 ++----- posix/JackPosixSemaphore.cpp | 3 ++- posix/JackSocket.cpp | 11 +++++----- windows/JackWinEvent.cpp | 3 ++- windows/JackWinSemaphore.cpp | 3 ++- windows/portaudio/JackPortAudioDriver.cpp | 1 + 15 files changed, 46 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2f5149a4..bbdcb4a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,10 @@ Michael Voigt Jackdmp changes log --------------------------- +2008-11-31 Stephane Letz + + * 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 * Libjack shutdown handler does not "deactivate" (fActive = false) the client anymore, so that jack_deactivate correctly does the job later on. diff --git a/common/shm.c b/common/shm.c index a5c0af15..840699b1 100644 --- a/common/shm.c +++ b/common/shm.c @@ -32,7 +32,7 @@ */ #include "JackConstants.h" - + #ifdef WIN32 #include #else @@ -57,6 +57,17 @@ #include "shm.h" #include "JackError.h" +static int GetUID() +{ +#ifdef WIN32 + return _getpid(); + //#error "No getuid function available" +#else + return getuid(); +#endif +} + + #ifdef USE_POSIX_SHM static jack_shmtype_t jack_shmtype = shm_POSIX; #elif WIN32 @@ -263,14 +274,8 @@ jack_shm_validate_registry () static void jack_set_server_prefix (const char *server_name) { -#ifdef WIN32 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 @@ -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 * 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)) { 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; } - snprintf (name, sizeof (name), "jack-%d", registry->index); + snprintf (name, sizeof (name), "jack-%d-%d", GetUID(), registry->index); if (strlen (name) >= sizeof (registry->id)) { jack_error ("shm segment name too long %s", name); diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index 2e336b8c..4ab26716 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -2262,6 +2262,7 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, fPlaybackChannels = ((alsa_driver_t *)fDriver)->playback_nchannels; return 0; } else { + JackAudioDriver::Close(); return -1; } } diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp index b2f233d3..6d199886 100644 --- a/linux/firewire/JackFFADODriver.cpp +++ b/linux/firewire/JackFFADODriver.cpp @@ -695,6 +695,7 @@ int JackFFADODriver::Open(ffado_jack_settings_t *params) //fPlaybackChannels = ((ffado_driver_t *)fDriver)->playback_nchannels_audio; return 0; } else { + JackAudioDriver::Close(); return -1; } } diff --git a/linux/freebob/JackFreebobDriver.cpp b/linux/freebob/JackFreebobDriver.cpp index 8881e66c..186e9d0a 100644 --- a/linux/freebob/JackFreebobDriver.cpp +++ b/linux/freebob/JackFreebobDriver.cpp @@ -827,6 +827,7 @@ int JackFreebobDriver::Open(freebob_jack_settings_t *params) fPlaybackChannels = ((freebob_driver_t *)fDriver)->playback_nchannels_audio; return 0; } else { + JackAudioDriver::Close(); return -1; } } diff --git a/macosx/JackMachClientChannel.cpp b/macosx/JackMachClientChannel.cpp index 17866ee9..360c8231 100644 --- a/macosx/JackMachClientChannel.cpp +++ b/macosx/JackMachClientChannel.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackMachClientChannel.h" #include "JackRPCEngine.h" +#include "JackTools.h" #include "JackRPCClientServer.c" #include "JackError.h" #include "JackLibClient.h" @@ -43,7 +44,7 @@ int JackMachClientChannel::ServerCheck(const char* server_name) { jack_log("JackMachClientChannel::ServerCheck = %s", server_name); 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 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); 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 if (!fServerPort.ConnectPort(jack_server_entry_name)) { diff --git a/macosx/JackMachSemaphore.cpp b/macosx/JackMachSemaphore.cpp index 3e902752..67df3edb 100644 --- a/macosx/JackMachSemaphore.cpp +++ b/macosx/JackMachSemaphore.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "JackMachSemaphore.h" +#include "JackTools.h" #include "JackError.h" #include @@ -28,7 +29,7 @@ mach_port_t JackMachSemaphore::fBootPort = 0; 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() diff --git a/macosx/JackMachServerChannel.cpp b/macosx/JackMachServerChannel.cpp index fc86e265..84d87b93 100644 --- a/macosx/JackMachServerChannel.cpp +++ b/macosx/JackMachServerChannel.cpp @@ -17,6 +17,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "JackTools.h" #include "JackMachServerChannel.h" #include "JackRPCEngineServer.c" #include "JackError.h" @@ -41,7 +42,7 @@ int JackMachServerChannel::Open(const char* server_name, JackServer* server) { jack_log("JackMachServerChannel::Open"); 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 jack_error("Cannot check in Jack server"); diff --git a/macosx/JackMachServerNotifyChannel.cpp b/macosx/JackMachServerNotifyChannel.cpp index 926011a9..ab686c57 100644 --- a/macosx/JackMachServerNotifyChannel.cpp +++ b/macosx/JackMachServerNotifyChannel.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackMachServerNotifyChannel.h" #include "JackRPCEngineUser.c" +#include "JackTools.h" #include "JackConstants.h" #include "JackError.h" #include @@ -30,7 +31,7 @@ int JackMachServerNotifyChannel::Open(const char* server_name) { jack_log("JackMachServerChannel::Open"); 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)) { jack_error("Cannot connect to server port"); diff --git a/posix/JackFifo.cpp b/posix/JackFifo.cpp index 58f0fff2..d2528c4d 100644 --- a/posix/JackFifo.cpp +++ b/posix/JackFifo.cpp @@ -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 "JackTools.h" #include "JackError.h" #include "JackConstants.h" #include @@ -35,7 +32,7 @@ namespace Jack 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() diff --git a/posix/JackPosixSemaphore.cpp b/posix/JackPosixSemaphore.cpp index 96e72ffe..ae59afe0 100644 --- a/posix/JackPosixSemaphore.cpp +++ b/posix/JackPosixSemaphore.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "JackPosixSemaphore.h" +#include "JackTools.h" #include "JackConstants.h" #include "JackError.h" #include @@ -29,7 +30,7 @@ namespace Jack 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() diff --git a/posix/JackSocket.cpp b/posix/JackSocket.cpp index 5c57e984..cc122042 100644 --- a/posix/JackSocket.cpp +++ b/posix/JackSocket.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "JackSocket.h" +#include "JackTools.h" #include "JackError.h" #include #include @@ -67,7 +68,7 @@ int JackClientSocket::Connect(const char* dir, const char* name, int which) // A } 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); 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; - 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); 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; // 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); /* 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... - 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); /* if (access(addr.sun_path, F_OK) == 0) { @@ -258,7 +259,7 @@ JackClientSocket* JackServerSocket::Accept() memset(&client_addr, 0, 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) { jack_error("Cannot accept new connection err = %s", strerror(errno)); return 0; diff --git a/windows/JackWinEvent.cpp b/windows/JackWinEvent.cpp index d8cc3db2..dd31c539 100644 --- a/windows/JackWinEvent.cpp +++ b/windows/JackWinEvent.cpp @@ -18,6 +18,7 @@ This program is free software; you can redistribute it and/or modify */ #include "JackWinEvent.h" +#include "JackTools.h" #include "JackError.h" #include @@ -29,7 +30,7 @@ namespace Jack 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() diff --git a/windows/JackWinSemaphore.cpp b/windows/JackWinSemaphore.cpp index cea74c2e..a70fb990 100644 --- a/windows/JackWinSemaphore.cpp +++ b/windows/JackWinSemaphore.cpp @@ -18,6 +18,7 @@ This program is free software; you can redistribute it and/or modify */ #include "JackWinSemaphore.h" +#include "JackTools.h" #include "JackError.h" #include @@ -26,7 +27,7 @@ namespace Jack 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() diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index 8a87c9e2..5bcaad9c 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -173,6 +173,7 @@ namespace Jack return 0; error: + JackAudioDriver::Close(); jack_error ( "Can't open default PortAudio device : %s", Pa_GetErrorText(err) ); return -1; }