Outdated egg!

This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for the CHICKEN 5 version of this egg, if it exists.

If it does not exist, there may be equivalent functionality provided by another egg; have a look at the egg index. Otherwise, please consider porting this egg to the current version of CHICKEN.

termite

Erlang style concurrency for Chicken Scheme

  1. Outdated egg!
  2. termite
  3. 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!
  4. Examples
    1. Making a "server" process
    2. Selective message retrieval
    3. Distributed processing
  5. Notes
  6. Requirements
  7. Bugs and Limitations
  8. Author
  9. Version History
  10. 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