git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2968 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -23,6 +23,10 @@ Michael Voigt | |||
| Jackdmp changes log | |||
| --------------------------- | |||
| 2008-10-09 Stephane Letz <letz@grame.fr> | |||
| * Use a mutex to make jack_client_open/jack_client_close thread safe, remove use of jack_init/jack_uninit. | |||
| 2008-10-08 Stephane Letz <letz@grame.fr> | |||
| * Fix a SMP related bug introduced in rev 2957 : remove the __SMP__ flag and define LOCK for SMP in all cases. | |||
| @@ -390,7 +390,7 @@ EXPORT const char* jack_port_type(const jack_port_t* port) | |||
| } | |||
| } | |||
| EXPORT jack_port_type_id_t jack_port_type_id (const jack_port_t *port) | |||
| EXPORT jack_port_type_id_t jack_port_type_id(const jack_port_t *port) | |||
| { | |||
| #ifdef __CLIENTDEBUG__ | |||
| JackLibGlobals::CheckContext(); | |||
| @@ -24,9 +24,6 @@ | |||
| #include "config.h" | |||
| #endif | |||
| //namespace Jack | |||
| //{ | |||
| #define VERSION "1.90" | |||
| #define BUFFER_SIZE_MAX 8192 | |||
| @@ -91,6 +88,4 @@ | |||
| #define EMPTY 0xFFFD | |||
| #define FREE 0xFFFC | |||
| //} // end of namespace | |||
| #endif | |||
| @@ -19,85 +19,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| #include "JackGlobals.h" | |||
| static bool gKeyRealtimeInitialized = false; | |||
| static bool g_key_log_function_initialized = false; | |||
| jack_tls_key gRealTime; | |||
| jack_tls_key g_key_log_function; | |||
| // Initialisation at library load time | |||
| #ifdef WIN32 | |||
| static void jack_init() | |||
| { | |||
| if (!gKeyRealtimeInitialized) { | |||
| gKeyRealtimeInitialized = jack_tls_allocate_key(&gRealTime); | |||
| } | |||
| if (!g_key_log_function_initialized) | |||
| g_key_log_function_initialized = jack_tls_allocate_key(&g_key_log_function); | |||
| } | |||
| static void jack_uninit() | |||
| { | |||
| if (gKeyRealtimeInitialized) { | |||
| jack_tls_free_key(gRealTime); | |||
| gKeyRealtimeInitialized = false; | |||
| } | |||
| if (g_key_log_function_initialized) { | |||
| jack_tls_free_key(g_key_log_function); | |||
| g_key_log_function_initialized = false; | |||
| } | |||
| } | |||
| #ifdef __cplusplus | |||
| extern "C" | |||
| { | |||
| #endif | |||
| static bool gKeyRealtimeInitialized = jack_tls_allocate_key(&gRealTime); | |||
| BOOL WINAPI DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) | |||
| { | |||
| switch (fdwReason) { | |||
| case DLL_PROCESS_ATTACH: | |||
| jack_init(); | |||
| break; | |||
| case DLL_PROCESS_DETACH: | |||
| jack_uninit(); | |||
| break; | |||
| } | |||
| return TRUE; | |||
| } | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #else | |||
| __attribute__ ((constructor)) | |||
| static void jack_init() | |||
| { | |||
| if (!gKeyRealtimeInitialized) { | |||
| gKeyRealtimeInitialized = jack_tls_allocate_key(&gRealTime); | |||
| } | |||
| if (!g_key_log_function_initialized) | |||
| g_key_log_function_initialized = jack_tls_allocate_key(&g_key_log_function); | |||
| } | |||
| __attribute__ ((destructor)) | |||
| static void jack_uninit() | |||
| { | |||
| if (gKeyRealtimeInitialized) { | |||
| jack_tls_free_key(gRealTime); | |||
| gKeyRealtimeInitialized = false; | |||
| } | |||
| if (g_key_log_function_initialized) { | |||
| jack_tls_free_key(g_key_log_function); | |||
| g_key_log_function_initialized = false; | |||
| } | |||
| } | |||
| jack_tls_key g_key_log_function; | |||
| static bool g_key_log_function_initialized = jack_tls_allocate_key(&g_key_log_function); | |||
| #endif | |||
| JackMutex* gOpenMutex = new JackMutex(); | |||
| @@ -22,7 +22,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| #include "JackPlatformPlug.h" | |||
| using namespace Jack; | |||
| extern jack_tls_key gRealTime; | |||
| extern jack_tls_key g_key_log_function; | |||
| extern JackMutex* gOpenMutex; | |||
| #endif | |||
| @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| #include "JackTools.h" | |||
| #include "JackSystemDeps.h" | |||
| #include "JackServerLaunch.h" | |||
| #include <assert.h> | |||
| using namespace Jack; | |||
| @@ -112,27 +113,33 @@ EXPORT jack_client_t* jack_client_open_aux(const char* ext_client_name, jack_opt | |||
| EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...) | |||
| { | |||
| assert(gOpenMutex); | |||
| gOpenMutex->Lock(); | |||
| va_list ap; | |||
| va_start(ap, status); | |||
| jack_client_t* res = jack_client_open_aux(ext_client_name, options, status, ap); | |||
| va_end(ap); | |||
| gOpenMutex->Unlock(); | |||
| return res; | |||
| } | |||
| EXPORT int jack_client_close(jack_client_t* ext_client) | |||
| { | |||
| assert(gOpenMutex); | |||
| gOpenMutex->Lock(); | |||
| int res = -1; | |||
| jack_log("jack_client_close"); | |||
| JackClient* client = (JackClient*)ext_client; | |||
| if (client == NULL) { | |||
| jack_error("jack_client_close called with a NULL client"); | |||
| return -1; | |||
| } else { | |||
| int res = client->Close(); | |||
| res = client->Close(); | |||
| delete client; | |||
| JackLibGlobals::Destroy(); // jack library destruction | |||
| jack_log("jack_client_close res = %d", res); | |||
| return res; | |||
| } | |||
| gOpenMutex->Unlock(); | |||
| return res; | |||
| } | |||
| EXPORT int jack_get_client_pid(const char *name) | |||
| @@ -49,7 +49,7 @@ extern "C" | |||
| using namespace Jack; | |||
| // beware!!! things can go nasty if one client is started with JackNoStartServer and another without it | |||
| bool g_nostart; | |||
| static bool g_nostart; | |||
| EXPORT jack_client_t* jack_client_open_aux(const char* ext_client_name, jack_options_t options, jack_status_t* status, va_list ap) | |||
| { | |||
| @@ -115,29 +115,35 @@ EXPORT jack_client_t* jack_client_open_aux(const char* ext_client_name, jack_opt | |||
| EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...) | |||
| { | |||
| assert(gOpenMutex); | |||
| gOpenMutex->Lock(); | |||
| va_list ap; | |||
| va_start(ap, status); | |||
| jack_client_t* res = jack_client_open_aux(ext_client_name, options, status, ap); | |||
| jack_client_t* res = jack_client_open_aux(ext_client_name, options, status, ap); | |||
| va_end(ap); | |||
| gOpenMutex->Unlock(); | |||
| return res; | |||
| } | |||
| EXPORT int jack_client_close(jack_client_t* ext_client) | |||
| { | |||
| assert(gOpenMutex); | |||
| gOpenMutex->Lock(); | |||
| int res = -1; | |||
| jack_log("jack_client_close"); | |||
| JackClient* client = (JackClient*)ext_client; | |||
| if (client == NULL) { | |||
| jack_error("jack_client_close called with a NULL client"); | |||
| return -1; | |||
| } else { | |||
| int res = client->Close(); | |||
| res = client->Close(); | |||
| delete client; | |||
| if (!g_nostart) { | |||
| JackServerGlobals::Destroy(); // jack server destruction | |||
| } | |||
| jack_log("jack_client_close res = %d", res); | |||
| return res; | |||
| } | |||
| gOpenMutex->Unlock(); | |||
| return res; | |||
| } | |||
| EXPORT int jack_get_client_pid(const char *name) | |||
| @@ -55,7 +55,7 @@ class JackWinMutex | |||
| bool Trylock() | |||
| { | |||
| return (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)); | |||
| return (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)); | |||
| } | |||
| void Unlock() | |||