Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/cml/cml-lib/simple-rpc.sml
ViewVC logotype

Diff of /sml/trunk/src/cml/cml-lib/simple-rpc.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3, Sat Oct 4 23:33:46 1997 UTC revision 289, Sat May 22 21:01:25 1999 UTC
# Line 10  Line 10 
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

Legend:
Removed from v.3  
changed lines
  Added in v.289

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0