Mercurial > mplayer.hg
comparison input/input.c @ 18810:f6bd47b9ed4f
Make sure mp_input_read_key_code always sleeps. Avoids 100% CPU load
during cache fill.
author | reimar |
---|---|
date | Sun, 25 Jun 2006 14:03:56 +0000 |
parents | 3b5b7e78b9af |
children | ac17673b640d |
comparison
equal
deleted
inserted
replaced
18809:9634870ebe4c | 18810:f6bd47b9ed4f |
---|---|
912 mp_input_read_key_code(int time) { | 912 mp_input_read_key_code(int time) { |
913 #ifndef HAVE_NO_POSIX_SELECT | 913 #ifndef HAVE_NO_POSIX_SELECT |
914 fd_set fds; | 914 fd_set fds; |
915 struct timeval tv,*time_val; | 915 struct timeval tv,*time_val; |
916 #endif | 916 #endif |
917 int i,n=0,max_fd = 0; | 917 int i,n=0,max_fd = 0, did_sleep = 0; |
918 static int last_loop = 0; | 918 static int last_loop = 0; |
919 | 919 |
920 if(num_key_fd == 0) | 920 if(num_key_fd == 0) |
921 { | |
922 usec_sleep(time * 1000); | |
921 return MP_INPUT_NOTHING; | 923 return MP_INPUT_NOTHING; |
924 } | |
922 | 925 |
923 #ifndef HAVE_NO_POSIX_SELECT | 926 #ifndef HAVE_NO_POSIX_SELECT |
924 FD_ZERO(&fds); | 927 FD_ZERO(&fds); |
925 #endif | 928 #endif |
926 // Remove fd marked as dead and build the fd_set | 929 // Remove fd marked as dead and build the fd_set |
938 FD_SET(key_fds[i].fd,&fds); | 941 FD_SET(key_fds[i].fd,&fds); |
939 #endif | 942 #endif |
940 n++; | 943 n++; |
941 } | 944 } |
942 | 945 |
943 if(num_key_fd == 0) | |
944 return MP_INPUT_NOTHING; | |
945 | |
946 #ifndef HAVE_NO_POSIX_SELECT | 946 #ifndef HAVE_NO_POSIX_SELECT |
947 // if we have fd's without MP_FD_NO_SELECT flag, call select(): | 947 // if we have fd's without MP_FD_NO_SELECT flag, call select(): |
948 if(n>0){ | 948 if(n>0){ |
949 | 949 |
950 if(time >= 0 ) { | 950 if(time >= 0 ) { |
960 continue; | 960 continue; |
961 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrSelect,strerror(errno)); | 961 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrSelect,strerror(errno)); |
962 } | 962 } |
963 break; | 963 break; |
964 } | 964 } |
965 did_sleep = 1; | |
965 | 966 |
966 } | 967 } |
967 #endif | 968 #endif |
968 | 969 |
969 for(i = last_loop + 1 ; i != last_loop ; i++) { | 970 for(i = last_loop + 1 ; i != last_loop ; i++) { |
982 #endif | 983 #endif |
983 if(key_fds[i].fd == 0) { // stdin is handled by getch2 | 984 if(key_fds[i].fd == 0) { // stdin is handled by getch2 |
984 code = getch2(time); | 985 code = getch2(time); |
985 if(code < 0) | 986 if(code < 0) |
986 code = MP_INPUT_NOTHING; | 987 code = MP_INPUT_NOTHING; |
988 did_sleep = 1; | |
987 } | 989 } |
988 else | 990 else |
989 code = ((mp_key_func_t)key_fds[i].read_func)(key_fds[i].fd); | 991 code = ((mp_key_func_t)key_fds[i].read_func)(key_fds[i].fd); |
990 | 992 |
991 if(code >= 0) | 993 if(code >= 0) |
996 else if(code == MP_INPUT_DEAD) { | 998 else if(code == MP_INPUT_DEAD) { |
997 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrDeadKeyOnFd,key_fds[i].fd); | 999 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrDeadKeyOnFd,key_fds[i].fd); |
998 key_fds[i].flags |= MP_FD_DEAD; | 1000 key_fds[i].flags |= MP_FD_DEAD; |
999 } | 1001 } |
1000 } | 1002 } |
1003 if (!did_sleep) | |
1004 usec_sleep(time * 1000); | |
1001 return MP_INPUT_NOTHING; | 1005 return MP_INPUT_NOTHING; |
1002 } | 1006 } |
1003 | 1007 |
1004 | 1008 |
1005 static mp_cmd_t* | 1009 static mp_cmd_t* |