[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