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
 | 
				
			||||||
----
 | 
					----
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								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()) {
 | 
							draw();
 | 
				
			||||||
			stuff_to_print = 0;
 | 
					 | 
				
			||||||
			draw();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while(XPending(xw.dpy)) {
 | 
							while(XPending(xw.dpy)) {
 | 
				
			||||||
			XNextEvent(xw.dpy, &ev);
 | 
								XNextEvent(xw.dpy, &ev);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user