58 lines
2.1 KiB
Racket
58 lines
2.1 KiB
Racket
#lang scribble/doc
|
|
@(require "web-server.rkt")
|
|
|
|
@title[]{Serializable Continuations}
|
|
|
|
@(require (for-label web-server/lang/abort-resume
|
|
"dummy-stateless-servlet.rkt"
|
|
racket/serialize))
|
|
|
|
@defmodule[web-server/lang/abort-resume]{
|
|
|
|
The main purpose of the stateless language is to provide serializable continuations to your servlet.
|
|
|
|
@defproc[(call-with-serializable-current-continuation [response-generator (continuation? . -> . any)])
|
|
any]{
|
|
Captures the current continuation in a serializable way and calls @racket[response-generator] with it, returning the result.
|
|
|
|
This potentially uses resources of the current servlet's @racket[manager] if @racket[serial->native] and @racket[native->serial] were used
|
|
to capture an untransformable context.
|
|
}
|
|
|
|
@defform[(serial->native expr)]{
|
|
@racket[serial->native] informs the serializing runtime that @racket[expr] is potentially a call to an untransformed context.
|
|
This sets up the necessary information for
|
|
@racket[native->serial] to signal to @racket[call-with-serializable-current-continuation] to capture the native (and thus unserializable) section
|
|
of the context and store it on the server.
|
|
}
|
|
|
|
@defform[(native->serial expr)]{
|
|
@racket[native->serial] informs the serializing runtime that @racket[expr] marks first expression after returning from an untransformed context.
|
|
This captures the
|
|
untransformed context such that @racket[call-with-serializable-current-continuation] can store it on the server and reference it from serializable
|
|
continuations.
|
|
|
|
For example,
|
|
@racketblock[
|
|
(build-list
|
|
3
|
|
(lambda (i)
|
|
(call-with-serializable-current-continuation
|
|
(lambda (k) (serialize k)))))
|
|
]
|
|
will fail at runtime because @racket[build-list] is not transformed. However,
|
|
@racketblock[
|
|
(serial->native
|
|
(build-list
|
|
3
|
|
(lambda (i)
|
|
(native->serial
|
|
(call-with-serializable-current-continuation
|
|
(lambda (k) (serialize k)))))))
|
|
]
|
|
will succeed and @racket[k] will reference a cell in the current servlet's @racket[manager] that stores the part of the continuation in
|
|
@racket[build-list].
|
|
}
|
|
|
|
}
|