[gPXE-devel] (no subject)

Shao Miller Shao.Miller at yrdsb.edu.on.ca
Sun Mar 14 14:14:16 EDT 2010


Stefan Hajnoczi wrote:
>
> The 'loopif' command does two things: a conditional and a loop.  I 
> wanted to
> see how expensive a general form of control flow would be with if/goto.
>

One of the ideas I had about 'loopif' was that one could have a 
collection of specialized scripts and the top-level script could do 
something like:

#!gpxe
set keep-running 1
imgfree
imgload ${next-script}.gpxe
boot ${next-script}.gpxe
loopif ${keep-running}

Other scripts could then set next-script and keep-running as needed in 
order to perform something akin to 'goto'.  I really wanted to offer 
something that could achieve flow control with minimal impact on gPXE 
code size.  Having said that...

> Expressing 'loopif' using if/goto looks like this:
> #!gpxe
> : start
>

I totally agree that this is a nice form for the user to define a 'goto' 
point.

> [...]
> if ${condition} goto start
>
> The 'if' command can be used to predicate any command, not just a 'goto':
> if ${initrd} initrd ${initrd}
>

Also totally agreed.  If we ever have something akin to $(command) where 
it expands to command's return code, this could stay the same, too.

> Similarly, 'goto' is its own command and can be used independent of 'if':
> : loop
> [...]
> goto loop
>

Agreed again.  Once you have these, it would seem that gPXE has more to 
offer to the sysadmin who wishes to support a variety of startup 
strategies.  The only "problem" I perceive is the unpopularity of 'goto' 
and labels amongst those who prefer less primitive flow control 
semantics.  It's not a problem for DOS batch files.  Tracking named 
labels suggests a bit more of a code cost than breaking out of a 
"control block" or looping back to its beginning.  Both can be enjoyable. :)

> The uncompressed code size of my 'ifgoto' branch is +541 bytes:
> http://git.etherboot.org/?p=people/stefanha/gpxe.git;a=shortlog;h=refs/heads/ifgoto
>

While more expensive in code size than 'exit' and 'loopif', it's not 
nearly as complicated for the script developer as the script I offered 
way above.  Although 'exit' and 'loopif' example scripts could be 
offered on the wiki, who needs an example of ': label', 'goto' and 
'if'?  How much burden should be on the script developer versus on 
gPXE's size? :)

> (Note that we don't have expression evaluation in mainline gPXE, so 
> the 'if' command is not very useful yet.)
>

Also true for 'loopif' at this time.  We also don't have strtol() and we 
don't have "%lu".  Heheh.

> The if/goto approach is not as nice as the control flow (if, while, 
> for, and try) that Lynus Vaz developed for his Summer of Code project, 
> but I am going to compare code size to see what the difference is.
>
> Thoughts?
>

Whatever we go with, if anything, hopefully it's easy to re-implement if 
the script/CLI parsing system is ever rewritten entirely.

Thanks for this, Stefan.

- Shao Miller
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://etherboot.org/pipermail/gpxe-devel/attachments/20100314/b3479f3c/attachment.html 


More information about the gPXE-devel mailing list