Skip to content

Commit

Permalink
Remove timeout in the main loop
Browse files Browse the repository at this point in the history
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(-)
  • Loading branch information
k0gaMSX committed Sep 16, 2012
1 parent 15cc875 commit 85849ce
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 25 deletions.
1 change: 0 additions & 1 deletion TODO
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ code & interface

* clean selection code
* clean and complete terminfo entry
* remove the timeouts in the main loop

bugs
----
Expand Down
27 changes: 3 additions & 24 deletions st.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@
#define XK_NO_MOD UINT_MAX
#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 SERRNO strerror(errno)
Expand Down Expand Up @@ -205,7 +203,6 @@ typedef struct {
int ch; /* char height */
int cw; /* char width */
char state; /* focus, redraw, visible */
struct timeval lastdraw;
} XWindow;

typedef struct {
Expand Down Expand Up @@ -250,7 +247,6 @@ static void drawregion(int, int, int, int);
static void execsh(void);
static void sigchld(int);
static void run(void);
static bool last_draw_too_old(void);

static void csidump(void);
static void csihandle(void);
Expand Down Expand Up @@ -2158,7 +2154,6 @@ void
draw() {
drawregion(0, 0, term.col, term.row);
xcopy();
gettimeofday(&xw.lastdraw, NULL);
}

void
Expand Down Expand Up @@ -2345,41 +2340,25 @@ resize(XEvent *e) {
ttyresize(col, row);
}

bool
last_draw_too_old(void) {
struct timeval now;
gettimeofday(&now, NULL);
return TIMEDIFF(now, xw.lastdraw) >= DRAW_TIMEOUT/1000;
}

void
run(void) {
XEvent ev;
fd_set rfd;
int xfd = XConnectionNumber(xw.dpy);
struct timeval timeout = {0};
bool stuff_to_print = 0;

for(;;) {
FD_ZERO(&rfd);
FD_SET(cmdfd, &rfd);
FD_SET(xfd, &rfd);
timeout.tv_sec = 0;
timeout.tv_usec = SELECT_TIMEOUT;
if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, &timeout) < 0) {
if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) < 0) {
if(errno == EINTR)
continue;
die("select failed: %s\n", SERRNO);
}
if(FD_ISSET(cmdfd, &rfd)) {
if(FD_ISSET(cmdfd, &rfd))
ttyread();
stuff_to_print = 1;
}

if(stuff_to_print && last_draw_too_old()) {
stuff_to_print = 0;
draw();
}
draw();

while(XPending(xw.dpy)) {
XNextEvent(xw.dpy, &ev);
Expand Down

0 comments on commit 85849ce

Please sign in to comment.