- From: Henrik Frystyk Nielsen <frystyk@w3.org>
- Date: Wed, 23 Jun 1999 14:33:10 -0400
- To: www-lib@w3.org
- To: Stuart Myles <smyles@wsj.dowjones.com>
- Message-ID: <37712866.C2E3ED53@w3.org>
Stuart Myles wrote: > However, my server leaks some memory each time it calls the > HTEventList_newLoop function in step 2. (I believe HTList_new > is getting called somewhere). > > If this is the right way to achieve what I want, how do I clean up the > memory allocated during HTEventList_newLoop? If this is not the > right way to achieve this, what should I be doing? Try this patch to see if that works better. I have also added a check that the loop isn't already running. -- Henrik Frystyk Nielsen, <frystyk@w3.org> World Wide Web Consortium, MIT/LCS NE43-356 545 Technology Square, Cambridge MA 02139, USA
Index: HTEvtLst.c
===================================================================
RCS file: /sources/public/libwww/Library/src/HTEvtLst.c,v
retrieving revision 2.40
diff -c -r2.40 HTEvtLst.c
*** HTEvtLst.c 1999/06/23 18:00:53 2.40
--- HTEvtLst.c 1999/06/23 18:28:39
***************
*** 64,69 ****
--- 64,70 ----
PRIVATE HTList * HashTable [HT_M_HASH_SIZE];
PRIVATE HTList * EventOrderList = NULL;
PRIVATE int HTEndLoop = 0; /* If !0 then exit event loop */
+ PRIVATE BOOL HTInLoop = NO;
#ifdef WWW_WIN_ASYNC
#define TIMEOUT 1 /* WM_TIMER id */
***************
*** 325,338 ****
return HT_OK;
}
! PUBLIC BOOL EventOrder_deleteAll (void)
{
HTList * cur = EventOrderList;
EventOrder * pres;
! HTTRACE(THD_TRACE, "EventOrder.. all ordered events\n");
! if (cur == NULL) return NO;
! while ((pres = (EventOrder *) HTList_nextObject(cur)))
! HT_FREE(pres);
HTList_delete(EventOrderList);
EventOrderList = NULL;
return YES;
--- 326,347 ----
return HT_OK;
}
! PRIVATE BOOL EventOrder_clearAll (void)
{
HTList * cur = EventOrderList;
EventOrder * pres;
! HTTRACE(THD_TRACE, "EventOrder.. Clearing all ordered events\n");
! if (cur) {
! while ((pres = (EventOrder *) HTList_nextObject(cur)))
! HT_FREE(pres);
! return YES;
! }
! return NO;
! }
!
! PUBLIC BOOL EventOrder_deleteAll (void)
! {
! EventOrder_clearAll();
HTList_delete(EventOrderList);
EventOrderList = NULL;
return YES;
***************
*** 630,637 ****
ms_t now;
SOCKET s;
int status = HT_OK;
! EventOrderList = HTList_new(); /* is kept around until EventOrder_deleteAll */
/* Don't leave this loop until we leave the application */
while (!HTEndLoop) {
--- 639,657 ----
ms_t now;
SOCKET s;
int status = HT_OK;
+
+ /* Check that we don't have multiple loops started at once */
+ if (HTInLoop) {
+ HTTRACE(THD_TRACE, "Event Loop.. Already one loop running - exiting\n");
+ return HT_ERROR;
+ }
+ HTInLoop = YES;
! /* Set up list of events - is kept around until EventOrder_deleteAll */
! if (!EventOrderList)
! EventOrderList = HTList_new();
! else
! EventOrder_clearAll();
/* Don't leave this loop until we leave the application */
while (!HTEndLoop) {
***************
*** 742,747 ****
--- 762,768 ----
/* Reset HTEndLoop in case we want to start again */
stop_loop:
HTEndLoop = 0;
+ HTInLoop = NO;
return status;
#endif /* !WWW_WIN_ASYNC */
}
Received on Wednesday, 23 June 1999 14:33:15 UTC