Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Are aspects examining the running of Threads "special" in some way for AspectJ?

Hi all,

I am just trying to use AspectJ to get a handle on all the threads that an application runs. To start with, I just want to know how many there in how many ThreadGroups.

I am using Loadtime Weaving to advise an admittedly large code base- a popular open source IDE. Yes, it's huge.

What I am experiencing is the application "hangs" on start up without terminating and without seeming to progress or so it seems. By "hangs" all I mean is the application's splashscreen appears but the progress bar gets stuck after a while and doesn't move. For half an hour, at which time I quit the program.

It DOES work as intended - it does give me the information I am seeking, but there just comes a point when the output from this aspect is intermittent and the progress bar is not moving and I can't prove it's not in long many statement infinite loop.


So my question is, is there something special about advising Runnable.run() that is doomed to slow everything to a crawl or get caught in an infinite loop for some reason?

The problem may be just the sheer number of things I am trying to advise, because the code base is so large. The only reason I don't think that is using another aspect, I can advise all methods and the application successfully loads (then tells me I am out of memory and becomes uselessly slow). The "everything" aspect is just

       pointcut captureAllMethods() : execution( * *(..));


and then I print out the signature and source location in the before() statement of the aspect.

I am sure you've all seen 1000 times before, but I included this aspect along with the thread aspect at the bottom of this question.

Using this "everything" aspect also takes a long time but it does result , after many minutes, in the application being launched.

Oddly, when I apply BOTH aspects, the application I do get continuous output from the "everything" aspect. which means it's still running.

In a slightly different version of the thread aspect, I make sure to !within the aspect itself, just in case I was entering an infinite loop with the aspect advising itself - something I don't see as even being possible given the particular aspect.

I also do some System.out. printlns just to be sure that the thing is still alive, which it is.

So I guess my other question is- have you been here before with really big code bases? Is this just something that's bound to be unusable and the fact that my ( 64 bit AMD quadcore 8 gig RAM) computer runs for 45 minutes with no sign of further progress is not a surprise to anyone?

Or is something else at work here?

Any advise is appreciated.





---------------------------------------------------------------------------------------------------
"Everything " aspect:
----------------------------------------------------------------------------------------------------
package recipePackage;

public aspect CaptureCallTargetRecipe
{

pointcut captureAllMethods() : execution( * *(..)) && !within(CaptureCallTargetRecipe);


       // Advice declaration
       before() : captureAllMethods()
       {

          System.out.println(
             "Signature: "
                + thisJoinPoint.getStaticPart( ).getSignature( ));
          System.out.println(
             "Source Line: "
                + thisJoinPoint.getStaticPart( ).getSourceLocation( ));
          System.out.println();

       }
}




 ---------------------------------------------------------------------------------------------------
"Thread" aspect:
---------------------------------------------------------------------------------------------------
package recipePackage;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public aspect CaptureAllUniqueThreadsStartingRecipe
{
    static List<Thread> threads = new ArrayList<Thread>(20);
    static List<ThreadGroup> threadGroups = new ArrayList<ThreadGroup>(20);
    pointcut captureAllThreads(): execution(public void Runnable.run() ) ;


    // Advice declaration
    before(): captureAllThreads()
            {
                Thread thisThread = Thread.currentThread();
                if (thisThread == lastThread)
                {
                    return;
                }


                lastThread = thisThread;

for (Iterator<Thread> threadIterator = threads.iterator(); threadIterator.hasNext(); )
                {
                    Thread nextThread = threadIterator.next();
                    if (thisThread == nextThread)
                    {
                        threadFound = true;
                        return;
                    }
                }

                threads.add(thisThread);

for (Iterator<ThreadGroup> threadGroupIterator = threadGroups.iterator(); threadGroupIterator.hasNext(); )
                {
                    ThreadGroup threadGroup = threadGroupIterator.next();
if (Thread.currentThread().getThreadGroup() == threadGroup)
                    {
                        threadGroupFound = true;
                        break;
                    }
                }
                {
                    threadGroups.add(thisThread.getThreadGroup());
                }


System.out.println("------------------- THREAD DISCOVERED--------------------");
                System.out.println("New thread discovered: " + thisThread);
                System.out.println("Thread List");
System.out.println("number Of Threads Created so far= " + threads.size()); System.out.println("number Of ThreadGroups Created far+ " + threadGroups.size());
                System.out.println("Threads so far: ");

                int i=0;
for (Iterator<Thread> iterator = threads.iterator(); iterator.hasNext(); )
                {
                    Thread nextThread = iterator.next();

                    System.out.println();
System.out.println("Thread Name : " + nextThread.getName());
                    System.out.println("Alive? " + nextThread.isAlive());
                    System.out.println("Daemon? " + nextThread.isDaemon());
System.out.println("Thread Group? " + nextThread.getThreadGroup().getName());

System.out.println("------------------------------------------------------------");
                }

            }
    public volatile boolean threadFound;
    public volatile boolean threadGroupFound;
    public Thread lastThread;
    public Thread newThread;
}



Back to the top