Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | (* simple-rpc.sig |
2 | * 2004 Matthew Fluet (mfluet@acm.org) | |
3 | * Ported to MLton threads. | |
4 | *) | |
5 | ||
6 | (* simple-rpc.sml | |
7 | * | |
8 | * COPYRIGHT (c) 1997 AT&T Labs Research. | |
9 | * | |
10 | * Generators for simple RPC protocols. | |
11 | *) | |
12 | ||
13 | structure SimpleRPC : SIMPLE_RPC = | |
14 | struct | |
15 | ||
16 | type 'a event = 'a CML.event | |
17 | ||
18 | fun call reqMB arg = | |
19 | let val replV = SyncVar.iVar() | |
20 | in | |
21 | Mailbox.send(reqMB, (arg, replV)) | |
22 | ; SyncVar.iGet replV | |
23 | end | |
24 | ||
25 | fun mkRPC f = | |
26 | let | |
27 | val reqMB = Mailbox.mailbox() | |
28 | val entryEvt = | |
29 | CML.wrap | |
30 | (Mailbox.recvEvt reqMB, fn (arg, replV) => | |
31 | SyncVar.iPut(replV, f arg)) | |
32 | in | |
33 | {call = call reqMB, entryEvt = entryEvt} | |
34 | end | |
35 | ||
36 | fun mkRPC_In f = | |
37 | let | |
38 | val reqMB = Mailbox.mailbox() | |
39 | val reqEvt = Mailbox.recvEvt reqMB | |
40 | fun entryEvt state = | |
41 | CML.wrap | |
42 | (reqEvt, fn (arg, replV) => | |
43 | SyncVar.iPut(replV, f(arg, state))) | |
44 | in | |
45 | {call = call reqMB, entryEvt = entryEvt} | |
46 | end | |
47 | ||
48 | fun mkRPC_Out f = | |
49 | let | |
50 | val reqMB = Mailbox.mailbox() | |
51 | val reqEvt = Mailbox.recvEvt reqMB | |
52 | val entryEvt = | |
53 | CML.wrap | |
54 | (reqEvt, fn (arg, replV) => | |
55 | let val (res, state') = f arg | |
56 | in SyncVar.iPut(replV, res); state' | |
57 | end) | |
58 | in | |
59 | {call = call reqMB, entryEvt = entryEvt} | |
60 | end | |
61 | ||
62 | fun mkRPC_InOut f = | |
63 | let | |
64 | val reqMB = Mailbox.mailbox() | |
65 | val reqEvt = Mailbox.recvEvt reqMB | |
66 | fun entryEvt state = | |
67 | CML.wrap | |
68 | (reqEvt, fn (arg, replV) => | |
69 | let val (res, state') = f(arg, state) | |
70 | in SyncVar.iPut(replV, res); state' | |
71 | end) | |
72 | in | |
73 | {call = call reqMB, entryEvt = entryEvt} | |
74 | end | |
75 | end |