Remove timeout in the main loop
The main loop waits until there is some data to read in file descriptors of the X server or the pseudo tty. But it uses a timeout in select(), which causes that st awake each 20 ms, even it doesn't have something to do. This patch removes this problem removing the timeout, which is not needed. --- TODO | 1 - st.c | 27 +++------------------------ 2 files changed, 3 insertions(+), 25 deletions(-)
This commit is contained in:
		
							
								
								
									
										1
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								TODO
									
									
									
									
									
								
							| @ -15,7 +15,6 @@ code & interface | |||||||
|  |  | ||||||
| * clean selection code | * clean selection code | ||||||
| * clean and complete terminfo entry | * clean and complete terminfo entry | ||||||
| * remove the timeouts in the main loop |  | ||||||
|  |  | ||||||
| bugs | bugs | ||||||
| ---- | ---- | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								st.c
									
									
									
									
									
								
							| @ -53,8 +53,6 @@ | |||||||
| #define XK_NO_MOD     UINT_MAX | #define XK_NO_MOD     UINT_MAX | ||||||
| #define XK_ANY_MOD    0 | #define XK_ANY_MOD    0 | ||||||
|  |  | ||||||
| #define SELECT_TIMEOUT (20*1000) /* 20 ms */ |  | ||||||
| #define DRAW_TIMEOUT  (20*1000) /* 20 ms */ |  | ||||||
| #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ | #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ | ||||||
|  |  | ||||||
| #define SERRNO strerror(errno) | #define SERRNO strerror(errno) | ||||||
| @ -205,7 +203,6 @@ typedef struct { | |||||||
| 	int ch; /* char height */ | 	int ch; /* char height */ | ||||||
| 	int cw; /* char width  */ | 	int cw; /* char width  */ | ||||||
| 	char state; /* focus, redraw, visible */ | 	char state; /* focus, redraw, visible */ | ||||||
| 	struct timeval lastdraw; |  | ||||||
| } XWindow; | } XWindow; | ||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -250,7 +247,6 @@ static void drawregion(int, int, int, int); | |||||||
| static void execsh(void); | static void execsh(void); | ||||||
| static void sigchld(int); | static void sigchld(int); | ||||||
| static void run(void); | static void run(void); | ||||||
| static bool last_draw_too_old(void); |  | ||||||
|  |  | ||||||
| static void csidump(void); | static void csidump(void); | ||||||
| static void csihandle(void); | static void csihandle(void); | ||||||
| @ -2158,7 +2154,6 @@ void | |||||||
| draw() { | draw() { | ||||||
| 	drawregion(0, 0, term.col, term.row); | 	drawregion(0, 0, term.col, term.row); | ||||||
| 	xcopy(); | 	xcopy(); | ||||||
| 	gettimeofday(&xw.lastdraw, NULL); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @ -2345,41 +2340,25 @@ resize(XEvent *e) { | |||||||
| 	ttyresize(col, row); | 	ttyresize(col, row); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool |  | ||||||
| last_draw_too_old(void) { |  | ||||||
| 	struct timeval now; |  | ||||||
| 	gettimeofday(&now, NULL); |  | ||||||
| 	return TIMEDIFF(now, xw.lastdraw) >= DRAW_TIMEOUT/1000; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void | void | ||||||
| run(void) { | run(void) { | ||||||
| 	XEvent ev; | 	XEvent ev; | ||||||
| 	fd_set rfd; | 	fd_set rfd; | ||||||
| 	int xfd = XConnectionNumber(xw.dpy); | 	int xfd = XConnectionNumber(xw.dpy); | ||||||
| 	struct timeval timeout = {0}; |  | ||||||
| 	bool stuff_to_print = 0; |  | ||||||
|  |  | ||||||
| 	for(;;) { | 	for(;;) { | ||||||
| 		FD_ZERO(&rfd); | 		FD_ZERO(&rfd); | ||||||
| 		FD_SET(cmdfd, &rfd); | 		FD_SET(cmdfd, &rfd); | ||||||
| 		FD_SET(xfd, &rfd); | 		FD_SET(xfd, &rfd); | ||||||
| 		timeout.tv_sec  = 0; | 		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) < 0) { | ||||||
| 		timeout.tv_usec = SELECT_TIMEOUT; |  | ||||||
| 		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, &timeout) < 0) { |  | ||||||
| 			if(errno == EINTR) | 			if(errno == EINTR) | ||||||
| 				continue; | 				continue; | ||||||
| 			die("select failed: %s\n", SERRNO); | 			die("select failed: %s\n", SERRNO); | ||||||
| 		} | 		} | ||||||
| 		if(FD_ISSET(cmdfd, &rfd)) { | 		if(FD_ISSET(cmdfd, &rfd)) | ||||||
| 			ttyread(); | 			ttyread(); | ||||||
| 			stuff_to_print = 1; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if(stuff_to_print && last_draw_too_old()) { |  | ||||||
| 			stuff_to_print = 0; |  | ||||||
| 		draw(); | 		draw(); | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		while(XPending(xw.dpy)) { | 		while(XPending(xw.dpy)) { | ||||||
| 			XNextEvent(xw.dpy, &ev); | 			XNextEvent(xw.dpy, &ev); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user