summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-05-07 20:26:09 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-05-07 20:26:09 +0200
commit623ab300fe8625c4d35f2acedcf14777d9f22e8e (patch)
tree5fedbffc0639308a80ebde3bac477545c1f21c82
parente6ac0661df849dd9e0dd103bb9c74a4208b2485a (diff)
fixed hang in vfs_curl when recovering from connection loss
-rw-r--r--plugins/vfs_curl/vfs_curl.c13
-rw-r--r--streamer.c2
2 files changed, 10 insertions, 5 deletions
diff --git a/plugins/vfs_curl/vfs_curl.c b/plugins/vfs_curl/vfs_curl.c
index 8a4d0530..146dbe0c 100644
--- a/plugins/vfs_curl/vfs_curl.c
+++ b/plugins/vfs_curl/vfs_curl.c
@@ -41,7 +41,7 @@ static DB_functions_t *deadbeef;
#define TIMEOUT 10 // in seconds
#define STATUS_INITIAL 0
-#define STATUS_STARTING 1
+//#define STATUS_STARTING 1
#define STATUS_READING 2
#define STATUS_FINISHED 3
#define STATUS_ABORTED 4
@@ -441,14 +441,17 @@ http_curl_control (void *stream, double dltotal, double dlnow, double ultotal, d
float sec = tm.tv_sec - fp->last_read_time.tv_sec;
long response;
CURLcode code = curl_easy_getinfo (fp->curl, CURLINFO_RESPONSE_CODE, &response);
-// trace ("http_curl_control: status = %d, response = %d, interval: %f seconds\n", fp ? fp->status : -1, response, sec);
+ trace ("http_curl_control: status = %d, response = %d, interval: %f seconds\n", fp ? fp->status : -1, response, sec);
if (fp->status == STATUS_READING && sec > TIMEOUT) {
trace ("http_curl_control: timed out, restarting read\n");
memcpy (&fp->last_read_time, &tm, sizeof (struct timeval));
http_stream_reset (fp);
fp->status = STATUS_SEEK;
}
- assert (stream);
+ else if (fp->status == STATUS_SEEK) {
+ trace ("vfs_curl STATUS_SEEK in progress callback\n");
+ return -1;
+ }
if (fp->status == STATUS_ABORTED) {
trace ("vfs_curl STATUS_ABORTED in progress callback\n");
return -1;
@@ -535,8 +538,10 @@ http_thread_func (void *ctx) {
#endif
}
}
+// fp->status = STATUS_INITIAL;
+ trace ("vfs_curl: calling curl_easy_perform (status=%d)...\n", fp->status);
status = curl_easy_perform (curl);
- trace ("vfs_curl: curl_easy_perform status=%d\n", status);
+ trace ("vfs_curl: curl_easy_perform retval=%d\n", status);
if (status != 0) {
trace ("curl error:\n%s\n", http_err);
}
diff --git a/streamer.c b/streamer.c
index b1ad790e..a6dc43bd 100644
--- a/streamer.c
+++ b/streamer.c
@@ -681,8 +681,8 @@ streamer_set_nextsong (int song, int pstate) {
trace ("streamer_set_nextsong %d %d\n", song, pstate);
if (fileinfo && fileinfo->file) {
trace ("\033[0;31maborting current song: %s (fileinfo %p, file %p)\033[37;0m\n", streaming_track ? streaming_track->fname : NULL, fileinfo, fileinfo ? fileinfo->file : NULL);
- mutex_lock (decodemutex);
deadbeef->fabort (fileinfo->file);
+ mutex_lock (decodemutex);
if (streamer_file) {
trace ("\033[0;31maborting streamer_file\033[37;0m\n");
deadbeef->fabort (streamer_file);