Try to make the debug stuff pthread_cancel-proof including the debug / warn / inform / die and debug_mutex calls. Tidy up usage of program_stop.
This commit is contained in:
+12
-12
@@ -919,8 +919,8 @@ int delay(long *the_delay) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(1);
|
||||
debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(0);
|
||||
// here, occasionally pretend there's a problem with pcm_get_delay()
|
||||
// if ((random() % 100000) < 3) // keep it pretty rare
|
||||
// reply = -EIO; // pretend something bad has happened
|
||||
@@ -954,8 +954,8 @@ static int play(void *buf, int samples) {
|
||||
do_mute(0);
|
||||
}
|
||||
|
||||
// debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(1); // release the mutex
|
||||
debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(0); // release the mutex
|
||||
}
|
||||
if (ret == 0) {
|
||||
pthread_cleanup_debug_mutex_lock(&alsa_mutex, 10000, 1);
|
||||
@@ -1040,8 +1040,8 @@ static int play(void *buf, int samples) {
|
||||
frame_index = 0;
|
||||
measurement_data_is_valid = 0;
|
||||
}
|
||||
// debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(1); // release the mutex
|
||||
debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(0); // release the mutex
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -1067,8 +1067,8 @@ static void flush(void) {
|
||||
measurement_data_is_valid = 0;
|
||||
alsa_handle = NULL;
|
||||
}
|
||||
// debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(1); // release the mutex
|
||||
debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(0); // release the mutex
|
||||
}
|
||||
|
||||
static void stop(void) {
|
||||
@@ -1124,8 +1124,8 @@ void volume(double vol) {
|
||||
pthread_cleanup_debug_mutex_lock(&alsa_mutex, 1000, 1);
|
||||
volume_set_request = 1; // an external request has been made to set the volume
|
||||
do_volume(vol);
|
||||
// debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(1); // release the mutex
|
||||
debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(0); // release the mutex
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1152,8 +1152,8 @@ static void mute(int mute_state_requested) {
|
||||
mute_request_pending = 1;
|
||||
overriding_mute_state_requested = mute_state_requested;
|
||||
do_mute(mute_state_requested);
|
||||
// debug_mutex_unlock(&alsa_mutex, 3);
|
||||
pthread_cleanup_pop(1); // release the mutex
|
||||
debug_mutex_unlock(&alsa_mutex, 0);
|
||||
pthread_cleanup_pop(0); // release the mutex
|
||||
}
|
||||
|
||||
void do_mute(int mute_state_requested) {
|
||||
|
||||
@@ -99,6 +99,8 @@ int get_requested_connection_state_to_output() { return requested_connection_sta
|
||||
void set_requested_connection_state_to_output(int v) { requested_connection_state_to_output = v; }
|
||||
|
||||
void die(const char *format, ...) {
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
char s[1024];
|
||||
s[0] = 0;
|
||||
uint64_t time_now = get_absolute_time_in_fp();
|
||||
@@ -121,10 +123,13 @@ void die(const char *format, ...) {
|
||||
daemon_log(LOG_EMERG, "% 20.9f|*fatal error: %s", tss, s);
|
||||
else
|
||||
daemon_log(LOG_EMERG, "fatal error: %s", s);
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void warn(const char *format, ...) {
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
char s[1024];
|
||||
s[0] = 0;
|
||||
uint64_t time_now = get_absolute_time_in_fp();
|
||||
@@ -147,11 +152,14 @@ void warn(const char *format, ...) {
|
||||
daemon_log(LOG_WARNING, "% 20.9f|*warning: %s", tss, s);
|
||||
else
|
||||
daemon_log(LOG_WARNING, "%s", s);
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
}
|
||||
|
||||
void debug(int level, const char *format, ...) {
|
||||
if (level > debuglev)
|
||||
return;
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
char s[1024];
|
||||
s[0] = 0;
|
||||
uint64_t time_now = get_absolute_time_in_fp();
|
||||
@@ -173,9 +181,12 @@ void debug(int level, const char *format, ...) {
|
||||
daemon_log(LOG_DEBUG, "% 20.9f|%s", tss, s);
|
||||
else
|
||||
daemon_log(LOG_DEBUG, "%s", s);
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
}
|
||||
|
||||
void inform(const char *format, ...) {
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
char s[1024];
|
||||
s[0] = 0;
|
||||
uint64_t time_now = get_absolute_time_in_fp();
|
||||
@@ -198,6 +209,7 @@ void inform(const char *format, ...) {
|
||||
daemon_log(LOG_INFO, "% 20.9f|%s", tss, s);
|
||||
else
|
||||
daemon_log(LOG_INFO, "%s", s);
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
}
|
||||
|
||||
// The following two functions are adapted slightly and with thanks from Jonathan Leffler's sample
|
||||
@@ -1050,6 +1062,8 @@ void sps_nanosleep(const time_t sec, const long nanosec) {
|
||||
int sps_pthread_mutex_timedlock(pthread_mutex_t *mutex, useconds_t dally_time,
|
||||
const char *debugmessage, int debuglevel) {
|
||||
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
struct timespec tn;
|
||||
clock_gettime(CLOCK_REALTIME, &tn);
|
||||
uint64_t tnfpsec = tn.tv_sec;
|
||||
@@ -1091,6 +1105,7 @@ int sps_pthread_mutex_timedlock(pthread_mutex_t *mutex, useconds_t dally_time,
|
||||
debug(debuglevel, "error %d: \"%s\" waiting for a mutex: \"%s\".", r,
|
||||
strerror_r(r, errstr, sizeof(errstr)), debugmessage);
|
||||
}
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
@@ -1099,6 +1114,8 @@ int sps_pthread_mutex_timedlock(pthread_mutex_t *mutex, useconds_t dally_time,
|
||||
const char *debugmessage, int debuglevel) {
|
||||
|
||||
// this is not pthread_cancellation safe because is contains a cancellation point
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
useconds_t time_to_wait = dally_time;
|
||||
int r = pthread_mutex_trylock(mutex);
|
||||
while ((r == EBUSY) && (time_to_wait > 0)) {
|
||||
@@ -1121,6 +1138,7 @@ int sps_pthread_mutex_timedlock(pthread_mutex_t *mutex, useconds_t dally_time,
|
||||
strerror_r(r, errstr, sizeof(errstr)), debugmessage);
|
||||
}
|
||||
}
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
@@ -1129,6 +1147,8 @@ int _debug_mutex_lock(pthread_mutex_t *mutex, useconds_t dally_time, const char
|
||||
const int line, int debuglevel) {
|
||||
if (debuglevel > debuglev)
|
||||
return pthread_mutex_lock(mutex);
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
uint64_t time_at_start = get_absolute_time_in_fp();
|
||||
char dstring[1000];
|
||||
memset(dstring, 0, sizeof(dstring));
|
||||
@@ -1144,6 +1164,7 @@ int _debug_mutex_lock(pthread_mutex_t *mutex, useconds_t dally_time, const char
|
||||
"debug_mutex_lock at \"%s\" expected max wait: %0.9f, actual wait: %0.9f sec.", dstring,
|
||||
(1.0 * dally_time) / 1000000, delay);
|
||||
}
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1151,6 +1172,8 @@ int _debug_mutex_unlock(pthread_mutex_t *mutex, const char *filename, const int
|
||||
int debuglevel) {
|
||||
if (debuglevel > debuglev)
|
||||
return pthread_mutex_unlock(mutex);
|
||||
int oldState;
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);
|
||||
char dstring[1000];
|
||||
char errstr[512];
|
||||
memset(dstring, 0, sizeof(dstring));
|
||||
@@ -1160,6 +1183,7 @@ int _debug_mutex_unlock(pthread_mutex_t *mutex, const char *filename, const int
|
||||
if (r != 0)
|
||||
debug(1, "error %d: \"%s\" unlocking a mutex: \"%s\".", r,
|
||||
strerror_r(r, errstr, sizeof(errstr)), dstring);
|
||||
pthread_setcancelstate(oldState,NULL);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
@@ -1954,7 +1954,8 @@ void rtsp_conversation_thread_cleanup_function(void *arg) {
|
||||
rtsp_conn_info *conn = (rtsp_conn_info *)arg;
|
||||
// debug(1, "Connection %d: rtsp_conversation_thread_func_cleanup_function called.",
|
||||
// conn->connection_number);
|
||||
player_stop(conn);
|
||||
if (conn->player_thread)
|
||||
player_stop(conn);
|
||||
if (conn->fd > 0) {
|
||||
// debug(1, "Connection %d: closing fd %d.",
|
||||
// conn->connection_number,conn->fd);
|
||||
@@ -2136,7 +2137,6 @@ static void *rtsp_conversation_thread_func(void *pconn) {
|
||||
if (conn->player_thread)
|
||||
debug(1, "RTSP Channel unexpectedly closed or a serious error occured -- closing the "
|
||||
"player thread.");
|
||||
player_stop(conn);
|
||||
debug(3, "Successful termination of playing thread of RTSP conversation thread %d.",
|
||||
conn->connection_number);
|
||||
debug(3, "Request termination of RTSP conversation thread %d.", conn->connection_number);
|
||||
|
||||
Reference in New Issue
Block a user