- From: Erik Selberg <selberg@cs.washington.edu>
- Date: Mon, 18 Mar 1996 16:07:54 PST
- To: frystyk@w3.org
- Cc: W3C Lib <www-lib@w3.org>
Well, I finally upgraded to 4.0D and found two bugs. The first is that the select() timeout won't work under linux --- linux, being a more annoying flavor of UNIX, will zero-out the timeval passed to select. Yeah, I think it's dumb too. Anyway, the following #ifdef's in the patch fix it. The second is that HTEvent_stopLoop is a bit to permanent --- in HTEvent_Loop (at least the non-Windows one), HTEndLoop is never set to zero, so if HTEvent_stopLoop() is called, HTEvent_Loop cannot be successfully called again. A quick initialization statement fixed that bug. Anyway, here's a quick patch which fixes both of them. Cheers! -Erik *** /afs/cs/project/metacrawler/src/libwww4.0d/WWW/Library/Implementation/HTEvntrg.c~ Tue Feb 13 17:36:29 1996 --- /afs/cs/project/metacrawler/src/libwww4.0d/WWW/Library/Implementation/HTEvntrg.c Mon Mar 18 15:43:11 1996 *************** *** 653,658 **** --- 653,664 ---- SOCKET s ; BOOL consoleReady = NO; int status = 0 ; + + #ifdef __linux__ + /* added 1/12/96 by Erik Selberg */ + struct timeval tvtmp; + #endif + #ifdef _WINSOCKAPI_ unsigned ui ; #endif *************** *** 665,670 **** --- 671,679 ---- maxfds = max_sock ; readings = writings = exceptions = 0; consoleReady = NO; + + /* added 3/18/96 Erik Selberg <selberg@cs.washington.edu> */ + HTEndLoop = 0; if (console_in_use) { *************** *** 714,719 **** --- 723,742 ---- HTTrace("Event Loop.. calling select: maxfds is %d\n", maxfds); + /* added 1/12/96 by Erik Selberg */ + /* we do this 'cuz some unixen, like linux, zero-out the + time-out value when they timeout. Yes, I think it's a linux + bug, but I don't want to hack the kernel. + + Anyway, we save a copy here, and then re-copy it over. + Yes, we could just pass it into the select call, but this patch + is a little cleaner. + */ + #ifdef __linux__ + tvtmp.tv_sec = tvptr->tv_sec; + tvtmp.tv_usec = tvptr->tv_usec; + #endif + #ifdef __hpux active_sockets = select(maxfds+1, (int *)&treadset, (int *)&twriteset, (int *)&texceptset, (struct timeval *) tvptr); *************** *** 721,726 **** --- 744,755 ---- active_sockets = select(maxfds+1, &treadset, &twriteset, &texceptset, (struct timeval *) tvptr); #endif + + #ifdef __linux__ + tvptr->tv_sec = tvtmp.tv_sec; + tvptr->tv_usec = tvtmp.tv_sec; + #endif + if (THD_TRACE) HTTrace("Event Loop.. select returns %d\n",active_sockets);
Received on Monday, 18 March 1996 19:07:54 UTC