DRb stores the current client in Thread.current['DRb']['client'], but
there is no 'friendly' method to access it like
Thread.current['DRb']['server']'s #current_server.
I wrote the following patch to add #current_client:
Index: lib/drb/drb.rb
===================================================================
RCS file: /src/ruby/lib/drb/drb.rb,v
retrieving revision 1.21
diff -u -r1.21 drb.rb
--- lib/drb/drb.rb 28 Jul 2004 09:05:07 -0000 1.21
+++ lib/drb/drb.rb 10 Dec 2004 22:19:35 -0000
@@ -401,6 +401,11 @@
# See #current_server.
class DRbServerNotFound < DRbError; end
+ # Error raised by the DRb module when an attempt is made to refer to
+ # the context's current drb client but the context does not have one.
+ # See #current_client.
+ class DRbClientNotFound < DRbError; end
+
# Error raised by the DRbProtocol module when it cannot find any
# protocol implementation support the scheme specified in a URI.
class DRbBadURI < DRbError; end
@@ -1529,6 +1534,23 @@
return server
end
module_function :current_server
+
+ # Get the 'current' client.
+ #
+ # In the context of execution taking place within the main
+ # thread of a dRuby server (typically, as a result of a remote
+ # call on the server or one of its objects), the current
+ # client is that client.
+ #
+ # If the above rule fails to find a client, a DRbClientNotFound
+ # error is raised.
+ def current_client
+ drb = Thread.current['DRb']
+ client = (drb && drb['client']) ? drb['client'] : nil
+ raise DRbClientNotFound unless client
+ return client
+ end
+ module_function :current_client
# Stop the local dRuby server.
#