From: ludo@gnu.org (Ludovic Courtès)
To: guile-user@gnu.org
Subject: Re: Long-lived Guile scripts in a mono-threaded game engine
Date: Tue, 27 May 2008 20:08:52 +0200 [thread overview]
Message-ID: <87bq2rhb63.fsf@gnu.org> (raw)
In-Reply-To: 20080527161445.GB18239@perso.beuc.net
Hi,
Sylvain Beucler <beuc@beuc.net> writes:
> So the script does not (sleep). In this game, the engine is a mini-OS
> with a non-preemptive process model.
So "scripts" are supposed to be cooperative, and invoking `say_stop'
amounts to doing a `yield', right?
Then your question boils down to how to implement `yield'. Using
continuations, that would be something like this:
(define (my-hook schedule)
(define (yield)
(call/cc schedule))
;; do stuff...
(yield)
;; do more stuff
)
Where `my-hook' is invoked by the engine and SCHEDULE is a continuation
to invoke the engine, which may in turn schedule another co-routine, and
so on.
You could save one `call/cc' by abusing exceptions (which do not involve
stack copying, unlike `call/cc'):
(define (my-hook)
(define (yield)
(call/cc
(lambda (resume)
(throw 'yield-to-scheduler resume))))
;; do stuff...
(yield)
;; do more stuff
)
... where the `yield-to-scheduler' exception would be caught by the
engine. With a bit of syntactic sugar, this could be hidden from
programmers.
But again, I would avoid `call/cc' at all because of its performance
hit. Avoiding it would require explicit CPS, which may admittedly be
unsuitable given the audience:
(define (my-hook)
(define (yield resume)
(throw 'yield-to-scheduler resume))
;; do stuff...
(yield (lambda ()
;; do more stuff
)))
Given the drawbacks of these solutions, evaluating scripts in a separate
pthread looks like a good solution. :-)
> Yeah, I was trying to avoid introducing threads in the engine :)
> But it sounds like the only usable solution as of now.
It's actually not silly now that we've entered the multicore era.
> Ideally Guile would offer a '(pause)' function that would return from
> 'scm_eval_string' or similar, with another 'scm_resume()' function
> that would unfreeze it :)
That would most likely have to be implemented in terms of `call/cc' as
shown above, so it wouldn't help much.
Thanks,
Ludovic
next prev parent reply other threads:[~2008-05-27 18:08 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-26 21:19 Long-lived Guile scripts in a mono-threaded game engine Sylvain Beucler
2008-05-27 7:58 ` Ludovic Courtès
2008-05-27 8:33 ` Sylvain Beucler
2008-05-27 13:20 ` Ludovic Courtès
2008-05-27 16:14 ` Sylvain Beucler
2008-05-27 18:08 ` Ludovic Courtès [this message]
2008-05-27 19:57 ` Sylvain Beucler
2008-05-27 20:30 ` Clinton Ebadi
2008-05-27 18:19 ` Clinton Ebadi
2008-05-27 21:49 ` Neil Jerram
2008-05-27 13:42 ` Paul Emsley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bq2rhb63.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=guile-user@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).