Slides, powerpoint
Download
Report
Transcript Slides, powerpoint
How to Compile Aspects
with Real-Time Java
Pengcheng Wu
Northeastern University
Mar. 14, 2005
FOAL Workshop with AOSD’05
Motivations
Real-time systems tend to have a lot of cross-cutting
concerns, e.g., thread scheduling, memory
management
AOP is expected to be helpful to modularize those
concerns
Real-Time Java Specification (RTSJ) -- an emerging
technology to enhance Java with real time features
Current AspectJ compilation approaches do not
work well with Real-Time Java Specification’s
special memory model.
Background – Real-Time Java
Specification (RTSJ)
Java is unsuitable to implement real-time systems
unpredictable garbage collection
unpredictable thread scheduling
RTSJ has been proposed to minimize those
unpredictability
Official reference implementation by TimeSys Corp.
http://www.timesys.com
Open source implementations also available
We are particularly interested in RTSJ’s special
memory management model
Background – RTSJ (cont.)
RTSJ’s Scoped-memory based memory
model
Scoped memory areas provide guarantee on
object allocation time
Background – RTSJ (cont.)
Objects never
reclaimed
Threads can enter
scopes; objects in a
scope are freed
altogether when all
threads left scope
Objects are just like
regular Java heap
objects
Background – RTSJ (cont.)
T1
×
×
×
A
×
×
B
C
×
Background – RTSJ (cont.)
To avoid dangling pointers, an object reference rule is checked by
RTSJ-compliant JVMs. Programmers are responsible for following the
rule.
ILLEGAL!
A
OK
B
×
C
Question: How about using AspectJ with
RTSJ?
How about aspect instantiation? It is implicit and
beyond control of programmers.
Instance-based aspect instantiation (perthis,
pertarget) ×
CFLOW-based aspect instantiation (percflow) ×
CFLOW pointcuts with variable bindings ×
Singleton aspect and reflective access to
thisJoinPoint
√
Problems of compiling Aspects with RTSJ
Program – An Example
class App extends RealtimeThread {
public static void main(String[] args) {
MemoryArea mem = ImmortalMemory.instance();
App app = (App) mem.newInstance(App.class);
app.start();
}
public void run() {
ScopedMemory m1 = new LTMemory( ... );
m1.enter(new Runner());
}
}
class Runner implements Runnable {
public void run() {
Detector cd = new Detector( ... );
LTMemory m2 = new LTMemory( ... );
while(true)
m2.enter(cd);
}
}
class Detector implements Runnable
{
public void run() {
Frame frame = receiveFrame();
//gets a frame and stores it
// into a table
//check if any two planes are
//going to collide
}
}
cd
cd.run()
m2
m1
Problems of compiling Aspects with RTSJ
Program – An Example(cont.)
Now we want to aspectize it so that it only
does periodical polling.
ILLEGAL!
aspect PeriodicPoll perthis(p()) {
Time lastTimePolled;
pointcut p(): execution(* Detector.run(..));
around(): p() {
if(hasn’t yet been 2 seconds)
getCurrentThread().yield();
//don't do polling
else {
//update the time
lastTimePolled = System.getCurrentTime();
proceed(); //do polling
}
}
}
cd
PeriodicPoll
m2
m1
cd.run()
Aspect instantiation
is implicit,
programmers cannot
avoid the problem.
Problems of compiling Aspects with RTSJ
Program – cflow based aspect
instantiation
Similar problems exist for cflow pointcuts
Global
Stack
with variable bindings
Singleton aspect instantiation and reflective
access to thisJoinPoint should be fine.
ILLEGAL!
aspect instance for level 2
aspect instance for level 1
Proposed compilation approaches for
Aspects + RTSJ
Instance-based Aspect Instantiation
Make instantiation explicit?
Allocate aspect instances in ImmortalMemory or
HeapMemory?
Allocate aspect instances in the same scoped
memories as the host objects. √
CFLOW-based aspect instantiation
Make use of the Portal object of a scoped memory
area.
Proposed compilation approaches for
Aspects + RTSJ (cont.)
CFLOW-based aspect instantiation (cont. )
A
portal
portal
B
×
portal
C
CFLOW-based aspect instantiation looking up –
climbing up the memory chain and looking it up
in each of the stacks.
Proposed compilation approaches for
Aspects + RTSJ (cont.)
CFLOW-based Aspect Instantiation (cont.)
Problem: portal object may be used by user
program for threads communication purpose in
RTSJ.
Solution: do automatic adaptation during compile
time. An aspect may do the job!
CFLOW pointcuts with variable bindings
Similar approach as cflow-based aspect
instantiation
Future work
Implementation of an actual compiler
Formal proof that there will be no aspect
introduced object reference violations using
RTSJ semantics and probably enhanced
AspectJ semantics.
Thank you!
Questions and Discussions