PreviousUpNext

15.4.924  src/lib/src/lib/thread-kit/src/lib/simple-rpc.pkg

## simple-rpc.pkg

# Compiled by:
#     src/lib/std/standard.lib

# Generators for simple RPC protocols.



###           "You don't have to burn books to destroy a culture.
###            Just get people to stop reading them."
###
###                                 -- Ray Bradbury



package   simple_rpc
: (weak)  Simple_Rpc                                    # Simple_Rpc    is from   src/lib/src/lib/thread-kit/src/lib/simple-rpc.api
{
    include threadkit;                                  # threadkit     is from   src/lib/src/lib/thread-kit/src/core-thread-kit/threadkit.pkg

    Mailop(X)
        =
        threadkit::Mailop(X);

    fun call  request_queue  arg
        =
        {   reply_drop = make_oneshot_maildrop ();
          
            push (request_queue, (arg, reply_drop));

            get  reply_drop;
        };

    fun make_rcp f
        =
        {   request_q = make_mailqueue ();

            entry_mailop
                =
                pull'  request_q
                    ==>
                    (fn (arg, reply_drop) = set (reply_drop, f arg));
          
            { call => call request_q,
              entry_mailop
            };
        };

    fun make_rcp_in f
        =
        {   request_q  =  make_mailqueue  ();
            req_mailop =  pull'  request_q;

            fun entry_mailop  state
                =
                threadkit::wrap
                  (
                    req_mailop,

                    fn (arg, reply_drop)
                        =
                        set (reply_drop, f (arg, state))
                  );
          
            { call => call request_q,
              entry_mailop
            };
        };

    fun make_rcp_out f
        =
        {   request_q  =  make_mailqueue  ();
            req_mailop =  pull' request_q;

            entry_mailop
                =
                req_mailop
                    ==>
                   (fn (arg, reply_drop)
                        =
                        {   my (result, state')
                                  =
                                  f arg;

                            set (reply_drop, result);

                            state';
                        }
                   );

              { call => call request_q,
                entry_mailop
              };
        };

    fun make_rcp_in_out f
        =
        {   request_q  =  make_mailqueue  ();
            req_mailop =  pull'  request_q;

            fun entry_mailop  state
                =
                req_mailop
                    ==>
                   (fn (arg, reply_drop)
                        =
                        {   my (result, state')
                                =
                                f (arg, state);

                            set (reply_drop, result);

                            state';
                        });

            { call => call request_q,
              entry_mailop
            };
        };

};


## COPYRIGHT (c) 1997 AT&T Labs Research.
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2012,
## released under Gnu Public Licence version 3.


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext