AW: How do I get out of an event loop?

James,

taking about redirection... I also wanted to do the redirection myself
(and check for circular loops [aren't loops always circular?
Hmmm...;-)]) It worked fine as long as I had a per-request filter that
got called after the request was done -- I got a 301, checked the
response's redirection_anchor, and just continued with the event loop.
However, after I ran into various problems that you know of, I now have
no per-request filter at all, to the effect that I never get informed of
a redirection at all. I tried using HTAlert_add with HT_A_CONFIRM and
check for HT_MSG_REDIRECTION, but never got it. Same with HT_PROG_DONE;
this one is called only after the request has finished completely --
including redirection....
So, if you by any chance find out how one can intercept redirection, let
me know...

Thanks a lot,

/oliver

-----Ursprüngliche Nachricht-----
Von: James D. Brown [mailto:jamesbrown@shopswell.com]
Gesendet: Montag, 20. August 2001 19:12
An: Oliver Steinau; www-lib@w3.org
Betreff: How do I get out of an event loop?


After some recent code changes in my own code to add support for
redirection, 
I'm running into a similar access violation under MandrakeLinux 8.0.
After 
several hours of debugging, it appears that calling
HTEventList_stopLoop() 
may be a bad thing to do in some cases, which the docs DO warn about.

What appears to be happening is that I call HTEvent_stopLoop() while
some 
events are still pending (haven't had a chance to walk the event list
yet), 
and then go on to HTRequest_delete() the request.  At some later point,
it 
appears an Event still has hold of the original request pointer and
tries to 
access it in the next event loop.  Since the old request was deleted, we
get 
an access violation soon thereafter.

My apologies to Oliver for leading him astray on this issue, but I
didn't 
start having problems until adding redirection support in my app.

In any case, just like Oliver's, my event loop will not return without 
HTEvent_stopLoop().  In an attempt to fix this problem, I modified my
code to 
use the same HTRequest structure for all my requests.  This gets me
further 
in my processing, but then I run into an endless loop with the following

debugs:

HTTP Clean.. Called with status 302, net (nil)
Net Object.. Delete (nil) and call AFTER filters
Host Event.. READ passed to (URL DELETED) Terminated

I tried using HTNet_isIdle() before the call to HTEventList_stopLoop(),
but 
busy-waiting for an idle condition here means an endless loop (the event
list 
doesn't get processed, apparently), and checking once means I'm never
idle by 
the time I get there, so I get into an endless loop because I never call

HTEventList_stopLoop().

Clearly, we're running into a problem in that not all our filters are
being 
called with the HTEventList()_stopLoop(), but it's not clear to me how
to 
return from an event loop without the stopLoop call.

The examples I've looked at all call exit() in the terminate handler,
which 
of course doesn't help us any.

Since I started running into this problem with redirections, I'll try
pulling 
out the default redirect handler (I want to handle this myself, anyway),
and 
see where I get with that.

Two questions I'd like to add to Oliver's:

1) Is it possible to return from an event loop without
HTEvent_stopLoop()?  
If so, how?  If not, how do we deal with the pending events cleanly?

2) Is it reasonable to use the same HTRequest structure over and over?

Thanks!
James
_______________________________________________________
James D. Brown, President, Shopswell, Inc.
Voice: 303-400-0480 - FAX: 303-400-7181
http://www.shopswell.com - jamesbrown@shopswell.com

Received on Tuesday, 21 August 2001 03:00:22 UTC