[Soot-list] questions on synchronization

Arnab De arnabde03 at gmail.com
Sun Apr 23 12:33:26 EDT 2006


Hi all,
I'm attaching here a small code and its jimple version:

Java code:

class Friendly extends Thread{
    private Friendly partner;
    private String name;
    Lock l;


    static Lock l1 = new Lock();
    static Lock l2 = new Lock();

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

    public void hug(){
        synchronized(l){
            System.out.println("here");
            yield();
            partner.hugBack();
        }
    }

    public void hugBack(){
        synchronized(l){
            System.out.println("there");
        }
    }

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

    public void run(){
        hug();
    }

    public static void main(String[] args){

        final Friendly jareth = new Friendly("jareth", l1);
        final Friendly cory = new Friendly("cory", l2);

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

        jareth.start();
        cory.start();

    }
}

class Lock{
}

Jimple version (of class Friendly):

class Friendly extends java.lang.Thread
{
    private Friendly partner;
    private java.lang.String name;
    Lock l;
    static Lock l1;
    static Lock l2;

    public void <init>(java.lang.String, Lock)
    {
        Friendly this;
        java.lang.String name;
        Lock l;

        this := @this: Friendly;
        name := @parameter0: java.lang.String;
        l := @parameter1: Lock;
        specialinvoke this.<java.lang.Thread: void <init>()>();
        this.<Friendly: java.lang.String name> = name;
        this.<Friendly: Lock l> = l;
        return;
    }

    public void run()
    {
        Friendly this;

        this := @this: Friendly;
        virtualinvoke this.<Friendly: void hug()>();
        return;
    }

    public void hugBack()
    {
        Friendly this;
        Lock l1, $r0;
        java.lang.Throwable l2, $r2;
        java.io.PrintStream $r1;

        this := @this: Friendly;
        $r0 = this.<Friendly: Lock l>;
        l1 = $r0;
        entermonitor $r0;

     label0:
        $r1 = <java.lang.System: java.io.PrintStream out>;
        virtualinvoke $r1.<java.io.PrintStream: void println(
java.lang.String)>("there");
        exitmonitor l1;

     label1:
        goto label5;

     label2:
        $r2 := @caughtexception;

     label3:
        l2 = $r2;
        exitmonitor l1;

     label4:
        throw l2;

     label5:
        return;

        catch java.lang.Throwable from label0 to label1 with label2;
        catch java.lang.Throwable from label3 to label4 with label2;
    }

    public void becomeFriend(Friendly)
    {
        Friendly this, partner;

        this := @this: Friendly;
        partner := @parameter0: Friendly;
        this.<Friendly: Friendly partner> = partner;
        return;
    }

    public void hug()
    {
        Friendly this, $r2;
        Lock l1, $r0;
        java.lang.Throwable l2, $r3;
        java.io.PrintStream $r1;

        this := @this: Friendly;
        $r0 = this.<Friendly: Lock l>;
        l1 = $r0;
        entermonitor $r0;

     label0:
        $r1 = <java.lang.System: java.io.PrintStream out>;
        virtualinvoke $r1.<java.io.PrintStream: void println(
java.lang.String)>("here");
        staticinvoke <Friendly: void yield()>();
        $r2 = this.<Friendly: Friendly partner>;
        virtualinvoke $r2.<Friendly: void hugBack()>();
        exitmonitor l1;

     label1:
        goto label5;

     label2:
        $r3 := @caughtexception;

     label3:
        l2 = $r3;
        exitmonitor l1;

     label4:
        throw l2;

     label5:
        return;

        catch java.lang.Throwable from label0 to label1 with label2;
        catch java.lang.Throwable from label3 to label4 with label2;
    }

    public static void main(java.lang.String[])
    {
        java.lang.String[] args;
        Friendly $r0, jareth, cory;
        Lock $r1;

        args := @parameter0: java.lang.String[];
        $r0 = new Friendly;
        $r1 = <Friendly: Lock l1>;
        specialinvoke $r0.<Friendly: void
<init>(java.lang.String,Lock)>("jareth",
$r1);
        jareth = $r0;
        $r0 = new Friendly;
        $r1 = <Friendly: Lock l2>;
        specialinvoke $r0.<Friendly: void
<init>(java.lang.String,Lock)>("cory",
$r1);
        cory = $r0;
        virtualinvoke jareth.<Friendly: void becomeFriend(Friendly)>(cory);
        virtualinvoke cory.<Friendly: void becomeFriend(Friendly)>(jareth);
        virtualinvoke jareth.<Friendly: void start()>();
        virtualinvoke cory.<Friendly: void start()>();
        return;
    }

    static void <clinit>()
    {
        Lock $r0;

        $r0 = new Lock;
        specialinvoke $r0.<Lock: void <init>()>();
        <Friendly: Lock l1> = $r0;
        $r0 = new Lock;
        specialinvoke $r0.<Lock: void <init>()>();
        <Friendly: Lock l2> = $r0;
        return;
    }
}

My question is where there is a exception throwing in the synchronizd
methods?

--
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/20060423/ec2fa492/attachment.htm


More information about the Soot-list mailing list