Loading "lparallel" hangs

Robert Larice Robert.Larice at t-online.de
Tue Sep 4 18:08:21 UTC 2018


Hello Daniel,

  if I grep for interrupts-enabled I see both
    si::*interrupts-enabled*
  and
    ext::*interrupts-enabled*
  and there is at least one or two commits which did
    rename such things. perhaps there is some confusion.

  with my debian dished SLIME I've both NIL,
    si::*interrupts-enabled*
    NIL
    ext::*interrupts-enabled*
    NIL

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

> Hey Robert,
>
> nice analysis. While I have the newest ECL and the newest bordeaux-
> threads I've tried the snippet in SLIME REPL.
>
> CL-USER> si:*interrupts-enabled*
> T
>
> But when I run this snippet from console I have:
>
>> si:*interrupts-enabled*
> NIL
>
> Moreover:
>
>> (bt:make-thread (lambda () (print `(jd ,si:*interrupts-enabled*))))
> (JD T)
>
> So it is a bug in ECL - interrupts are disabled indeed in the main
> thread by default. I'm looking into it at this very moment. Thank you
> for investigating. When fix is merged into develop branch I'll notify
> you.
>
> Best regards,
> Daniel
>
>
> W dniu pon, 03.09.2018 o godzinie 22∶31 +0200, użytkownik Robert Larice
> napisał:
>> 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