10 |
|
|
11 |
type 'a event = 'a CML.event |
type 'a event = 'a CML.event |
12 |
|
|
13 |
fun mkRPC f = let |
fun call reqMB arg = let |
|
val reqMb = Mailbox.mailbox() |
|
|
fun call arg = let |
|
14 |
val replV = SyncVar.iVar() |
val replV = SyncVar.iVar() |
15 |
in |
in |
16 |
Mailbox.send(reqMb, (arg, replV)); |
Mailbox.send(reqMb, (arg, replV)); |
17 |
SyncVar.iGet replV |
SyncVar.iGet replV |
18 |
end |
end |
19 |
val reqEvt = Mailbox.recvEvt reqMb |
|
20 |
val entry = CML.wrap ( |
fun mkRPC f = let |
21 |
reqEvt, |
val reqMb = Mailbox.mailbox() |
22 |
|
val entryEvt = CML.wrap ( |
23 |
|
Mailbox.recvEvt reqMb, |
24 |
fn (arg, replV) => SyncVar.iPut(replV, f arg)) |
fn (arg, replV) => SyncVar.iPut(replV, f arg)) |
25 |
in |
in |
26 |
{ call = call, entryEvt = entry } |
{ call = call reqMB, entryEvt = entryEvt } |
27 |
end |
end |
28 |
|
|
29 |
fun mkRPC_In f = let |
fun mkRPC_In f = let |
30 |
val reqMb = Mailbox.mailbox() |
val reqMb = Mailbox.mailbox() |
|
fun call arg = let |
|
|
val replV = SyncVar.iVar() |
|
|
in |
|
|
Mailbox.send(reqMb, (arg, replV)); |
|
|
SyncVar.iGet replV |
|
|
end |
|
31 |
val reqEvt = Mailbox.recvEvt reqMb |
val reqEvt = Mailbox.recvEvt reqMb |
32 |
fun entry state = CML.wrap ( |
fun entryEvt state = CML.wrap ( |
33 |
reqEvt, |
reqEvt, |
34 |
fn (arg, replV) => SyncVar.iPut(replV, f(arg, state))) |
fn (arg, replV) => SyncVar.iPut(replV, f(arg, state))) |
35 |
in |
in |
36 |
{ call = call, entryEvt = entry } |
{ call = call reqMB, entryEvt = entryEvt } |
37 |
end |
end |
38 |
|
|
39 |
fun mkRPC_InOut f = let |
fun mkRPC_Out f = let |
40 |
val reqMb = Mailbox.mailbox() |
val reqMb = Mailbox.mailbox() |
41 |
fun call arg = let |
val reqEvt = Mailbox.recvEvt reqMb |
42 |
val replV = SyncVar.iVar() |
val entryEvt = CML.wrap ( |
43 |
|
reqEvt, |
44 |
|
fn (arg, replV) => let val (res, state') = f arg |
45 |
in |
in |
46 |
Mailbox.send(reqMb, (arg, replV)); |
SyncVar.iPut(replV, res); state' |
47 |
SyncVar.iGet replV |
end) |
48 |
|
in |
49 |
|
{ call = call reqMB, entryEvt = entryEvt } |
50 |
end |
end |
51 |
|
|
52 |
|
fun mkRPC_InOut f = let |
53 |
|
val reqMb = Mailbox.mailbox() |
54 |
val reqEvt = Mailbox.recvEvt reqMb |
val reqEvt = Mailbox.recvEvt reqMb |
55 |
fun entry state = CML.wrap ( |
fun entryEvt state = CML.wrap ( |
56 |
reqEvt, |
reqEvt, |
57 |
fn (arg, replV) => let val (res, state') = f(arg, state) |
fn (arg, replV) => let val (res, state') = f(arg, state) |
58 |
in |
in |
59 |
SyncVar.iPut(replV, res); state' |
SyncVar.iPut(replV, res); state' |
60 |
end) |
end) |
61 |
in |
in |
62 |
{ call = call, entryEvt = entry } |
{ call = call reqMB, entryEvt = entryEvt } |
63 |
end |
end |
64 |
|
|
65 |
end |
end |