Date: 18 Dec 2004 00:26:25 -0000 From: Rudolf Polzer <freebsd-dr@durchnull.de> To: FreeBSD-gnats-submit@FreeBSD.org Cc: fph@ngi.it Subject: ports/75208: games/bastet does busy waiting Message-ID: <20041218002625.58870.qmail@durchnull.ath.cx> Resent-Message-ID: <200412180030.iBI0USx9014669@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 75208 >Category: ports >Synopsis: games/bastet does busy waiting >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Dec 18 00:30:27 GMT 2004 >Closed-Date: >Last-Modified: >Originator: Rudolf Polzer >Release: FreeBSD 5.3-STABLE i386 >Organization: >Environment: System: FreeBSD katsuragi.div0.ccc-offenbach.org 5.3-STABLE FreeBSD 5.3-STABLE #3: Thu Dec 2 07:47:37 CET 2004 root@katsuragi.div0.ccc-offenbach.org:/usr/obj/usr/src/sys/DIV0_KERNEL i386 Athlon XP, nothing else required IMHO >Description: bastet does busy waiting because the select() call in game.c returns with EINVAL. The reason is that timeout does not point to the struct timeval in the program but to a ncurses function with the same name. I renamed the variable to fix it. Also the value 1000000 is not a valid timeout value because it would have to be encoded as 1 second and 0 microseconds. I fixed it trivially by using 999999 for that value. Also I fixed a gcc warning. Anyway I think the function bast_clear has to be declared somewhere else. Should be easy to fix - temporarily I just put the diff below in my files/ directory of the port. Thanks! >How-To-Repeat: Play bastet (especially at level 0) and look at it in top. >Fix: diff -ru game.c bastet-0.41/game.c --- game.c Sat Dec 18 00:28:00 2004 +++ bastet-0.41/game.c Sat Dec 18 00:56:26 2004 @@ -12,6 +12,9 @@ #include "game.h" #include "main.h" #include "bast.h" +#include <sys/select.h> + +void bast_clear(); const DOT block_data[BLOCK_TYPES][BLOCK_ORIENTS][BLOCK_DOTS] = { @@ -66,7 +70,7 @@ /* Delay before block drop one step down (usec). We start at one sec. and then decreases the delay by 23% at each level. */ -const int delay[NO_LEVELS] = {1000000, 770000, 593000, 457000, 352000, 271000, 208000, 160000, 124000, 95000}; +const int delay[NO_LEVELS] = {999999, 770000, 593000, 457000, 352000, 271000, 208000, 160000, 124000, 95000}; /* Window in which the action takes place. */ WINDOW *well_win; @@ -278,6 +282,7 @@ refresh(); } +struct timeval mytimeout; /* Drop a block in the well. When done return y-cord. of where block ended. If it's not possible to even start with a new block return -1. */ int drop_block(int type, int level) @@ -288,14 +293,13 @@ int orient = 0; int ch; fd_set inputs, test_fds; - struct timeval timeout; int sel_ret; if (0 == check_block_pos(y, x, type, orient)) return -1; /* Oh no, game over. */ - timeout.tv_sec = 0; - timeout.tv_usec = delay[level]; + mytimeout.tv_sec = 0; + mytimeout.tv_usec = delay[level]; FD_ZERO(&inputs); FD_SET(0, &inputs); @@ -308,7 +312,7 @@ while(1) { test_fds = inputs; - sel_ret = select(FD_SETSIZE, &test_fds, (fd_set *) 0, (fd_set *) 0, &timeout); + sel_ret = select(FD_SETSIZE, &test_fds, (fd_set *) 0, (fd_set *) 0, &mytimeout); ch = getch(); @@ -391,8 +402,8 @@ set_block(y, x, type, orient); return y; } - timeout.tv_sec = 0; - timeout.tv_usec = delay[level]; + mytimeout.tv_sec = 0; + mytimeout.tv_usec = delay[level]; } } } >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041218002625.58870.qmail>