Merge branch 'master' of git://factorcode.org/git/factor
[factor/jcg.git] / basis / concurrency / mailboxes / mailboxes-docs.factor
blob234fb27d60806cec467b0253b45b2cddd24ab46a
1 USING: help.markup help.syntax kernel arrays calendar ;\r
2 IN: concurrency.mailboxes\r
3 \r
4 HELP: <mailbox>\r
5 { $values { "mailbox" mailbox } }\r
6 { $description "A mailbox is an object that can be used for safe thread communication. Items can be put in the mailbox and retrieved in a FIFO order. If the mailbox is empty when a get operation is performed then the thread will block until another thread places something in the mailbox. If multiple threads are waiting on the same mailbox, only one of the waiting threads will be unblocked to thread the get operation." } ;\r
7 \r
8 HELP: mailbox-empty?\r
9 { $values { "mailbox" mailbox } \r
10           { "bool" "a boolean" }\r
11 }\r
12 { $description "Return true if the mailbox is empty." } ;\r
14 HELP: mailbox-put\r
15 { $values { "obj" object } \r
16           { "mailbox" mailbox } \r
17 }\r
18 { $description "Put the object into the mailbox. Any threads that have a blocking get on the mailbox are resumed. Only one of those threads will successfully get the object, the rest will immediately block waiting for the next item in the mailbox." } ;\r
20 HELP: block-unless-pred\r
21 { $values { "pred" { $quotation "( obj -- ? )" } } \r
22     { "mailbox" mailbox }\r
23     { "timeout" "a " { $link duration } " or " { $link f } }\r
24 }\r
25 { $description "Block the thread if there are no items in the mailbox that return true when the predicate is called with the item on the stack." } ;\r
27 HELP: block-if-empty\r
28 { $values { "mailbox" mailbox } \r
29     { "timeout" "a " { $link duration } " or " { $link f } }\r
30 }\r
31 { $description "Block the thread if the mailbox is empty." } ;\r
33 HELP: mailbox-get\r
34 { $values { "mailbox" mailbox } { "obj" object } }\r
35 { $description "Get the first item put into the mailbox. If it is empty the thread blocks until an item is put into it. The thread then resumes, leaving the item on the stack." } ;\r
37 HELP: mailbox-get-all\r
38 { $values { "mailbox" mailbox } { "array" array } }\r
39 { $description "Blocks the thread if the mailbox is empty, otherwise removes all objects in the mailbox and returns an array containing the objects." } ;\r
41 HELP: while-mailbox-empty\r
42 { $values { "mailbox" mailbox } \r
43           { "quot" { $quotation "( -- )" } }\r
44 }\r
45 { $description "Repeatedly call the quotation while there are no items in the mailbox." } ;\r
47 HELP: mailbox-get?\r
48 { $values { "mailbox" mailbox } \r
49           { "pred" { $quotation "( obj -- ? )" } }\r
50           { "obj" object }\r
51 }\r
52 { $description "Get the first item in the mailbox which satisfies the predicate. When the predicate returns true that item will be returned. If nothing in the mailbox satisfies the predicate then the thread will block until something does." } ;\r
54 ARTICLE: "concurrency.mailboxes" "Mailboxes"\r
55 "A " { $emphasis "mailbox" } " is a first-in-first-out queue where the operation of removing an element blocks if the queue is empty. Mailboxes are implemented in the " { $vocab-link "concurrency.mailboxes" } " vocabulary."\r
56 { $subsection mailbox }\r
57 { $subsection <mailbox> }\r
58 "Removing the first element:"\r
59 { $subsection mailbox-get }\r
60 { $subsection mailbox-get-timeout }\r
61 "Removing the first element matching a predicate:"\r
62 { $subsection mailbox-get? }\r
63 { $subsection mailbox-get-timeout? }\r
64 "Emptying out a mailbox:"\r
65 { $subsection mailbox-get-all }\r
66 "Adding an element:"\r
67 { $subsection mailbox-put }\r
68 "Testing if a mailbox is empty:"\r
69 { $subsection mailbox-empty? }\r
70 { $subsection while-mailbox-empty } ;\r
72 ABOUT: "concurrency.mailboxes"\r