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

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

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

import com.vmlens.trace.agent.bootstrap.callback.state.MonitorIdAndOrder;

public class VolatileArrayAccessCallback {

	private static final AnarsoftWeakHashMap objectToOrder = new AnarsoftWeakHashMap();
	private static final Object LOCK = new Object();
	
	
	public static void access(long index, Object obj, int methodId , int operation)
	{
		CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		//callbackStatePerThread.monitorCount++;
		int slidingWindowId = CallbackState.traceSyncStatements(callbackStatePerThread);

		if (CallbackState.isSlidingWindowTrace(slidingWindowId)) {

			
			int order = 0;
			long id = -1;
			
			synchronized(LOCK)
			{
				VolatileArrayIdAndOrder monitorIdAndOrder= objectToOrder.get(obj);
				
				if( monitorIdAndOrder == null )
				{
					 monitorIdAndOrder = new VolatileArrayIdAndOrder();
					 objectToOrder.put( obj , monitorIdAndOrder );
				}
				
				order = monitorIdAndOrder.order;
				id = monitorIdAndOrder.id;
				
				
				monitorIdAndOrder.order++;
				
			}
			
			callbackStatePerThread.programCount++;

			
			int currentProgramCounter = callbackStatePerThread.programCount;
			
			callbackStatePerThread.sendEvent.writeVolatileArrayAccessEventGen(slidingWindowId, currentProgramCounter, order, index, callbackStatePerThread.methodCount, methodId, operation, id);
			

			callbackStatePerThread.programCount++;
			

		}
		
		
		
	}
	
	
	public static void before_access(long index, Object obj, int methodId , int operation)
	{
		CallbackStatePerThread callbackStatePerThread = CallbackState.callbackStatePerThread.get();
		//callbackStatePerThread.monitorCount++;
		int slidingWindowId = CallbackState.traceSyncStatements(callbackStatePerThread);

		if (CallbackState.isSlidingWindowTrace(slidingWindowId)) {

			
			int order = 0;
			long id = -1;
			
			synchronized(LOCK)
			{
				VolatileArrayIdAndOrder monitorIdAndOrder= objectToOrder.get(obj);
				
				if( monitorIdAndOrder == null )
				{
					 monitorIdAndOrder = new VolatileArrayIdAndOrder();
					 objectToOrder.put( obj , monitorIdAndOrder );
				}
				
				order = monitorIdAndOrder.order;
				id = monitorIdAndOrder.id;
				
				
				monitorIdAndOrder.order++;
				
			}
			
			callbackStatePerThread.programCount++;

			
			int currentProgramCounter = callbackStatePerThread.programCount;
			
			callbackStatePerThread.sendEvent.writeWithoutInterleaveVolatileArrayAccessEventGen(slidingWindowId, currentProgramCounter, order, index, callbackStatePerThread.methodCount, methodId, operation, id);
			

			callbackStatePerThread.programCount++;
			

		}
		
		
		
	}
	
	
	
	
	
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy