All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vmlens.trace.agent.bootstrap.callback.ExecutorCallback Maven / Gradle / Ivy

There is a newer version: 1.1.5
Show newest version
package com.vmlens.trace.agent.bootstrap.callback;




import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

import com.vmlens.trace.agent.bootstrap.parallize.ParallizeFacade;
import com.vmlens.trace.agent.bootstrap.parallize.ParallizeSingelton;
import com.vmlens.trace.agent.bootstrap.interleave.operation.Task;
import com.vmlens.trace.agent.bootstrap.parallize.FutureTask2ThreadId;
import com.vmlens.trace.agent.bootstrap.parallize.ParallizeCallback;
import com.vmlens.trace.agent.bootstrap.parallize.logic.RunnableOrThreadWrapper;


public class ExecutorCallback {


	
	public static void threadStartMethodEnter(Object runnable)
	{
		ParallizeFacade.beforeExecutorStart( CallbackState.callbackStatePerThread.get(),runnable);
		
		CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		 
		callbackStatePerThread.inThreadStart++;
		 
		 callbackStatePerThread.doNotInterleave++;
	}
	

	public static void threadStartMethodExit()
	{
		 CallbackStatePerThread callbackStatePerThread  =
				 CallbackState.callbackStatePerThread.get();
		 
		 callbackStatePerThread.inThreadStart--;
		 callbackStatePerThread.doNotInterleave--;
		 
		 ParallizeCallback.afterThreadStart();
		 
		 
		 
		 
		 
	}
	

	
	public static void forkJoinTaskForkEnter(ForkJoinTask task)
	{
		ParallizeFacade.beforeExecutorStart( CallbackState.callbackStatePerThread.get(),task);
		
		 CallbackState.callbackStatePerThread.get().inThreadStart++;
	}
	
	
	
	public static void forkJoinTaskForkExit()
	{
		 CallbackStatePerThread callbackStatePerThread  =
				 CallbackState.callbackStatePerThread.get();
		 
		 callbackStatePerThread.inThreadStart--;
		 
		 ParallizeCallback.afterThreadStart();
	}
	
	
	
	
	/**
	 * Für ForkJoinPool und Threads, und Threads die runnables aufrufen
	 * 
	 * 
	 * @param task
	 */

	
	
	public static void methodEnterExecTask(Object task)
	{
	
		if( task instanceof Thread)
		{
			CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
			 
			 ParallizeSingelton.beginThreadMethodEnter(callbackStatePerThread,new RunnableOrThreadWrapper(task));
		}
	
	}
	
	
	public static void methodExitExecTask(Object task)
	{
	
		if( task instanceof Thread )
		{
			
			CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
			
			
		ParallizeFacade.beginThreadMethodExit(callbackStatePerThread);
	
		}
	}
	
	
	public static void execAfter()
	{
		// ParallizeCallback.beginTask(  Task.FORK_JOIN_TASK );
	
		
		
		CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		
		
		
		if(callbackStatePerThread.notStartedCount > 0)
		{
			callbackStatePerThread.notStartedCount--;
			callbackStatePerThread.doNotInterleave = callbackStatePerThread.tempDoNotInterleave;
			return;
		}
		
		
		ParallizeFacade.beginThreadMethodExit(callbackStatePerThread);
		
		callbackStatePerThread.doNotInterleave = callbackStatePerThread.tempDoNotInterleave;
	}
	
	
	public static void execBefore(ForkJoinTask task )
	{
		
		
		
		CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		 
		callbackStatePerThread.tempDoNotInterleave = callbackStatePerThread.doNotInterleave;
		 
		 callbackStatePerThread.doNotInterleave = 0;
		 
		if(  ! ParallizeSingelton.beginThreadMethodEnter(callbackStatePerThread,new RunnableOrThreadWrapper(task)) )
		{
			callbackStatePerThread.notStartedCount++;
		}
		 
	//	 ParallizeCallback.beginTask(  Task.FORK_JOIN_TASK );
	
		
	
	}
	
	
//	public static Method findMethod(Object obj)
//	{
//		Class current = obj.getClass();
//		
//		while( current != null )
//		{
//			try {
//				return current.getDeclaredMethod("exec");
//			} catch (NoSuchMethodException e) {
//				current = current.getSuperclass();
//			} catch (SecurityException e) {
//				
//				e.printStackTrace();
//				return null;
//			}
//		}
//		
//		
//		System.err.println( "not found for "  + obj.getClass());
//		
//		throw new RuntimeException();
//	}
	
	
	

	 /**
	  * für ThreadPoolExecutor
	  * 
	  * 
	  * @param runnable
	  * @param methodId
	 * @throws Exception 
	  */
	
	 public static Object call(Callable callable,int methodId) throws Exception
	 {
		 
		 
		 CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		 
		 int temp = callbackStatePerThread.doNotInterleave;
		 callbackStatePerThread.doNotInterleave = 0;
		 
	     ParallizeFacade.callableFromTaskMethodEnter(callbackStatePerThread);
		 try {
			return  callable.call(); 
		 }
		 finally {
				   ParallizeFacade.callableFromTaskMethodExit(callbackStatePerThread);
					callbackStatePerThread.doNotInterleave = temp;
				
		 }
	 }
	
	
	 public static void run(Runnable runnable,int methodId)
	 {
		 
		 
		 CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		 
		 
		 
		 int temp = callbackStatePerThread.doNotInterleave;
		 
		
		 
		 if(runnable instanceof FutureTask)
		 {
			 callbackStatePerThread.doNotInterleave++;
		 }
		 else
		 {
			 callbackStatePerThread.doNotInterleave = 0;
		 }
		 
		
		 
		 ParallizeSingelton.beginThreadMethodEnter(callbackStatePerThread,new RunnableOrThreadWrapper(runnable));
		 try {
			 runnable.run(); 
		 }
		 finally {
				ParallizeFacade.beginThreadMethodExit(callbackStatePerThread);
				
				 if(runnable instanceof FutureTask)
				 {
					 callbackStatePerThread.doNotInterleave--;
				 }
				 else
				 {
					callbackStatePerThread.doNotInterleave = temp;
				 }
				
				
			
				
		 }
	 }
	 
	 
	 
	 public static Object get(Future future, int methodId) throws InterruptedException, ExecutionException
	 {
		 try {
			 return future.get();
		 }
		 finally
		 {
			 if( future instanceof FutureTask )
			 {
				 
				 Long threadId = FutureTask2ThreadId.get(future);
				 
				 if(  threadId != null )
				 {
					 CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
					 ParallizeFacade.afterFutureGet(callbackStatePerThread , threadId);
				 }
				 
			 }
		 }
		
		 
		 
		 
	 }
	 
	 
	 
	 
	 
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy