From: Jason D. <da...@ee...> - 2005-06-11 06:02:55
|
Hello, I'm trying to get the following to work a certain way: (sb-thread::make-thread (lambda () (loop (format t "lisp> ") (force-output) (print (eval (read))) (fresh-line)))) Now type (quit) at the prompt, sbcl appears as though it is not running (it is of course, if you happen to be listening on a socket you can still interact that way). For my program, I would like typing (quit) to terminate sbcl. According to: http://www.sbcl.org/manual/Sessions-Debugging.html#Sessions%2fDebugging "...sb-ext:quit terminates all threads in the current session, but leaves other sessions running. " It would seem that either sbcl has created more than one session (even though I was not aware of requesting another session), it's waiting for the original thread to terminate, or the behavior has changed in the never version of sbcl. Is there something I can set so that calling quit will cause all threads to terminate? Or failling that, is there some way of telling each thread to terminate? I found sb-thread:terminate-thread and sb-thread::mapcar-threads, but I couldn't figure out how to tell each thread to terminate. Personally, I find the behavior of quit to be odd here. Calling quit and not having all threads terminate seems unnatural to me. If I only wanted to terminate a single thread or a single session, I would look for quit-thread, or quit-session functions. It would be nice if the behavior of quit didn't change based on the number of threads. Thanks, Jason |
From: <me...@ho...> - 2005-06-11 07:44:36
|
On Saturday 11 June 2005 08:02, Jason Dagit wrote: > Hello, > > I'm trying to get the following to work a certain way: > (sb-thread::make-thread (lambda () > (loop (format t "lisp> ") > (force-output) > (print (eval (read))) > (fresh-line)))) > > Now type (quit) at the prompt, sbcl appears as though it is not > running (it is of course, if you happen to be listening on a socket > you can still interact that way). For my program, I would like typing > (quit) to terminate sbcl. > > According to: > http://www.sbcl.org/manual/Sessions-Debugging.html#Sessions%2fDebugging > > "...sb-ext:quit terminates all threads in the current session, but leaves > other sessions running. " The doc and the current implementation are out of sync: for a background thread quit makes it quit, for a foreground thread it terminates the whole session. So you need the foreground thread. You may either get to be it (get-foreground) and (quit) (alternatively: (terminate-session)) or do something like: (terminate-thread (car (session-interactive-threads *session*))) > Personally, I find the behavior of quit to be odd here. Calling quit > and not having all threads terminate seems unnatural to me. If I only > wanted to terminate a single thread or a single session, I would look > for quit-thread, or quit-session functions. It would be nice if the > behavior of quit didn't change based on the number of threads. The current state of things is somewhat suboptimal. I think main problem is compatibility with non-thread-aware code that calls quit. > > Thanks, > Jason Cheers, Gabor |
From: Jason D. <da...@ee...> - 2005-06-11 10:18:51
|
G=E1bor Melis <me...@ho...> writes: > So you need the foreground thread. You may either get to be it=20 > (get-foreground) and (quit) (alternatively: (terminate-session)) or do=20 > something like: > (terminate-thread (car (session-interactive-threads *session*))) I had tried the first two, both of which didn't work. The last one seems to work just right. Thanks, Jason |