Merge pull request #611 from belboj/some-fixes

Some issues found during the development of a DLNA backend.

Many thanks for these.
This commit is contained in:
Mike Brady
2017-11-01 15:49:37 +00:00
committed by GitHub
3 changed files with 38 additions and 35 deletions
+6 -6
View File
@@ -101,7 +101,7 @@ void die(const char *format, ...) {
s[0] = 0;
va_list args;
va_start(args, format);
vsprintf(s, format, args);
vsnprintf(s, sizeof(s), format, args);
va_end(args);
daemon_log(LOG_EMERG, "fatal error: %s", s);
shairport_shutdown();
@@ -113,7 +113,7 @@ void warn(const char *format, ...) {
s[0] = 0;
va_list args;
va_start(args, format);
vsprintf(s, format, args);
vsnprintf(s, sizeof(s), format, args);
va_end(args);
daemon_log(LOG_WARNING, "%s", s);
}
@@ -125,7 +125,7 @@ void debug(int level, const char *format, ...) {
s[0] = 0;
va_list args;
va_start(args, format);
vsprintf(s, format, args);
vsnprintf(s, sizeof(s), format, args);
va_end(args);
daemon_log(LOG_DEBUG, "%s", s);
}
@@ -135,7 +135,7 @@ void inform(const char *format, ...) {
s[0] = 0;
va_list args;
va_start(args, format);
vsprintf(s, format, args);
vsnprintf(s, sizeof(s), format, args);
va_end(args);
daemon_log(LOG_INFO, "%s", s);
}
@@ -723,9 +723,9 @@ uint64_t get_absolute_time_in_fp() {
ssize_t non_blocking_write(int fd, const void *buf, size_t count) {
void *ibuf = (void *)buf;
size_t bytes_remaining = count;
int rc = 0;
int rc = 1;
struct pollfd ufds[1];
while ((bytes_remaining > 0) && (rc == 0)) {
while ((bytes_remaining > 0) && (rc > 0)) {
// check that we can do some writing
ufds[0].fd = fd;
ufds[0].events = POLLOUT;
+1 -1
View File
@@ -1481,7 +1481,7 @@ static void *player_thread_func(void *arg) {
// I think it's useful to keep this prime to prevent it from falling into a pattern with some
// other process.
char rnstate[256];
static char rnstate[256];
initstate(time(NULL), rnstate, 256);
signed short *inbuf, *tbuf, *silence;
+31 -28
View File
@@ -268,6 +268,8 @@ static void cleanup_threads(void) {
conns[i]->connection_number);
pthread_join(conns[i]->thread, &retval);
debug(3, "RTSP connection thread %d deleted...", conns[i]->connection_number);
if (conns[i] == playing_conn)
playing_conn = NULL;
free(conns[i]);
nconns--;
if (nconns)
@@ -546,9 +548,9 @@ static enum rtsp_read_request_response rtsp_read_request(rtsp_conn_info *conn,
reply = rtsp_read_request_response_error;
goto shutdown;
}
if (nread == EINTR)
continue;
if (nread < 0) {
if (errno == EINTR)
continue;
perror("read failure");
reply = rtsp_read_request_response_error;
goto shutdown;
@@ -1395,36 +1397,37 @@ static void handle_announce(rtsp_conn_info *conn, rtsp_message *req, rtsp_messag
if (pthread_mutex_trylock(&play_lock) == 0) {
have_the_player = 1;
} else {
if (playing_conn) {
debug(1, "RTSP Conversation thread %d already playing when asked by thread %d.",
playing_conn->connection_number, conn->connection_number);
} else {
debug(1, "play_lock locked but no playing_conn.");
}
if (config.allow_session_interruption == 1) {
int should_wait = 0;
if (! playing_conn)
die("Non existent playing_conn with play_lock enabled.");
debug(1, "RTSP Conversation thread %d already playing when asked by thread %d.",
playing_conn->connection_number, conn->connection_number);
if (playing_conn->stop) {
debug(1,"Playing connection is already shutting down; waiting for it...");
should_wait = 1;
} else if (config.allow_session_interruption == 1) {
// some other thread has the player ... ask it to relinquish the thread
if (playing_conn) {
debug(1, "ANNOUNCE: playing connection %d being interrupted by connection %d.",
playing_conn->connection_number, conn->connection_number);
if (playing_conn == conn) {
debug(1, "ANNOUNCE asking to stop itself.");
} else {
playing_conn->stop = 1;
memory_barrier();
pthread_kill(playing_conn->thread, SIGUSR1);
usleep(
1000000); // here, it is possible for other connections to come in and nab the player.
}
debug(1, "ANNOUNCE: playing connection %d being interrupted by connection %d.",
playing_conn->connection_number, conn->connection_number);
if (playing_conn == conn) {
debug(1, "ANNOUNCE asking to stop itself.");
} else {
die("Non existent the_playing_conn with play_lock enabled.");
playing_conn->stop = 1;
memory_barrier();
pthread_kill(playing_conn->thread, SIGUSR1);
should_wait = 1;
}
debug(1, "Try to get the player now");
// pthread_mutex_lock(&play_lock);
if (pthread_mutex_trylock(&play_lock) == 0)
have_the_player = 1;
else
debug(1, "ANNOUNCE failed to get the player");
}
if (should_wait) {
usleep(1000000); // here, it is possible for other connections to come in and nab the player.
debug(1, "Try to get the player now");
}
if (pthread_mutex_trylock(&play_lock) == 0)
have_the_player = 1;
else
debug(1,"ANNOUNCE failed to get the player");
}
if (have_the_player) {