src/Pure/Concurrent/mailbox.ML
author haftmann
Tue, 20 Jul 2010 06:35:29 +0200
changeset 37891 c26f9d06e82c
parent 29564 f8b933a62151
child 52583 0a7240d88e09
permissions -rw-r--r--
robustified metis proof
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28135
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Concurrent/mailbox.ML
28140
a74a1c580360 proper header;
wenzelm
parents: 28139
diff changeset
     2
    Author:     Makarius
28135
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
     3
28579
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
     4
Message exchange via mailbox, with non-blocking send (due to unbounded
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
     5
queueing) and potentially blocking receive.
28135
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
     6
*)
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
     7
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
     8
signature MAILBOX =
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
     9
sig
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    10
  type 'a T
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    11
  val create: unit -> 'a T
28170
a18cf8a0e656 tuned Mailbox.send;
wenzelm
parents: 28158
diff changeset
    12
  val send: 'a T -> 'a -> unit
28579
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    13
  val receive: 'a T -> 'a
28139
831e545c655e added receive_timeout;
wenzelm
parents: 28135
diff changeset
    14
  val receive_timeout: Time.time -> 'a T -> 'a option
28135
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    15
end;
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    16
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    17
structure Mailbox: MAILBOX =
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    18
struct
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    19
28576
dc4aae271c41 simplified implementation using Synchronized.var;
wenzelm
parents: 28443
diff changeset
    20
datatype 'a T = Mailbox of 'a Queue.T Synchronized.var;
28579
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    21
28576
dc4aae271c41 simplified implementation using Synchronized.var;
wenzelm
parents: 28443
diff changeset
    22
fun create () = Mailbox (Synchronized.var "mailbox" Queue.empty);
28135
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    23
28579
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    24
fun send (Mailbox mailbox) msg =
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    25
  Synchronized.change mailbox (Queue.enqueue msg);
28139
831e545c655e added receive_timeout;
wenzelm
parents: 28135
diff changeset
    26
28579
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    27
fun receive (Mailbox mailbox) =
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    28
  Synchronized.guarded_access mailbox (try Queue.dequeue);
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    29
28576
dc4aae271c41 simplified implementation using Synchronized.var;
wenzelm
parents: 28443
diff changeset
    30
fun receive_timeout timeout (Mailbox mailbox) =
28579
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    31
  Synchronized.timed_access mailbox
0c50f8977971 simplified synchronized variable access;
wenzelm
parents: 28576
diff changeset
    32
    (fn _ => SOME (Time.+ (Time.now (), timeout))) (try Queue.dequeue);
28135
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    33
4f6f0496e93c Concurrent message exchange via mailbox -- with unbounded queueing.
wenzelm
parents:
diff changeset
    34
end;