From 3b2a5f0903f59d0a58de4201ab4f16d34423bf25 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Sun, 5 Apr 2009 10:48:11 -0400 Subject: Threads demo --- demo/buffer.ur | 25 +++++++++++++++++++++++++ demo/buffer.urs | 5 +++++ demo/prose | 12 ++++++++++++ demo/threads.ur | 17 +++++++++++++++++ demo/threads.urp | 3 +++ demo/threads.urs | 1 + 6 files changed, 63 insertions(+) create mode 100644 demo/buffer.ur create mode 100644 demo/buffer.urs create mode 100644 demo/threads.ur create mode 100644 demo/threads.urp create mode 100644 demo/threads.urs (limited to 'demo') diff --git a/demo/buffer.ur b/demo/buffer.ur new file mode 100644 index 00000000..27e2b805 --- /dev/null +++ b/demo/buffer.ur @@ -0,0 +1,25 @@ +datatype lines = End | Line of string * source lines + +type t = { Head : source lines, Tail : source (source lines) } + +val create = + head <- source End; + tail <- source head; + return {Head = head, Tail = tail} + +fun renderL lines = + case lines of + End => + | Line (line, linesS) => {[line]}
+ +and renderS linesS = + lines <- signal linesS; + return (renderL lines) + +fun render t = renderS t.Head + +fun write t s = + oldTail <- get t.Tail; + newTail <- source End; + set oldTail (Line (s, newTail)); + set t.Tail newTail diff --git a/demo/buffer.urs b/demo/buffer.urs new file mode 100644 index 00000000..58312bbd --- /dev/null +++ b/demo/buffer.urs @@ -0,0 +1,5 @@ +type t + +val create : transaction t +val render : t -> signal xbody +val write : t -> string -> transaction unit diff --git a/demo/prose b/demo/prose index 11f8c2d9..80113c3e 100644 --- a/demo/prose +++ b/demo/prose @@ -234,3 +234,15 @@ batchG.urp

BatchFun.Make handles the plumbing of allocating the local state, using it to create widgets, and reading the state values when the user clicks "Batch it."

batchG.ur contains an example instantiation, which is just as easy to write as in the Crud1 example.

+ +threads.urp + +

Ur/Web makes it easy to write multi-threaded client-side code. This example demonstrates two threads writing to a page at once.

+ +

First, we define a useful component for sections of pages that can have lines of text added to them dynamically. This is the Buffer module. It contains an abstract type of writable regions, along with functions to create a region, retrieve a signal representing its HTML rendering, and add a new line to it.

+ +

The entry point to the main module Threads begins by creating a buffer. The function loop implements writing to that buffer periodically, incrementing a counter each time. The arguments to loop specify a prefix for the messages and the number of milliseconds to wait between writes.

+ +

We specify some client-side code to run on page load using the onload attribute of <body>. The onload code in this example spawns two separate threads running the loop code with different prefixes, update intervals, and starting counters.

+ +

Old hands at concurrent programming may be worried at the lack of synchronization in this program. Ur/Web uses cooperative multi-threading, not the more common preemptive multi-threading. Only one thread runs at a time, and only particular function calls can trigger context switches. In this example, sleep is the only such function that appears.

diff --git a/demo/threads.ur b/demo/threads.ur new file mode 100644 index 00000000..ac6d8cee --- /dev/null +++ b/demo/threads.ur @@ -0,0 +1,17 @@ +fun main () = + buf <- Buffer.create; + let + fun loop prefix delay = + let + fun loop' n = + Buffer.write buf (prefix ^ ": Message #" ^ show n); + sleep delay; + loop' (n + 1) + in + loop' + end + in + return + + + end diff --git a/demo/threads.urp b/demo/threads.urp new file mode 100644 index 00000000..153e09a9 --- /dev/null +++ b/demo/threads.urp @@ -0,0 +1,3 @@ + +buffer +threads diff --git a/demo/threads.urs b/demo/threads.urs new file mode 100644 index 00000000..6ac44e0b --- /dev/null +++ b/demo/threads.urs @@ -0,0 +1 @@ +val main : unit -> transaction page -- cgit v1.2.3