termite

Erlang style concurrency for Chicken Scheme

  1. termite
  2. Documentation
    1. Fundamental Operations
      1. spawn
      2. !
      3. ?
      4. ??
      5. !?
      6. recv
      7. spawn-link
      8. spawn-linked-to
    2. Distributed Operations
      1. make-node
      2. node-init
      3. remote-spawn
      4. remote-spawn-link
      5. on
    3. Error Handling
      1. with-exception-catcher
      2. with-exception-handler
      3. raise
      4. catch
    4. Stopping
      1. shutdown!
      2. halt!
      3. terminate!
  3. Examples
    1. Making a "server" process
    2. Selective message retrieval
    3. Distributed processing
  4. Notes
  5. Requirements
  6. Bugs and Limitations
  7. Author
  8. Version History
  9. License

Documentation

Fundamental Operations

spawn

[procedure] (spawn THUNK)

Create a process running thunk and returns its pid.

!

[procedure] (! PID MSG)

Send msg to process pid.

?

[procedure] (? [TIMEOUT [DEFAULT]])

Fetch a message from the mailbox. timeout is in seconds.

??

[procedure] (?? PRED)

Fetches next message that matches pred.

!?

[procedure] (!? PID MSG [TIMEOUT [DEFAULT]])

Send msg to process pid and wait for a reply.

recv

[procedure] (recv ((PAT VAR ACTION) [...]) [(after TIMEOUT TMO-ACTION)])

Receive a message, when it matches pat put it in var and take action (there can be many of these). Optionally, do tmo-action after timeout.

(This was documented from the termite.pdf, but it's not exported in chicken's termite.)

[procedure] (spawn-link THUNK)

Create a process running thunk and returns its pid and link to it. When either process dies, and exception is raised in the other process.

spawn-linked-to

[procedure] (spawn-linked-to THUNK TO)

Create a process running thunk and returns its pid and have it link to to (a pid). When either process dies, and exception is raised in the other process.

Distributed Operations

make-node

[procedure] (make-node HOST PORT)

Creates a node object for host:port and returns the node object.

node-init

[procedure] (node-init NODE)

Primary setup for creating a node to accept processes.

remote-spawn

[procedure] (remote-spawn NODE THUNK)

Run thunk on node, returns pid. Node needs to have done a node-init.

[procedure] (remote-spawn-link NODE THUNK)

Run thunk on node and link to it, returns pid.

on

[procedure] (on NODE THUNK)

Run thunk on node, returns result of thunk.

Error Handling

with-exception-catcher

[procedure] (with-exception-catcher HANDLER BODY)

Installs a dynamically scoped exception handler handler for the duration of body. Resumes execution a the point where the handler was installed.

with-exception-handler

[procedure] (with-exception-handler HANDLER BODY)

Installs a dynamically scoped exception handler handler for the duration of body. Resumes execution a the point where the exception was raised.

raise

[procedure] (raise EXCEPTION)

Raises exception.

catch

[procedure] (catch HANDLER BODY)

Catches an exception with handler during execution of body.

Stopping

shutdown!

[procedure] (shutdown!)

Stops gracefully. Linked processes receive a "normal" exit message.

halt!

[procedure] (halt!)

Stops ungracefully. Linked processes are clueless as to what happened.

terminate!

[procedure] (terminate! VICTIM)

Forcefully terminate a local(!) process. Processed linked to victim get a terminated message.

Examples

Making a "server" process

(define pong-server
  (spawn
    (lambda ()
      (let loop ()
        (let ((msg (?)))
          (if (and (list? msg)
                   (= (length msg) 2)
                   (pid? (car msg))
                   (eq? (cadr msg) 'ping))
            (let ((from (car msg)))
              (! from 'pong)
              (loop))
            (loop)))))))

(! pong-server (list (self) 'ping))

(?)                 --> pong

Selective message retrieval

(! (self) 1)
(! (self) 2)
(! (self) 3)

(?)                 --> 1
(?? odd?)           --> 3
(?)                 --> 2

Distributed processing

On node a:

(node-init (make-node "a.example.org" 12345))

On node b:

(define node-a (make-node "a.example.org" 12345))
(on node-a host-name)    --> "a.example.org"
(define p (remote-spawn node-a
                        (lambda ()
                         (let loop ()
                          (let ((x (?)))
                            (! (car x) ((cdr x)))
                            (loop))))))
(! p (cons (self) host-name))
(?)                      --> "a.example.org"

Notes

There's a paper about Termite.

Requirements

s11n mailbox mailbox-threads defstruct

Bugs and Limitations

Author

Gulliaume Germain, ported to Chicken by Christian Kellermann

Version History

License

Copyright (c) 2005-2008, Guillaume Germain<br> Termite is licensed under the same terms as Gambit-C (LGPL and Apache v.2)<br> It comes with absolutely no warranty of any kind.<br> LGPL 2.1