Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Previous inter-Thread tracing approaches

 

  • To build up an invocation sequence, each invoked method must know the method that was invoked before it
    • Innerthread communication can simply make use of the ThreadLocal pattern and build a stack of the concrete methods being called
    • Interthread and inter JVM communication has to connect the stacks of the involved threads. This can be done by an invocation identifier that is passed from the caller to the callee.
      • Invocation identifier must also include the method identification that invoked this call

Thread Variables

In Java its possible to store thread specific variables. The class ThreadLocal provides this functionality. This class is internally implemented with a map. The keys for this map are generated by an AtomicInteger starting on 0.

...

Runnable Variables approach

First see Inter-Thread in IS advanced.

To represent the behavior of the application an tree structure of Runnables and their method invocations can be build.
In this tree structure, all trace and context information would be stored.

...

RunnableLocal

Parent access- and invocation information can be stored in the Runnable specific variable RunnableLocal. It can be inherit, and replaces the InheritableThreadLocal.

...

  • Invocation ID (Created with Singleton)
  • JVM ID (For the assignment)
  • Runnable ID
  • Node ID
  • CreationTimeStamp
  • Parent Invocation Identifier

Implementation of RunnableStack for the Runnable

...

tracing

  • The constructors of Runnable are instrumented so that each Runnable gets an ID.
  • The RunnableMap, generates the ID and provides the mapping to its Runnable (registerRunnable()).
  • The RunnableLocal uses the ID as key and stores the RunnableReflection..
  • The RunnableReflection uses a ThreadLocal to identify the currently run Runnable. This happens in the run() method.
  • (note)
  • R1 R2 R3- Whrn When R3 is created in constructor of R2. And R1 calls R2. Then is R1 the parent of R3 not R2.
  • All with an currentRunnable variable that is handled properly.
  • In the same way are the current InvocationIdentifier inherited. (This reduces overhead)
  • Boolean indicating if it is the root node.