- From: Gustaf Neumann <neumann@nestroy.wi-inf.uni-essen.de>
- Date: Mon May 5 17:31:56 1997
- To: www-lib@w3.org
Dear libwww experts, I seem to have problems to understand the Timer Class of libwww 5.1b properly. The documentation in http://www.w3.org/pub/WWW/Library/src/HTTimer.html states that The Timer class handles timer for libwww and the application. This works exactly as in X where you create a timer object with a callback function and a timeout. The callback will be called every time the timer expires. A timer can be relative or not (absolute). From the source I can see that a relative timer has also another property, it is repetitious: if the timer is dispatched, it resurrects magically before it executes the registered callback function: PRIVATE int Timer_dispatch (HTList * cur, HTList * last, int now) ... if (timer->relative) HTTimer_new(timer, timer->cbf, timer->param, timer->millis, YES); else HTList_quickRemoveElement(cur, last); if (THD_TRACE) HTTrace("Timer....... Dispatch timer %p\n", timer); /* CHECKME(timer); all entries to this function are now re-entry save */ ret = (*timer->cbf) (timer, timer->param, HTEvent_TIMEOUT); /* CLEARME(timer); */ if (!timer->relative) HT_FREE(timer); Why is this? The cited documentation suggests similarities to the XtAppAddTimeout function, which is relative and non-repetitious..... The reason I went into this is because I register Xt Timeouts via HTTimer_registerSetTimerCallback(). These callbacks are called sometimes with invalid data (callbacks registered with relative timeouts from HTBufferWriter_lazyFlush () in HtBufWrt.c). I can solve this problem by modifying Timer_dispatch() to PRIVATE int Timer_dispatch (HTList * cur, HTList * last, int now) { HTTimer * timer; int ret; timer = (HTTimer *)HTList_objectOf(cur); if (timer == NULL) { HTDebugBreak(); CLEARME(timer); return HT_ERROR; } HTList_quickRemoveElement(cur, last); ret = (*timer->cbf) (timer, timer->param, HTEvent_TIMEOUT); HT_FREE(timer); return ret; } This modification removes the -undocumented- repetitious property. Now everything works as expected on my side. Is the repetitious behavior intended? If yes, it should be documented and I have to study on, why I get sometimes invalid data (it seems as if the timer structure is freed somewhere before it is passed to the callback function). If the repetitious behavior is not intended I would suggest the change above. Best regards -gustaf neumann -- Wirtschaftsinformatik und Softwaretechnik Universitaet GH Essen, FB5 Altendorfer Strasse 97-101, Eingang B, D-45143 Essen Tel.: +49 (0201) 81003-74, Fax: +49 (0201) 81003-73 Gustaf.Neumann@uni-essen.de http://nestroy.wi-inf.uni-essen.de/Neumann.html
Received on Monday, 5 May 1997 17:31:56 UTC