CTRL-C is not affected in fact. This is the usual behavior of FriCAS with Clozure CL. Sorry for the noise.
Le mer. 22 mai 2024 à 22:08, Grégory Vanuxem <[email protected]> a écrit : > > Oh, zut! (responding to myself) > > > (there are several use of 'CATCH' and there is 'handler-bind'). > > Badly handled. CTRL-C for example. > > More work needed in this regard. > > Le mer. 22 mai 2024 à 22:03, Grégory Vanuxem <[email protected]> a écrit : > > > > Hello Waldek, hello all, > > > > First, thanks for your response, it was very instructive it leads me > > to solve this long outstanding issue with my FriCAS copy. > > > > Le mar. 21 mai 2024 à 20:32, Waldek Hebisch <[email protected]> a écrit : > > > > > > On Tue, May 21, 2024 at 01:57:45PM +0200, Grégory Vanuxem wrote: > > > > Hello, > > > > > > > > I try to understand why a Clozure CL 'terminate' method is not called > > > > from the interpreter. I have a CL class jlref, when a jlref object is > > > > no longer referenced the CL garbage collector reclaims it. It is > > > > possible in different CL implementations to add a 'hook' to do some > > > > job at that time. Personally I then unreference the real Julia object > > > > in such a way it can be GC reclaimed in Julia, jlref is just a class > > > > that holds information about it. > > > > > > > > For SBCL I have no problem, but 'ccl:terminate' which should be > > > > automatically called is never called. But, and this is the main point, > > > > following an advice in a Clozure mailing list, I tried to use/define > > > > this method directly at execution time using ')fin', and surprisingly, > > > > using ')fin' automatically triggers 'terminate' on every objects that > > > > are/(were ?) reclaimed. > > > > > > > > So my question, what does ')fin' do? And do you happen to know where I > > > > need to look in the FriCAS source code to better understand its > > > > effect? > > > > > > AFAIK ')fin' is doing "nothing", is just returns back to whatever Lisp > > > was doing befor calling FriCAS. To understand relation with Lisp, > > > look at 'src/lisp/fricas-lisp.lisp', in particular 'save-core-restart'. > > > > Yes!!! This is what helped me. I looked more carefully at this function > > and.. > > > > > > > > > Furthermore, in src/interp/int-top.boot, the documentation says that > > > > to return to the interpreterafer after ')fin' '(restart)' should be > > > > used. In fact, before some change in the FriCAS source I think, so I > > > > used (|spad|). Again following an advice. And, again, with Clozure CL, > > > > contrary to SBCL, that leads to strange things after returning to the > > > > interpreter and executing foreign code (principally bad addresses and > > > > therefore segfault). > > > > > > The function to start FriCAS is 'fricas_restart'. 'fricas_restart' > > > is doing some initialization which may be unnecessary when executed > > > second time. OTOH re-doing initalization should be harmless and > > > some probably is needed. > > > > I see that, and in fact only propog CL use (|spad|) directly in other > > piece(s ?) of code. Using it is handy though, not everything is > > reinitialized. > > > > > Note that ')fin' is really unsuppored by FriCAS, basically > > > it is "pray that Lisp will do what you want". In particular IIRC > > > it simply quits FriCAS when using ECL and I think it never fully > > > worked with Clozure CL. > > > > > > > So maybe I first need to know a better CL command, to return to the > > > > interpreter? But also, of course, to know why the ccl:terminate is not > > > > called in the interpreter. R. Munyer in the CCL mailing list found a > > > > way, see the attached transcript file, but he uses ')fin' and no > > > > Clozure CL FFI. I tried to use different (eva-when) to define the > > > > ccl:terminate method without success since the code is build/compiled > > > > (src/lisp). > > > > > > I think that ')fin' is irrelevant, you should get the same effect > > > using ')lisp' or if that is inconvenient you can put code in the > > > file and use ')read'. The main difference is that FriCAS needs > > > specific settings of several global variables and FriCAS catches > > > errors (there are several use of 'CATCH' and there is 'handler-bind'). > > > This _should_ make no difference. What _may_ matter is order of > > > initialization. In particular FriCAS performs some initializations > > > before dumping image. But several thing do not survive to > > > restarted image, so need to be done later, after start of new image. > > > > I guessed after your email that the behavior of ')fin' is somewhat > > undefined. > > > > So now, my solution to my problem. A proposed diff is attached, it > > uniformizes/simplifies the Clozure CL boot I think. > > > > Looking at the attached transcript in my previous email I was > > surprised to see that the banner was displayed at that time, and > > experimenting more with the pure CL interpreter after ')fin' I first > > saw that calling Julia was not possible. When you embed Julia using > > libjulia, Julia does not support multithreaded code from the host > > process, I encountered this with SBCL, and it leads to segfault, bad > > stack etc. Only the thread that initialized Julia is able to use > > commands using the C interface. Experimenting some interruptions and > > backtraces I saw a thread started after ')fin'. Apparently the "main" > > process (not exactly in fact, the actual boot process of FriCAS bypass > > the CCL read-eval-print loop main thread) was at that time in a idle > > state or not started or sleeping, I don't really know, and the > > ccl::terminate method is then called on reclaimed CL objects. It's > > another thread in fact. FriCAS on CCL is then a multithreaded app :-) > > > > Diggering more in 'save-core-restart' I saw that only FriCAS on top of > > CCL is using a fricas-application class, which is just a > > ccl::application class: > > > > (defclass fricas-application (ccl::application) ()) > > > > and uses it for the ccl::toplevel-function at startup. My main problem > > is that with this class 'ccl::terminate' is not executed and the > > "main" process/thread is needed to execute it. To speak frankly I do > > not really understand why, SBCL, for example, can populate a threaded > > compatible FIFO queue in a garbage collector thread. > > > > I so cleaned/uniformized the FriCAS on CCL startup not to use this > > class which apparently runs in another thread than the "main" thread. > > Uniformized in the sense that the other CL implementations do not need > > a particular class for FriCAS. The modification is very simple (also > > attached): > > > > ======================================================= > > diff --git a/src/lisp/fricas-lisp.lisp b/src/lisp/fricas-lisp.lisp > > index bf46a61..4e7a222 100644 > > --- a/src/lisp/fricas-lisp.lisp > > +++ b/src/lisp/fricas-lisp.lisp > > @@ -64,24 +64,10 @@ with this hack and will try to convince the GCL > > crowd to fix this. > > ;; > > #+:openmcl > > (progn > > - > > -(defclass fricas-application (ccl::application) ()) > > - > > -(defvar *my-toplevel-function* nil) > > - > > (defvar *ccl-default-directory* nil) > > - > > -(defmethod ccl::toplevel-function ((app fricas-application) init-file) > > - (declare (ignore init-file)) > > - (call-next-method) ; this is critical, but shouldn't be. > > - (funcall *my-toplevel-function*) > > - (let ((ap (make-instance 'ccl::lisp-development-system))) > > - (ccl::toplevel-function ap init-file))) > > - > > ;;; Disable default argument processing > > (defmethod ccl::process-application-arguments > > - ((app fricas-application) error-flag opts args) nil) > > - > > + ((app ccl::application) error-flag opts args) nil) > > ) > > > > ;;; Disable argument processing in GCL > > @@ -143,12 +129,11 @@ with this hack and will try to convince the GCL > > crowd to fix this. > > #'(lambda () nil))) > > (top-fun #'(lambda () > > (set-initial-parameters) > > - (funcall restart-fun)))) > > + (funcall restart-fun) > > + (ccl::toplevel-loop)))) > > (setf *ccl-default-directory* ccl-dir) > > - (setf *my-toplevel-function* top-fun) > > - (CCL::save-application core-image > > - :PREPEND-KERNEL t > > - :application-class > > 'fricas-application) > > + (CCL::save-application core-image :toplevel-function top-fun > > + :PREPEND-KERNEL t) > > (QUIT)) > > #+:lispworks > > (progn > > ======================================================= > > > > And as you can see with '(ccl::toplevel-loop)' in 'top-fun', this > > allows the user to enter in the Clozure CL REPL with ')fin' in a > > relatively clean manner. I tested this code with SBCL and Clozure CL, > > tests passed. That also solves my issues and, how I view this, this is > > cleaner. > > > > Thoughts? > > > > - Greg -- You received this message because you are subscribed to the Google Groups "FriCAS - computer algebra system" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/fricas-devel/CAHnU2dYwATFJDScERz6iVEsfR0FUoxANHZ7LA%3DoArZwWiXZR8A%40mail.gmail.com.
