[squeak-dev] Is there a way to quit/exit Squeak with a return code that can be tested in a .so file?

David T. Lewis lewis at mail.msen.com
Thu May 4 03:29:36 UTC 2017


Well that looks pretty cool :-)  Thanks for the update and explanation.

Dave


On Wed, May 03, 2017 at 05:35:49PM -0400, Louis LaBrunda wrote:
> Hi Dave,
> 
> Thanks for checking this for me.  Sorry it took me so long to get back to this.  I had to set
> up a new Raspberry and Samba and Apache2 gave me a lot of trouble, not to mentions the Bash
> script.
> 
> I did know about Smalltalk>snapshot:andQuitWithExitCode: when I posted about
> Smalltalk>snapshot:andQuit:withExitCode:embedded:, I just wanted to point everyone to the
> method that did the work.
> 
> Big picture:  I'm working on a Squeak/Seaside program that controls four relays.  I gave my old
> Raspberry Pi (model 1) to a friend to open and close his garage doors.  The Seaside parts
> displays a web page (login, relay page and settings) in any web browser.  With a hole in his
> router, he can get to it from anywhere, even with his iPhone.
> 
> You may remember me asking about how to shutdown or reboot from within Squeak.  I wanted to be
> able to reboot to clean up a problem or shutdown if you wanted to turn off the power without
> just pulling the plug while things were running.  I had some timing problems with that and had
> to use a delay options in the shutdown call.  The problem with that is that you couldn't wait
> less than a minute.  There is a call that says it could wait n number of seconds but it waited
> n minutes.  Looks like a bug to me.  Anyway, waiting a minute was too long.  Since I was
> already using a script to start pigpiod and Squeak, I decided to remove the shutdown/reboot
> calls from within my program and move them out to the Bash script.  The final version of the
> script is below.  I know Linux is free open source and I shouldn't complain about free stuff
> but what a mess of a scripting language.  Too many ways to do the same thing.  All too easily
> mixed together in ways that won't work.
> 
> This is the final script.  It works and allows the user to exit the Squeak program and
> optionally shutdown or reboot.  The script is automatically on boot.
> 
> #!/bin/bash
> sudo systemctl start pigpiod
> 
> squeak -vm-display-null /usr/share/RaspberryRelay/RasRelay.image RasRelay.St
> ret=$?
> 
> if [ $ret -eq 1 ];
> then
> sudo reboot
> elif [ $ret -eq 2 ];
> then
> sudo halt
> fi
> 
> 
> 
> 
> 
> On Fri, 28 Apr 2017 20:05:46 -0400, "David T. Lewis" <lewis at mail.msen.com> wrote:
> 
> >Confirming: Yes it works with the latest Spur VM and Squeak trunk image.
> >
> >From a console window, run Squeak in the foreground (no '&' at the end of the command):
> >
> >$ spur64 my64BitImage
> >
> >Then in the image, do e.g. "Smalltalk snapshot: false andQuitWithExitCode: 3"
> >to quit without saving and return exit status 3.
> >
> >After the image exits, test the exit status that was returned to the shell:
> >
> >$ echo $?
> >3
> >
> >
> >Dave
> >
> >
> >On Fri, Apr 28, 2017 at 01:13:38PM -0400, Louis LaBrunda wrote:
> >> Hi Guys,
> >> 
> >> Thanks for the reply's.  I found:
> >> 
> >> snapshot: save andQuit: quit withExitCode: exitCode embedded: embeddedFlag
> >> 
> >> which looks like it will do what I want.  I will give it a try and report back.
> >> 
> >> Lou
> >> 
> >> 
> >> On Fri, 28 Apr 2017 18:43:59 +0200, Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com> wrote:
> >> 
> >> >2017-04-28 18:36 GMT+02:00 Nicolas Cellier <
> >> >nicolas.cellier.aka.nice at gmail.com>:
> >> >
> >> >>
> >> >>
> >> >> 2017-04-28 17:48 GMT+02:00 David T. Lewis <lewis at mail.msen.com>:
> >> >>
> >> >>> > Hi Squeakers,
> >> >>> >
> >> >>> > Is there a way to quit/exit Squeak with a return code that can be tested
> >> >>> > in a .so file?
> >> >>> >
> >> >>>
> >> >>> I think I remember implementing this a long time ago in the Unix VM. I
> >> >>> can't really look further right now but I'll check later and try to give a
> >> >>> better answer.
> >> >>>
> >> >>> IIRC, primitiveQuit can take an optional argument that is passed back to
> >> >>> the shell script that in turn gives you an exit code that you can test.
> >> >>> This probably is working right now in the interpreter VM (sorry I can't
> >> >>> check it at the moment). I'm not sure if it's in Cog/Spur, but if not it
> >> >>> can be easily added.
> >> >>>
> >> >>> Dave
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >> Answer is yes, if you browse the code on github,
> >> >> https://raw.githubusercontent.com/OpenSmalltalk/
> >> >> opensmalltalk-vm/Cog/src/vm/cointerp.c
> >> >> then you will see this:
> >> >>
> >> >>  /* 113 */ primitiveQuit,
> >> >>
> >> >> ... snip...
> >> >>
> >> >> 	/* InterpreterPrimitives>>#primitiveQuit */
> >> >> static void
> >> >> primitiveQuit(void)
> >> >> {   DECL_MAYBE_SQ_GLOBAL_STRUCT
> >> >> 	ioExitWithErrorCode((GIV(argumentCount) == 1
> >> >> 		? ((longAt(GIV(stackPointer))) >> 1)
> >> >> 		: 0));
> >> >> }
> >> >>
> >> >>
> >> >> So you can pass a SmallInteger to the primitive 113
> >> >>
> >> >> Then to know what the platform will do with this error code, just query it
> >> >> thru github web iface:
> >> >>
> >> >> https://github.com/OpenSmalltalk/opensmalltalk-vm/search?utf8=%E2%9C%93&q=
> >> >> ioExitWithErrorCode&type=
> >> >>
> >> >> Sorry, I wanted to post that all supported platforms would call
> >> >exit(errorCode), but I'm bad with web iface shortcuts...
> >> ><rant>
> >> >The windows squeak spur VM/image fixture insist on having shortcuts thru
> >> >ALT instead of CTRL which certainly DOES NOT HELP!!!
> >> ></rant>
> >> -- 
> >> Louis LaBrunda
> >> Keystone Software Corp.
> >> SkypeMe callto://PhotonDemon
> >> 
> >> 
> >
> -- 
> Louis LaBrunda
> Keystone Software Corp.
> SkypeMe callto://PhotonDemon
> 
> 


More information about the Squeak-dev mailing list