[Soot-list] queries on threads

Arnab De arnabde03 at gmail.com
Mon Apr 3 15:20:56 EDT 2006


Hi,
while jimplifying a multithreaded program with soot, I saw some pecularities
in the generated jimple code. the java code is (taken from "The Java
Programming Language, Third Edition"):

class Friendly{
    private Friendly partner;
    private String name;

    public Friendly(String name){
        this.name = name;
    }

    public synchronized void hug(){
        System.out.println(Thread.currentThread().getName() + "in " + name +
".hug() trying to invoke " + partner.name + ".hugBack()");
        Thread.currentThread().yield();
        partner.hugBack();
    }

    private synchronized void hugBack(){
        System.out.println(Thread.currentThread().getName() + "in " + name +
".hugBack()");
    }

    public void becomeFriend(Friendly partner){
        this.partner = partner;
    }

    public static void main(String[] args){
        final Friendly jareth = new Friendly("jareth");
        final Friendly cory = new Friendly("cory");

        jareth.becomeFriend(cory);
        cory.becomeFriend(jareth);

        new Thread(new Runnable(){
            public void run(){jareth.hug();}
        }, "Thread1").start();

        new Thread(new Runnable(){
            public void run(){cory.hug();}
        }, "Thread2").start();
    }
}

The generated jimple code for method "hug" is given below:

public synchronized void hug()
    {
        Friendly this, $r4, $r7;
        java.io.PrintStream $r0;
        java.lang.StringBuffer $r1;
        java.lang.Thread $r2;
        java.lang.String $r3, $r5;

        this := @this: Friendly;
        $r0 = <java.lang.System: java.io.PrintStream out>;
        $r1 = new java.lang.StringBuffer;
        specialinvoke $r1.<java.lang.StringBuffer: void <init>()>();
        $r2 = staticinvoke <java.lang.Thread:
java.lang.ThreadcurrentThread()>();
        $r3 = virtualinvoke $r2.<java.lang.Thread: java.lang.StringgetName()>();
        $r1 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringBuffer append(java.lang.String)>($r3);
        $r1 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringBuffer append(java.lang.String)>("in ");
        $r3 = this.<Friendly: java.lang.String name>;
        $r1 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringBuffer append(java.lang.String)>($r3);
        $r1 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringBuffer append(java.lang.String)>(".hug() trying to invoke
");
        $r4 = this.<Friendly: Friendly partner>;
        $r3 = $r4.<Friendly: java.lang.String name>;
        $r1 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringBuffer append(java.lang.String)>($r3);
        $r1 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringBuffer append(java.lang.String)>(".hugBack()");
        $r5 = virtualinvoke $r1.<java.lang.StringBuffer:
java.lang.StringtoString()>();
        virtualinvoke $r0.<java.io.PrintStream: void println(
java.lang.String)>($r5);
        staticinvoke <java.lang.Thread: java.lang.Thread currentThread()>();
        staticinvoke <java.lang.Thread: void yield()>();
        $r7 = this.<Friendly: Friendly partner>;
        specialinvoke $r7.<Friendly: void hugBack()>();
        return;
    }

Please observe that there is a "specialinvoke" in the last but one line
(just before the return statement). As far as I understand, specialinvokes
are for constructors. Can anyone please tell me why specialinvoke has come
here?
Thanks and regards,
Arnab.


--
Arnab De
ME (CSE)
Computer Science & Automation Dept.
IISc, Bangalore.
------------------------------------------------------------------------
Gravitaton can't be held responsible for people falling in love.
--Einstein
------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20060404/629508fc/attachment.htm


More information about the Soot-list mailing list