Loading "lparallel" hangs

Robert Larice Robert.Larice at t-online.de
Mon Sep 3 20:31:19 UTC 2018


Hello Daniel,

  I continued to search for the culprit.
  First I tried a second machine,
    which showed exactly the same problem.
  Thus I think you might not have used the
    same bordeaux thread version, I have
      bordeaux-threads-v0.8.6

  The minimised snippet can be further minimised to this:
    (ql:quickload :bordeaux-threads)
    (let ((lock (bordeaux-threads:make-lock))
          (cvar (bordeaux-threads:make-condition-variable)))
      (bordeaux-threads:with-lock-held (lock)
        (handler-case (bordeaux-threads:with-timeout (0.001)
                        (mp:condition-variable-wait cvar lock))
          (bordeaux-threads:timeout () nil))))
  and still showes the same "hang"

  Then I started to macroexpand the stuff, and saw the
    with-timeout depends on interrupting a thread
    to terminate it after timeout.
  Merely guessing, I tried to wrap the whole code into a
    (mp:with-interrupts
       ... )
  and voila, the piece starts to work properly.
  But actually, if I've glimpsed the doc correctly,
    the interrupts should have been enabled by default.

  Thus it seems either the bordeaux threads library is missing  
    a with-interrupts, or there is a bug in ecl
    which doesn't enable these interrupts per default.

Best Regards,
  Robert
  
    
Daniel Kochmański <daniel at turtleware.eu> writes:

> Hey Robert,
>
> I can't reproduce the problem with the newest ECL code (from git
> develop branch) on my host. lparallel works fine and this snippet does 
> terminate after timeout.
>
> CL-USER> (ext:lisp-implementation-vcs-id)
> "ba6e6ddde780c097918673f16c7aba05f354d022"
>
> Best regards,
> Daniel
>
> W dniu nie, 02.09.2018 o godzinie 12∶27 +0200, użytkownik Robert Larice
> napisał:
>> I tried to understand where the issue is located.
>> 
>> In :lparallel file lparallel-20160825-git/src/thread-util.lisp
>> there is a stanza which tries to check for the implementation
>>   of the :timeout capability
>> 
>> > ;;; Check for timeout parameter in bordeaux-threads:condition-wait.
>> > (eval-when (:compile-toplevel :execute)
>> >   ;; use special to defeat compiler analysis
>> >   (defparameter *condition-wait* #'bordeaux-threads:condition-wait)
>> > 
>> >   (flet ((has-condition-wait-timeout-p ()
>> >   ...
>> 
>> I tried to minimise this to a small standalone piece
>> which can be used to examine the issue:
>> 
>> (ql:quickload :bordeaux-threads)
>> 
>> (let ((lock (bordeaux-threads:make-lock))
>>       (cvar (bordeaux-threads:make-condition-variable)))
>>   (bordeaux-threads:with-lock-held (lock)
>>     (bordeaux-threads:condition-wait cvar lock :timeout 0.001)))
>> 
>> I think the :timeout doesn't seem to work properly and thus the
>>   condition-wait waits forever.
>> 
>> Can you help me to understand this better and to work around it ?
>> 
>> Regards
>>   Robert Larice
>> 
>> 
>> Robert Larice <Robert.Larice at t-online.de> writes:
>> 
>> > Hello,
>> > 
>> >   can you provide me some hints for the following problem ?
>> > 
>> >   I've compiled ecl from git on a debian stretch machine.
>> >   Then I've tried to compile the "qt" example,
>> >     which did hang when loading "lparallel"
>> >   So I started "ecl" from a shell,
>> >   and did execute
>> >     (ql:quickload :lparallel)
>> >   which presents me:
>> >   > To load "lparallel":
>> >   > Load 1 ASDF system:
>> >   >   lparallel
>> >   > ; Loading "lparallel"
>> >   then the process fell silent.
>> >   "top" doesn't show "ecl" to consume cpu cycles.
>> >   Its waiting for something and doesn't proceed.
>> > 
>> > Regards,
>> >   Robert Larice



More information about the ecl-devel mailing list