mirror of https://github.com/mpv-player/mpv
Improve handling of cache process/thread hanging/being killed.
In particular allow a single STRG+C to quit MPlayer. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31251 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
4448190ef0
commit
6f7c1ea409
|
@ -116,6 +116,8 @@ static void cache_stats(cache_vars_t *s)
|
||||||
static int cache_read(cache_vars_t *s, unsigned char *buf, int size)
|
static int cache_read(cache_vars_t *s, unsigned char *buf, int size)
|
||||||
{
|
{
|
||||||
int total=0;
|
int total=0;
|
||||||
|
int sleep_count = 0;
|
||||||
|
int last_max = s->max_filepos;
|
||||||
while(size>0){
|
while(size>0){
|
||||||
int pos,newb,len;
|
int pos,newb,len;
|
||||||
|
|
||||||
|
@ -124,10 +126,21 @@ static int cache_read(cache_vars_t *s, unsigned char *buf, int size)
|
||||||
if(s->read_filepos>=s->max_filepos || s->read_filepos<s->min_filepos){
|
if(s->read_filepos>=s->max_filepos || s->read_filepos<s->min_filepos){
|
||||||
// eof?
|
// eof?
|
||||||
if(s->eof) break;
|
if(s->eof) break;
|
||||||
|
if (s->max_filepos == last_max) {
|
||||||
|
if (sleep_count++ == 5)
|
||||||
|
mp_msg(MSGT_CACHE, MSGL_WARN, "Cache not filling!\n");
|
||||||
|
} else {
|
||||||
|
last_max = s->max_filepos;
|
||||||
|
sleep_count = 0;
|
||||||
|
}
|
||||||
// waiting for buffer fill...
|
// waiting for buffer fill...
|
||||||
usec_sleep(READ_USLEEP_TIME); // 10ms
|
if (stream_check_interrupt(READ_USLEEP_TIME)) {
|
||||||
|
s->eof = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
continue; // try again...
|
continue; // try again...
|
||||||
}
|
}
|
||||||
|
sleep_count = 0;
|
||||||
|
|
||||||
newb=s->max_filepos-s->read_filepos; // new bytes in the buffer
|
newb=s->max_filepos-s->read_filepos; // new bytes in the buffer
|
||||||
if(newb<min_fill) min_fill=newb; // statistics...
|
if(newb<min_fill) min_fill=newb; // statistics...
|
||||||
|
@ -534,6 +547,7 @@ int cache_stream_seek_long(stream_t *stream,off_t pos){
|
||||||
}
|
}
|
||||||
|
|
||||||
int cache_do_control(stream_t *stream, int cmd, void *arg) {
|
int cache_do_control(stream_t *stream, int cmd, void *arg) {
|
||||||
|
int sleep_count = 0;
|
||||||
cache_vars_t* s = stream->cache_data;
|
cache_vars_t* s = stream->cache_data;
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case STREAM_CTRL_SEEK_TO_TIME:
|
case STREAM_CTRL_SEEK_TO_TIME:
|
||||||
|
@ -562,8 +576,14 @@ int cache_do_control(stream_t *stream, int cmd, void *arg) {
|
||||||
return STREAM_UNSUPPORTED;
|
return STREAM_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
cache_wakeup(stream);
|
cache_wakeup(stream);
|
||||||
while (s->control != -1)
|
while (s->control != -1) {
|
||||||
usec_sleep(CONTROL_SLEEP_TIME);
|
if (sleep_count++ == 1000)
|
||||||
|
mp_msg(MSGT_CACHE, MSGL_WARN, "Cache no responding!\n");
|
||||||
|
if (stream_check_interrupt(CONTROL_SLEEP_TIME)) {
|
||||||
|
s->eof = 1;
|
||||||
|
return STREAM_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case STREAM_CTRL_GET_TIME_LENGTH:
|
case STREAM_CTRL_GET_TIME_LENGTH:
|
||||||
case STREAM_CTRL_GET_CURRENT_TIME:
|
case STREAM_CTRL_GET_CURRENT_TIME:
|
||||||
|
|
Loading…
Reference in New Issue