[Bordeaux-threads-devel] with-timeout abstraction leaks a bit?

Martin Simmons martin at lispworks.com
Mon Dec 21 11:35:52 UTC 2009


Good luck with that -- handling arbitrary throws in the condition variable
implementation is very difficult to get right :-(

Adding a timeout argument to condition-wait is the best option.

The difference between WITH-TIMEOUT and code that calls user-provided
functions is that you know where these functions are called.

E.g. the call to CLEANUP-2 will be skipped if the timeout occurs inside
CLEANUP-1:

(unwind-protect
    ...
  (cleanup-1)
  (cleanup-2))

Even worse, code like the example below is flawed because the timeout might
occur inside allocate-temp-object, before the variable is set, but after the
temp object has been allocated:

(let (object)
  (unwind-protect
      (progn
        (setq object (allocate-temp-object))
        ...use object...)
    (when object
      (deallocate-temp-object object))))

Fixing these common idioms to work with WITH-TIMEOUT requires some changes to
the code, possibly using macros that block interrupts.

__Martin


>>>>> On Fri, 18 Dec 2009 11:57:33 -0800, Peter Seibel said:
> 
> Well, the use I had for it was I needed to wait on a condition
> variable with a timeout. I.e. wait until the condition was notified or
> a certain amount of time had passed. In Allegro there was a direct way
> of doing that but there wasn't in Bordeaux Threads so I had to roll my
> own. If Bordeaux Threads wants to provide a way of doing that I'll be
> happy (at least for now). Though I'm not sure I see that WITH-TIMEOUT
> deserves to be totally removed--you may need to exercise some care
> about what you put inside a WITH-TIMEOUT but it seems that it
> shouldn't be drastically worse than any code that, say, calls a
> user-provided function (which could also signal a condition at a more
> or less random time.) Unless you're saying it's hard/impossible to
> implement safely within the Lisp implementation. That I wouldn't know
> about.
> 
> -Peter
> 
> On Fri, Dec 18, 2009 at 10:48 AM, Martin Simmons <martin at lispworks.com> wrote:
> >>>>>> On Fri, 18 Dec 2009 08:34:15 -0800, Peter Seibel said:
> >>
> >> I was using WITH-TIMEOUT the other day and it seems that it doesn't
> >> quite hide the underlying implementation quite enough: on SBCL it
> >> signals an SBCL-specific condition when it times out. Thus to handle
> >> the timeout you have to either handle that specific condition or
> >> something too broad (like CONDITION). Perhaps BT:WITH-TIMEOUT should
> >> handle the underlying condition and signal a BT-defined condition so
> >> this code can be written portably. I could provide a patch for SBCL
> >> (and probably Allegro) if folks think this is a good idea.
> >
> > I think it would be better to remove WITH-TIMEOUT completely, because it is
> > too dangerous to use in production code.  It causes a throw from a random
> > point in the program, so there is no way to use it safely with UNWIND-PROTECT
> > without extra code to prevent that.
> >
> > --
> > Martin Simmons
> > LispWorks Ltd
> > http://www.lispworks.com/
> >
> 
> 
> 
> -- 
> Peter Seibel
> http://www.codersatwork.com/
> http://www.gigamonkeys.com/blog/
> 
> _______________________________________________
> Bordeaux-threads-devel mailing list
> Bordeaux-threads-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/bordeaux-threads-devel
> 

-- 
Martin Simmons
LispWorks Ltd
http://www.lispworks.com/




More information about the bordeaux-threads-devel mailing list