From e9269c34bf12b13ab75a17d8a6c69986f0d5632e Mon Sep 17 00:00:00 2001 From: sletz Date: Sun, 21 Jan 2007 13:45:26 +0000 Subject: [PATCH] More client debug code: check if the client is still valid in every JackDebugClient method, check if the library context is still valid in every API call. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1358 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 4 + common/JackAPI.cpp | 205 +++++++++++++++++++++++++++++++++++++++++++++ common/JackDebugClient.cpp | 150 +++++++++++++++++++++------------ common/JackDebugClient.h | 4 +- common/JackLibGlobals.h | 6 ++ 5 files changed, 314 insertions(+), 55 deletions(-) diff --git a/ChangeLog b/ChangeLog index 60dd569e..25399b60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,10 @@ Jackdmp changes log --------------------------- +2007-01-21 Stephane Letz + + * More client debug code: check if the client is still valid in every JackDebugClient method, check if the library context is still valid in every API call. + 2007-01-14 Stephane Letz * Implement thread.h API. diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index e480d186..f1cdac4c 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -35,6 +35,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #endif #include +#ifdef __CLIENTDEBUG__ + #include "JackLibGlobals.h" +#endif + using namespace Jack; #ifdef __cplusplus @@ -234,6 +238,9 @@ EXPORT void jack_set_error_function (void (*func)(const char *)) EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_get_buffer called with an incorrect port %ld", myport); @@ -245,6 +252,9 @@ EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames) EXPORT const char* jack_port_name(const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_name called with an incorrect port %ld", myport); @@ -256,6 +266,9 @@ EXPORT const char* jack_port_name(const jack_port_t* port) EXPORT const char* jack_port_short_name(const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_short_name called with an incorrect port %ld", myport); @@ -267,6 +280,9 @@ EXPORT const char* jack_port_short_name(const jack_port_t* port) EXPORT int jack_port_flags(const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_flags called with an incorrect port %ld", myport); @@ -278,6 +294,9 @@ EXPORT int jack_port_flags(const jack_port_t* port) EXPORT const char* jack_port_type(const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_flags called an incorrect port %ld", myport); @@ -289,6 +308,9 @@ EXPORT const char* jack_port_type(const jack_port_t* port) EXPORT int jack_port_connected(const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_connected called with an incorrect port %ld", myport); @@ -301,6 +323,9 @@ EXPORT int jack_port_connected(const jack_port_t* port) EXPORT int jack_port_connected_to(const jack_port_t* port, const char* portname) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_connected_to called with an incorrect port %ld", myport); @@ -316,6 +341,9 @@ EXPORT int jack_port_connected_to(const jack_port_t* port, const char* portname) EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t mysrc = (jack_port_id_t)src; if (!CheckPort(mysrc)) { jack_error("jack_port_tie called with a NULL src port"); @@ -335,6 +363,9 @@ EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst) EXPORT int jack_port_untie(jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_untie called with an incorrect port %ld", myport); @@ -346,6 +377,9 @@ EXPORT int jack_port_untie(jack_port_t* port) EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_get_latency called with an incorrect port %ld", myport); @@ -358,6 +392,9 @@ EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port) EXPORT void jack_port_set_latency(jack_port_t* port, jack_nframes_t frames) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_set_latency called with an incorrect port %ld", myport); @@ -374,6 +411,9 @@ EXPORT int jack_recompute_total_latencies(jack_client_t* ext_client) EXPORT int jack_port_set_name(jack_port_t* port, const char* name) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_set_name called with an incorrect port %ld", myport); @@ -388,6 +428,9 @@ EXPORT int jack_port_set_name(jack_port_t* port, const char* name) EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_request_monitor called with an incorrect port %ld", myport); @@ -399,6 +442,9 @@ EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff) EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, const char* port_name, int onoff) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_request_monitor_by_name called with a NULL client"); @@ -416,6 +462,9 @@ EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, const ch EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_ensure_monitor called with an incorrect port %ld", myport); @@ -427,6 +476,9 @@ EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff) EXPORT int jack_port_monitoring_input(jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_monitoring_input called with an incorrect port %ld", myport); @@ -438,6 +490,9 @@ EXPORT int jack_port_monitoring_input(jack_port_t* port) EXPORT int jack_is_realtime(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_is_realtime called with a NULL client"); @@ -449,6 +504,9 @@ EXPORT int jack_is_realtime(jack_client_t* ext_client) EXPORT void jack_on_shutdown(jack_client_t* ext_client, void (*function)(void* arg), void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_on_shutdown called with a NULL client"); @@ -459,6 +517,9 @@ EXPORT void jack_on_shutdown(jack_client_t* ext_client, void (*function)(void* a EXPORT int jack_set_process_callback(jack_client_t* ext_client, JackProcessCallback callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_process_callback called with a NULL client"); @@ -470,6 +531,9 @@ EXPORT int jack_set_process_callback(jack_client_t* ext_client, JackProcessCallb EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_freewheel_callback called with a NULL client"); @@ -481,6 +545,9 @@ EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelC EXPORT int jack_set_freewheel(jack_client_t* ext_client, int onoff) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_freewheel called with a NULL client"); @@ -492,6 +559,9 @@ EXPORT int jack_set_freewheel(jack_client_t* ext_client, int onoff) EXPORT int jack_set_buffer_size(jack_client_t* ext_client, jack_nframes_t buffer_size) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_buffer_size called with a NULL client"); @@ -505,6 +575,9 @@ EXPORT int jack_set_buffer_size(jack_client_t* ext_client, jack_nframes_t buffer EXPORT int jack_set_buffer_size_callback(jack_client_t* ext_client, JackBufferSizeCallback bufsize_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_buffer_size_callback called with a NULL client"); @@ -516,6 +589,9 @@ EXPORT int jack_set_buffer_size_callback(jack_client_t* ext_client, JackBufferSi EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRateCallback srate_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; JackLog("jack_set_sample_rate_callback ext_client %x client %x \n", ext_client, client); if (client == NULL) { @@ -529,6 +605,9 @@ EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRa EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_port_registration_callback called with a NULL client"); @@ -540,6 +619,9 @@ EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, JackPo EXPORT int jack_set_graph_order_callback(jack_client_t* ext_client, JackGraphOrderCallback graph_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; JackLog("jack_set_graph_order_callback ext_client %x client %x \n", ext_client, client); if (client == NULL) { @@ -552,6 +634,9 @@ EXPORT int jack_set_graph_order_callback(jack_client_t* ext_client, JackGraphOrd EXPORT int jack_set_xrun_callback(jack_client_t* ext_client, JackXRunCallback xrun_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_xrun_callback called with a NULL client"); @@ -563,6 +648,9 @@ EXPORT int jack_set_xrun_callback(jack_client_t* ext_client, JackXRunCallback xr EXPORT int jack_set_thread_init_callback(jack_client_t* ext_client, JackThreadInitCallback init_callback, void *arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; JackLog("jack_set_thread_init_callback ext_client %x client %x \n", ext_client, client); if (client == NULL) { @@ -575,6 +663,9 @@ EXPORT int jack_set_thread_init_callback(jack_client_t* ext_client, JackThreadIn EXPORT int jack_activate(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_activate called with a NULL client"); @@ -586,6 +677,9 @@ EXPORT int jack_activate(jack_client_t* ext_client) EXPORT int jack_deactivate(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_deactivate called with a NULL client"); @@ -597,6 +691,9 @@ EXPORT int jack_deactivate(jack_client_t* ext_client) EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_register called with a NULL client"); @@ -611,6 +708,9 @@ EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char* po EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_unregister called with a NULL client"); @@ -626,6 +726,9 @@ EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port) EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_is_mine called with a NULL client"); @@ -641,6 +744,9 @@ EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_port_t* EXPORT const char** jack_port_get_connections(const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif jack_port_id_t myport = (jack_port_id_t)port; if (!CheckPort(myport)) { jack_error("jack_port_get_connections called with an incorrect port %ld", myport); @@ -654,6 +760,9 @@ EXPORT const char** jack_port_get_connections(const jack_port_t* port) // Calling client does not need to "own" the port EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_client, const jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_get_all_connections called with a NULL client"); @@ -673,6 +782,9 @@ EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_clien // Does not use the client parameter EXPORT int jack_port_lock(jack_client_t* ext_client, jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_lock called with a NULL client"); @@ -691,6 +803,9 @@ EXPORT int jack_port_lock(jack_client_t* ext_client, jack_port_t* port) // Does not use the client parameter EXPORT int jack_port_unlock(jack_client_t* ext_client, jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_unlock called with a NULL client"); @@ -708,6 +823,9 @@ EXPORT int jack_port_unlock(jack_client_t* ext_client, jack_port_t* port) EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client, jack_port_t* port) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_get_total_latency called with a NULL client"); @@ -727,6 +845,9 @@ EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client, jac EXPORT int jack_connect(jack_client_t* ext_client, const char* src, const char* dst) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_connect called with a NULL client"); @@ -741,6 +862,9 @@ EXPORT int jack_connect(jack_client_t* ext_client, const char* src, const char* EXPORT int jack_disconnect(jack_client_t* ext_client, const char* src, const char* dst) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_disconnect called with a NULL client"); @@ -755,6 +879,9 @@ EXPORT int jack_disconnect(jack_client_t* ext_client, const char* src, const cha EXPORT int jack_port_connect(jack_client_t* ext_client, jack_port_t* src, jack_port_t* dst) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_connect called with a NULL client"); @@ -775,6 +902,9 @@ EXPORT int jack_port_connect(jack_client_t* ext_client, jack_port_t* src, jack_p EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_disconnect called with a NULL client"); @@ -790,6 +920,9 @@ EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src) EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_sample_rate called with a NULL client"); @@ -801,6 +934,9 @@ EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client) EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_buffer_size called with a NULL client"); @@ -812,6 +948,9 @@ EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client) EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_ports called with a NULL client"); @@ -822,6 +961,9 @@ EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* port_n EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* portname) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_ports called with a NULL client"); @@ -839,12 +981,18 @@ EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* por EXPORT jack_port_t* jack_port_by_id(const jack_client_t* ext_client, jack_port_id_t id) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif /* jack_port_t* type is actually the port index */ return (jack_port_t*)id; } EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_engine_takeover_timebase called with a NULL client"); @@ -857,6 +1005,9 @@ EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client) EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackTimer timer; GetEngineControl()->ReadFrameTime(&timer); return (jack_nframes_t) floor((((float)GetEngineControl()->fSampleRate) / 1000000.0f) * (GetMicroSeconds() - timer.fCurrentCallback)); @@ -864,6 +1015,9 @@ EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext_cli EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_frame_time called with a NULL client"); @@ -883,6 +1037,9 @@ EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client) EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackTimer timer; GetEngineControl()->ReadFrameTime(&timer); return timer.fFrames; @@ -890,6 +1047,9 @@ EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client) EXPORT float jack_cpu_load(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_cpu_load called with a NULL client"); @@ -901,6 +1061,9 @@ EXPORT float jack_cpu_load(jack_client_t* ext_client) EXPORT pthread_t jack_client_thread_id(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_client_thread_id called with a NULL client"); @@ -912,6 +1075,9 @@ EXPORT pthread_t jack_client_thread_id(jack_client_t* ext_client) EXPORT char* jack_get_client_name (jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_client_name called with a NULL client"); @@ -935,6 +1101,9 @@ EXPORT int jack_port_name_size(void) EXPORT int jack_release_timebase(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_release_timebase called with a NULL client"); @@ -946,6 +1115,9 @@ EXPORT int jack_release_timebase(jack_client_t* ext_client) EXPORT int jack_set_sync_callback(jack_client_t* ext_client, JackSyncCallback sync_callback, void *arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_sync_callback called with a NULL client"); @@ -957,6 +1129,9 @@ EXPORT int jack_set_sync_callback(jack_client_t* ext_client, JackSyncCallback sy EXPORT int jack_set_sync_timeout(jack_client_t* ext_client, jack_time_t timeout) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_sync_timeout called with a NULL client"); @@ -968,6 +1143,9 @@ EXPORT int jack_set_sync_timeout(jack_client_t* ext_client, jack_time_t timeout) EXPORT int jack_set_timebase_callback(jack_client_t* ext_client, int conditional, JackTimebaseCallback timebase_callback, void* arg) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_timebase_callback called with a NULL client"); @@ -979,6 +1157,9 @@ EXPORT int jack_set_timebase_callback(jack_client_t* ext_client, int conditional EXPORT int jack_transport_locate(jack_client_t* ext_client, jack_nframes_t frame) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_locate called with a NULL client"); @@ -990,6 +1171,9 @@ EXPORT int jack_transport_locate(jack_client_t* ext_client, jack_nframes_t frame EXPORT jack_transport_state_t jack_transport_query(const jack_client_t* ext_client, jack_position_t* pos) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_query called with a NULL client"); @@ -1001,6 +1185,9 @@ EXPORT jack_transport_state_t jack_transport_query(const jack_client_t* ext_clie EXPORT jack_nframes_t jack_get_current_transport_frame(const jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_current_transport_frame called with a NULL client"); @@ -1012,6 +1199,9 @@ EXPORT jack_nframes_t jack_get_current_transport_frame(const jack_client_t* ext_ EXPORT int jack_transport_reposition(jack_client_t* ext_client, jack_position_t* pos) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_reposition called with a NULL client"); @@ -1023,6 +1213,9 @@ EXPORT int jack_transport_reposition(jack_client_t* ext_client, jack_position_t* EXPORT void jack_transport_start(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_start called with a NULL client"); @@ -1033,6 +1226,9 @@ EXPORT void jack_transport_start(jack_client_t* ext_client) EXPORT void jack_transport_stop(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_stop called with a NULL client"); @@ -1061,18 +1257,27 @@ EXPORT void jack_set_transport_info(jack_client_t* ext_client, jack_transport_in EXPORT float jack_get_max_delayed_usecs(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackLog("jack_get_max_delayed_usecs: not yet implemented\n"); return 0.f; } EXPORT float jack_get_xrun_delayed_usecs(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackLog("jack_get_xrun_delayed_usecs: not yet implemented\n"); return 0.f; } EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client) { +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif JackLog("jack_reset_max_delayed_usecs: not yet implemented\n"); } diff --git a/common/JackDebugClient.cpp b/common/JackDebugClient.cpp index fd876fb8..1034b19e 100644 --- a/common/JackDebugClient.cpp +++ b/common/JackDebugClient.cpp @@ -76,8 +76,8 @@ JackDebugClient::~JackDebugClient() int JackDebugClient::Open(const char* name) { - int Tidport; - Tidport = fClient->Open(name); + int res; + res = fClient->Open(name); char provstr[256]; char buffer[256]; time_t curtime; @@ -90,36 +90,47 @@ int JackDebugClient::Open(const char* name) sprintf(provstr, "JackClientDebug-%s-%s.log", name, buffer); fStream = new ofstream(provstr, ios_base::ate); if (fStream->is_open()) { - if (Tidport == -1) { - *fStream << "Trying to Open Client with name '" << name << "' with bad result (client not opened)." << Tidport << endl; + if (res == -1) { + *fStream << "Trying to open client with name '" << name << "' with bad result (client not opened)." << res << endl; } else { - *fStream << "Open Client with name '" << name << "'." << endl; + *fStream << "Open client with name '" << name << "'." << endl; } } else { JackLog("JackDebugClient::Open : cannot open log file\n"); } strcpy(fClientName, name); - return Tidport; + return res; } int JackDebugClient::Close() { fIsClosed++; - *fStream << "Client '" << fClientName << "' was Closed" << endl; + *fStream << "Client '" << fClientName << "' was closed" << endl; return fClient->Close(); } +void JackDebugClient::CheckClient() const +{ + if (fIsClosed > 0) { + *fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed !" << endl; + *fStream << "This is likely to cause crash !'" << endl; + } +} + pthread_t JackDebugClient::GetThreadID() { + CheckClient(); return fClient->GetThreadID(); } JackGraphManager* JackDebugClient::GetGraphManager() const { + CheckClient(); return fClient->GetGraphManager(); } JackEngineControl* JackDebugClient::GetEngineControl() const { + CheckClient(); return fClient->GetEngineControl(); } /*! @@ -128,33 +139,36 @@ JackEngineControl* JackDebugClient::GetEngineControl() const int JackDebugClient::ClientNotify(int refnum, const char* name, int notify, int sync, int value) { + CheckClient(); return fClient->ClientNotify( refnum, name, notify, sync, value); } int JackDebugClient::Activate() { - int Tidport; - Tidport = fClient->Activate(); + CheckClient(); + int res; + res = fClient->Activate(); fIsActivated++; if (fIsDeactivated) *fStream << "Client '" << fClientName << "' call activate a new time (it already call 'activate' previously)." << endl; *fStream << "Client '" << fClientName << "' Activated" << endl; - if (Tidport != 0) - *fStream << "Client '" << fClientName << "' try to activate but server return " << Tidport << " ." << endl; - return Tidport; + if (res != 0) + *fStream << "Client '" << fClientName << "' try to activate but server return " << res << " ." << endl; + return res; } int JackDebugClient::Deactivate() { - int Tidport; - Tidport = fClient->Deactivate(); + CheckClient(); + int res; + res = fClient->Deactivate(); fIsDeactivated++; if (fIsActivated == 0) *fStream << "Client '" << fClientName << "' deactivate while it hasn't been previoulsy activated !" << endl; *fStream << "Client '" << fClientName << "' Deactivated" << endl; - if (Tidport != 0) - *fStream << "Client '" << fClientName << "' try to deactivate but server return " << Tidport << " ." << endl; - return Tidport; + if (res != 0) + *fStream << "Client '" << fClientName << "' try to deactivate but server return " << res << " ." << endl; + return res; } //----------------- @@ -163,13 +177,14 @@ int JackDebugClient::Deactivate() int JackDebugClient::PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) { - int Tidport; - Tidport = fClient->PortRegister(port_name, port_type, flags, buffer_size); - if (Tidport <= 0) { - *fStream << "Client '" << fClientName << "' try port Register ('" << port_name << "') and server return error " << Tidport << " ." << endl; + CheckClient(); + int res; + res = fClient->PortRegister(port_name, port_type, flags, buffer_size); + if (res <= 0) { + *fStream << "Client '" << fClientName << "' try port register ('" << port_name << "') and server return error " << res << " ." << endl; } else { if (fTotalPortNumber < MAX_PORT_HISTORY) { - fPortList[fTotalPortNumber].idport = Tidport; + fPortList[fTotalPortNumber].idport = res; strcpy(fPortList[fTotalPortNumber].name, port_name); fPortList[fTotalPortNumber].IsConnected = 0; fPortList[fTotalPortNumber].IsUnregistrated = 0; @@ -178,15 +193,16 @@ int JackDebugClient::PortRegister(const char* port_name, const char* port_type, } fTotalPortNumber++; fOpenPortNumber++; - *fStream << "Client '" << fClientName << "' port Register with portname '" << port_name << " port " << Tidport << "' ." << endl; + *fStream << "Client '" << fClientName << "' port register with portname '" << port_name << " port " << res << "' ." << endl; } - return Tidport; + return res; } int JackDebugClient::PortUnRegister(jack_port_id_t port_index) { - int Tidport; - Tidport = fClient->PortUnRegister(port_index); + CheckClient(); + int res; + res = fClient->PortUnRegister(port_index); fOpenPortNumber--; int i; for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history @@ -199,19 +215,20 @@ int JackDebugClient::PortUnRegister(jack_port_id_t port_index) } if (i == 0) // Port is not found *fStream << "JackClientDebug : PortUnregister : port " << port_index << " was not previously registered !" << endl; - if (Tidport != 0) - *fStream << "Client '" << fClientName << "' try to do PortUnregister and server return " << Tidport << " )." << endl; + if (res != 0) + *fStream << "Client '" << fClientName << "' try to do PortUnregister and server return " << res << " )." << endl; *fStream << "Client '" << fClientName << "' unregister port '" << port_index << "'." << endl; - return Tidport; + return res; } int JackDebugClient::PortConnect(const char* src, const char* dst) { - if (!(fIsActivated)) + CheckClient(); + if (!fIsActivated) *fStream << "!!! ERROR !!! Trying to connect a port ( " << src << " to " << dst << ") while the client has not been activated !" << endl; - int Tidport; + int res; int i; - Tidport = fClient->PortConnect( src, dst); + res = fClient->PortConnect( src, dst); for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history if (strcmp(fPortList[i].name, src) == 0) { // We found the last record in sources if (fPortList[i].IsUnregistrated != 0) @@ -229,18 +246,19 @@ int JackDebugClient::PortConnect(const char* src, const char* dst) } if (i == 0) // Port is not found *fStream << "JackClientDebug : PortConnect : port was not found in debug database !" << endl; - if (Tidport != 0) - *fStream << "Client '" << fClientName << "' try to do PortConnect but server return " << Tidport << " ." << endl; + if (res != 0) + *fStream << "Client '" << fClientName << "' try to do PortConnect but server return " << res << " ." << endl; //*fStream << "Client Port Connect done with names" << endl; - return Tidport; + return res; } int JackDebugClient::PortDisconnect(const char* src, const char* dst) { - if (!(fIsActivated)) + CheckClient(); + if (!fIsActivated) *fStream << "!!! ERROR !!! Trying to disconnect a port ( " << src << " to " << dst << ") while the client has not been activated !" << endl; - int Tidport; - Tidport = fClient->PortDisconnect( src, dst); + int res; + res = fClient->PortDisconnect( src, dst); int i; for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history if (strcmp(fPortList[i].name, src) == 0) { // We found the record in sources @@ -259,18 +277,19 @@ int JackDebugClient::PortDisconnect(const char* src, const char* dst) } if (i == 0) // Port is not found *fStream << "JackClientDebug : PortDisConnect : port was not found in debug database !" << endl; - if (Tidport != 0) - *fStream << "Client '" << fClientName << "' try to do PortDisconnect but server return " << Tidport << " ." << endl; + if (res != 0) + *fStream << "Client '" << fClientName << "' try to do PortDisconnect but server return " << res << " ." << endl; //*fStream << "Client Port Disconnect done." << endl; - return Tidport; + return res; } int JackDebugClient::PortConnect(jack_port_id_t src, jack_port_id_t dst) -{ - if (!(fIsActivated)) +{ + CheckClient(); + if (!fIsActivated) *fStream << "!!! ERROR !!! : Trying to connect port " << src << " to " << dst << " while the client has not been activated !" << endl; - int Tidport; - Tidport = fClient->PortConnect(src, dst); + int res; + res = fClient->PortConnect(src, dst); int i; for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history if (fPortList[i].idport == src) { // We found the record in sources @@ -289,18 +308,19 @@ int JackDebugClient::PortConnect(jack_port_id_t src, jack_port_id_t dst) } if (i == 0) // Port is not found *fStream << "JackClientDebug : PortConnect : port was not found in debug database !" << endl; - if (Tidport == -1) - *fStream << "Client '" << fClientName << "' try to do Portconnect but server return " << Tidport << " ." << endl; + if (res == -1) + *fStream << "Client '" << fClientName << "' try to do Portconnect but server return " << res << " ." << endl; //*fStream << "Client Port Connect with ID done." << endl; - return Tidport; + return res; } int JackDebugClient::PortDisconnect(jack_port_id_t src) { - if (!(fIsActivated)) + CheckClient(); + if (!fIsActivated) *fStream << "!!! ERROR !!! : Trying to disconnect port " << src << " while that client has not been activated !" << endl; - int Tidport; - Tidport = fClient->PortDisconnect(src); + int res; + res = fClient->PortDisconnect(src); int i; for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history if (fPortList[i].idport == src) { // We found the record in sources @@ -313,14 +333,15 @@ int JackDebugClient::PortDisconnect(jack_port_id_t src) } if (i == 0) // Port is not found *fStream << "JackClientDebug : PortDisconnect : port was not found in debug database !" << endl; - if (Tidport != 0) - *fStream << "Client '" << fClientName << "' try to do PortDisconnect but server return " << Tidport << " ." << endl; + if (res != 0) + *fStream << "Client '" << fClientName << "' try to do PortDisconnect but server return " << res << " ." << endl; //*fStream << "Client Port Disconnect with ID done." << endl; - return Tidport; + return res; } int JackDebugClient::PortIsMine(jack_port_id_t port_index) { + CheckClient(); return fClient->PortIsMine(port_index); } @@ -330,11 +351,13 @@ int JackDebugClient::PortIsMine(jack_port_id_t port_index) int JackDebugClient::SetBufferSize(jack_nframes_t buffer_size) { + CheckClient(); return fClient->SetBufferSize(buffer_size); } int JackDebugClient::SetFreeWheel(int onoff) { + CheckClient(); return fClient->SetFreeWheel(onoff); } @@ -356,51 +379,61 @@ void JackDebugClient::ShutDown() int JackDebugClient::ReleaseTimebase() { + CheckClient(); return fClient->ReleaseTimebase(); } int JackDebugClient::SetSyncCallback(JackSyncCallback sync_callback, void* arg) { + CheckClient(); return fClient->SetSyncCallback(sync_callback, arg); } int JackDebugClient::SetSyncTimeout(jack_time_t timeout) { + CheckClient(); return fClient->SetSyncTimeout(timeout); } int JackDebugClient::SetTimebaseCallback(int conditional, JackTimebaseCallback timebase_callback, void* arg) { + CheckClient(); return fClient->SetTimebaseCallback( conditional, timebase_callback, arg); } int JackDebugClient::TransportLocate(jack_nframes_t frame) { + CheckClient(); return fClient->TransportLocate(frame); } jack_transport_state_t JackDebugClient::TransportQuery(jack_position_t* pos) { + CheckClient(); return fClient->TransportQuery(pos); } jack_nframes_t JackDebugClient::GetCurrentTransportFrame() { + CheckClient(); return fClient->GetCurrentTransportFrame(); } int JackDebugClient::TransportReposition(jack_position_t* pos) { + CheckClient(); return fClient->TransportReposition(pos); } void JackDebugClient::TransportStart() { + CheckClient(); fClient->TransportStart(); } void JackDebugClient::TransportStop() { + CheckClient(); fClient->TransportStop(); } @@ -410,46 +443,55 @@ void JackDebugClient::TransportStop() void JackDebugClient::OnShutdown(JackShutdownCallback callback, void *arg) { + CheckClient(); fClient->OnShutdown(callback, arg); } int JackDebugClient::SetProcessCallback(JackProcessCallback callback, void *arg) { + CheckClient(); return fClient->SetProcessCallback( callback, arg); } int JackDebugClient::SetXRunCallback(JackXRunCallback callback, void *arg) { + CheckClient(); return fClient->SetXRunCallback(callback, arg); } int JackDebugClient::SetInitCallback(JackThreadInitCallback callback, void *arg) { + CheckClient(); return fClient->SetInitCallback(callback, arg); } int JackDebugClient::SetGraphOrderCallback(JackGraphOrderCallback callback, void *arg) { + CheckClient(); return fClient->SetGraphOrderCallback(callback, arg); } int JackDebugClient::SetBufferSizeCallback(JackBufferSizeCallback callback, void *arg) { + CheckClient(); return fClient->SetBufferSizeCallback(callback, arg); } int JackDebugClient::SetFreewheelCallback(JackFreewheelCallback callback, void *arg) { + CheckClient(); return fClient->SetFreewheelCallback(callback, arg); } int JackDebugClient::SetPortRegistrationCallback(JackPortRegistrationCallback callback, void *arg) { + CheckClient(); return fClient->SetPortRegistrationCallback(callback, arg); } JackClientControl* JackDebugClient::GetClientControl() const { + CheckClient(); return fClient->GetClientControl(); } diff --git a/common/JackDebugClient.h b/common/JackDebugClient.h index bfeed9af..1f967adf 100644 --- a/common/JackDebugClient.h +++ b/common/JackDebugClient.h @@ -53,6 +53,7 @@ class JackDebugClient : public JackClient std::ofstream* fStream; protected: + PortFollower fPortList[MAX_PORT_HISTORY]; // Arbitrary value... To be tuned... int fTotalPortNumber; // The total number of port opened and maybe closed. Historical view. int fOpenPortNumber; // The current number of opened port. @@ -64,7 +65,6 @@ class JackDebugClient : public JackClient public: JackDebugClient(JackClient *fTheClient); - virtual ~JackDebugClient(); virtual int Open(const char* name); @@ -118,6 +118,8 @@ class JackDebugClient : public JackClient int SetFreewheelCallback(JackFreewheelCallback callback, void* arg); int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg); JackClientControl* GetClientControl() const; + + void CheckClient() const; }; diff --git a/common/JackLibGlobals.h b/common/JackLibGlobals.h index 4e9a4ff4..f423a455 100644 --- a/common/JackLibGlobals.h +++ b/common/JackLibGlobals.h @@ -88,6 +88,12 @@ struct JackLibGlobals JackGlobals::Destroy(); } } + + static void CheckContext() + { + if (!(fClientCount > 0 && fGlobals)) + jack_error("Error !!! : client accessing an already desallocated library context"); + } }; -- 2.11.4.GIT