3.4 Object Passing by Reference

(See horb/examples/objRefSend for example code.)

We have explored object passing by copying. In this subsection we will learn to pass objects by reference. While a copy of an object is passed to a remote object in the previous examples, now a reference (pointer) to a remote object is passed to another remote object (see diagram below). This is quite useful when you want to pass a handle of a service to another remote object.

Object passing by reference

The usage is quite simple since a remote object reference is always passed as is. Let's assume there are two remote object references, remote1 and remote2. If we pass remote2 to a method of remote1, remote1 can then use remote2 as a remote object reference as is.

        // Caller side:
        . . .
        remote1.op1(remote2);
        . . .

        // Callee side
        class Remote1 {
            void op1(Remote2 remote) {
               remote.anotherOp();        // remote is a remote object reference
            . . .

Note that ORB (the HORB runtime) creates a new TCP/IP connection when a remote object reference is passed. At the same time a new thread of the server object is created to service the connection. Generally a new TCP/IP connection and a thread of the server object is created when a new remote object reference is created. We must properly synchronize the threads. A connection can be released by _release() method of proxy objects.

Here is another example of remote object reference passing. In this example we use three objects, One, Two, and Three. Object One calls a method of Two with a remote object reference to Three. Then Two calls a method of Three via the remote object reference.

        One ->  Two  -> Three

Class One makes a remote object of Two and a remote object of Three, then calls Two's trip() method with a remote object reference to Three.

	// One.java
	package horb.examples.objRefSend;
	import horb.orb.*;

	class One {
	  public static void main(String argv[]) {

	    String host = (argv.length == 1) ? argv[0] : "-";
	    HorbURL url = new HorbURL(host, null);

	    Two_Proxy two = new Two_Proxy(url);
	    Three_Proxy three = new Three_Proxy(url);

	    String result = two.trip(three, "One->")+"One";

	    System.out.println("result = " + result);
	  }
	}

Class Two receives the remote object reference, and then calls trip() method of class Three through the remote object reference.

	// Two.java
	package horb.examples.objRefSend;

	class Two {
	  String trip(Three_Proxy three, String msg) {
	    return three.trip(msg+"Two->")+"Two->";
	  }
	}

Now, class Three returns a message.

        // Three.java
	package horb.examples.objRefSend;

	public class Three {
	  public String trip(String msg) {
	    return msg+"Three->";
	  }
	}

Let's see how we compile and execute this code.

        c:> horbc Three.java Two.java
        c:> horbc -c One.java

        c:> horb                (in another window)
        c:> java horb.examples.objRefSend.One
        result = One->Two->Three->Two->One