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*