sysperfana/memspyext/com.nokia.s60tools.swmtanalyser/src/com/nokia/s60tools/swmtanalyser/data/CycleData.java
author Matti Laitinen <matti.t.laitinen@nokia.com>
Wed, 21 Apr 2010 20:01:08 +0300
changeset 7 8e12a575a9b5
permissions -rw-r--r--
MemSpy Carbide Extension 1.6.0

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.s60tools.swmtanalyser.data;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class CycleData implements Comparable<CycleData>{

	private String fileName; 
	private int cycleNumber;
	private String time;
	private String romCheckSum;
	private String romVersion;
	private long changeCount;
	private long freeMemory = -1;
	private long totalMemory = -1;
	private long prevFreeMem;
	private long memspyRam;
	
	public static final int Deleted = 0;
	public static final int New = 1;
	public static final int Alive =2;
	
	private ArrayList<PSHandlesData> psHandlesList;
	private ArrayList<KernelHandles> kernelHandlesList;
	private ArrayList<DiskData> disksList;
	private ArrayList<FilesData> filesList;
	private ArrayList<GlobalDataChunks> globalDataChunksList;
	private ArrayList<StackData> stacksList;
	private ArrayList<ChunksData> nonRHeapList;
	private ArrayList<HeapData> heapsList;
	private ArrayList<ChunksData> chunksList;
	private ArrayList<WindowGroups> wndgList;
	
	private ArrayList<String> newlyCreatedDisks;
	private ArrayList<String> updatedDisks;
	private ArrayList<String> deletedDisks;
	
	private ArrayList<String> newlyCreatedThreads;
	private ArrayList<String> updatedThreads;
	private ArrayList<String> deletedThreads;
	
	private ArrayList<String> newlyCreatedHeaps;
	private ArrayList<String> updatedHeaps;
	private ArrayList<String> deletedHeaps;
	
	
	/**
	 * @param diskData will be added to the list of disks, maintained internally 
	 */
	public void addDiskData(DiskData diskData)
	{
		if(disksList == null)
			disksList = new ArrayList<DiskData>();
		
		disksList.add(diskData);
	}
	
	/**
	 * @param kernelData will be added to the list of kernelhandles, maintained internally 
	 */
	public void addKernelData(KernelHandles kernelData)
	{
		if(kernelHandlesList == null)
			kernelHandlesList = new ArrayList<KernelHandles>();
		
		kernelHandlesList.add(kernelData);
	}

	/**
	 * @param fileData will be added to the list of files, maintained internally 
	 */
	public void addFileData(FilesData fileData)
	{
		if(filesList == null)
			filesList = new ArrayList<FilesData>();
		
		filesList.add(fileData);
	}

	/**
	 * @param HPAS Handles Data will be added to the list of ps handles data, maintained internally 
	 */
	public void addHPASHandlesData(PSHandlesData psHandlesData)
	{
		if(psHandlesList == null)
			psHandlesList = new ArrayList<PSHandlesData>();
		
		psHandlesList.add(psHandlesData);
	}
	
	/**
	 * @param heapData will be added to the list of heaps, maintained internally 
	 */
	public void addHeapData(HeapData heapData)
	{
		if(heapsList == null)
			heapsList = new ArrayList<HeapData>();
		
		heapsList.add(heapData);
	}
	
	/**
	 * @param stackData will be added to the list of stacks, maintained internally 
	 */
	public void addStackData(StackData stackData)
	{
		if(stacksList == null)
			stacksList = new ArrayList<StackData>();
		
		stacksList.add(stackData);
	}
	
	/**
	 * @param Chunks Data will be added to the list of chunks data, maintained internally 
	 */
	public void addChunksData(ChunksData chunksData)
	{
		if( chunksList == null)
			chunksList = new ArrayList<ChunksData>();
		
		chunksList.add(chunksData);
	}
	
	/**
	 * @param Chunks Data will be added to the list of chunks data, maintained internally. 
	 */
	public void addGlobalChunksData(GlobalDataChunks globalChunksData)
	{
		if( globalDataChunksList == null)
			globalDataChunksList = new ArrayList<GlobalDataChunks>();
		
		globalDataChunksList.add(globalChunksData);
	}
	
	/**
	 * 
	 * @param Window Groups Data will be added to the list of window groups, maintained internally.
	 */
	public void addWindowGroupsData(WindowGroups wndgData)
	{
		if(wndgList == null)
			wndgList = new ArrayList<WindowGroups>();
		
		wndgList.add(wndgData);
	}
	
	/**
	 * @returns an arraylist of disknames present in this cycle.
	 */
	public ArrayList<String> getDiskNames()
	{
		ArrayList<String> diskNames = new ArrayList<String>();
		
		if(disksList != null)
			for(DiskData d:disksList)
				diskNames.add(d.getName());
		
		return diskNames;
	}

	/**
	 * This method parses the cycle data and stores the disk names to
	 * corresponding lists based on their status.
	 *
	 */
	public void parseDisksList()
	{
		newlyCreatedDisks = new ArrayList<String>();
		updatedDisks = new ArrayList<String>();
		deletedDisks = new ArrayList<String>();
		
		if(disksList != null){
			for(DiskData d:disksList){
				if(d.getStatus() == CycleData.New)
					newlyCreatedDisks.add(d.getName());
				else if(d.getStatus() == CycleData.Alive)
					updatedDisks.add(d.getName());
				else if(d.getStatus() == CycleData.Deleted)
					deletedDisks.add(d.getName());
			}
		}
		
	}
	
	/**
	 * This method parses the handles list of a cycle data and if the handle type
	 * if thread, it stores thread names of those handles to corresponding lists 
	 * based on their status
	 *
	 */
	public void parseAllThreads()
	{
		newlyCreatedThreads = new ArrayList<String>();
		updatedThreads = new ArrayList<String>();
		deletedThreads = new ArrayList<String>();
		
		if(kernelHandlesList != null){
			for(KernelHandles handle:kernelHandlesList){
				if(handle.getHandleType().equals("Thread"))
				{
					if(handle.getStatus() == CycleData.New)
						newlyCreatedThreads.add(handle.getHandleName());
					else if(handle.getStatus() == CycleData.Alive)
						updatedThreads.add(handle.getHandleName());
					else if(handle.getStatus() == CycleData.Deleted)
						deletedThreads.add(handle.getHandleName());
				}
			}
		}
		
	}
	
	/**
	 * 
	 * @param threadName name of the thread whose stack data is needed
	 * @return class which stores stack information
	 */
	public StackData getStackData(String threadName)
	{
		if(stacksList != null)
		{
			for(StackData st:stacksList)
			{
				if(st.getThreadName().equalsIgnoreCase(threadName))
					return st;
			}
		}
		
		return null;
	}
	
	public int getNewOpenFiles(String threadName)
	{
		int openFilesCnt = 0;
	
		if(filesList != null)
		{
			for(FilesData file:filesList)
			{
				if(file.getThreadName().equalsIgnoreCase(threadName)
						&& file.getStatus() == CycleData.New)
					openFilesCnt++;
			}
			
		}
		
		return openFilesCnt;
	}
	
	public int getDeletedFiles(String threadName)
	{
		int closedFilesCnt = 0;
		
		if(filesList != null)
		{
			for(FilesData file:filesList)
			{
				if(file.getThreadName().equalsIgnoreCase(threadName)
						&& file.getStatus() == CycleData.Deleted)
					closedFilesCnt++;
			}
		}
		
		return closedFilesCnt;
	}
	
	public int getUpdatedFiles(String threadName)
	{
		int openFilesCnt = 0;
		
		if(filesList != null)
		{					
			for(FilesData file:filesList)
			{
				if(file.getThreadName().equalsIgnoreCase(threadName)
						&& file.getStatus() == CycleData.Alive)
					openFilesCnt++;
			}
			//DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Openfiles for " + threadName + " are " + openFilesCnt);  
		}
		
		return openFilesCnt;
	}
	
	public int getNewPSHandles(String threadName)
	{
		int psHandlesCnt = 0;
		
		if(psHandlesList != null)
		{
			for(PSHandlesData psHandle:psHandlesList)
			{
				if(psHandle.getThreadName().equalsIgnoreCase(threadName)
						&& (psHandle.getStatus() == CycleData.New))
					psHandlesCnt++;
			}
		}
	
		return psHandlesCnt;
	}
		
	public int getDeletedPSHandles(String threadName)
	{
		int deletedHandlesCnt = 0;
		
		if(psHandlesList != null)
		{
			for(PSHandlesData psHandle:psHandlesList)
			{
				if(psHandle.getThreadName().equalsIgnoreCase(threadName)
						&& psHandle.getStatus() == CycleData.Deleted)
					deletedHandlesCnt++;
			}
		}
		
		return deletedHandlesCnt;
	}
	
	public int getUpdatedPSHandles(String threadName)
	{
		int alivePSHandles = 0;
		
		if(psHandlesList != null)
		{
			for(PSHandlesData psHandle:psHandlesList)
			{
				if(psHandle.getThreadName().equalsIgnoreCase(threadName)
						&& psHandle.getStatus() == CycleData.Alive)
					alivePSHandles++;
			}
			//DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Openfiles for " + threadName + " are " + openFilesCnt);  
	
		}
		
		return alivePSHandles;
	}
	
	public ArrayList<String> getNewlyCreatedDisks()
	{
		return newlyCreatedDisks;
	}
	
	public ArrayList<String> getUpdatedDisks()
	{
		return updatedDisks;
	}
	
	public ArrayList<String> getDeletedDisks()
	{
		return deletedDisks;
	}
	
	public ArrayList<String> getNewlyCreatedThreads()
	{
		return newlyCreatedThreads;
	}
	
	public ArrayList<String> getUpdatedThreads()
	{
		return updatedThreads;
	}
	
	public ArrayList<String> getDeletedThreads()
	{
		return deletedThreads;
	}
	
	/**
	 * Reads the values for given disk in this cycledata.
	 * @param diskName name of the disk whose info must be fetched.
	 * @return a structure which can store used memory and size values.
	 */
	public DiskOverview getDiskUsedAndFreeSize(String diskName)
	{
		if(disksList != null)
		{
			DiskOverview overview = new DiskOverview();
			
			int index = -1;
			for(DiskData disk:disksList)
			{
				index++;
				if(disk.getName().equalsIgnoreCase(diskName))
				{
					DiskData diskData = disksList.get(index);
					overview.setSize(diskData.getSize());
					overview.setFreeSize(diskData.getFreeSize());
					overview.setStatus(diskData.getStatus());
					
					return overview;
				}
			}
		}
		return null;
	}
	
	/**
	 * 
	 * @param threadName name of the thread whose heap data is needed.
	 * @return class which stores heap information of given thread in this cycle.
	 */
	public ThreadData getHeapData(String threadName)
	{
		
		if(heapsList != null)
		{
			ThreadData data = new ThreadData(threadName);
			for(HeapData heap:heapsList)
			{
				if(heap.getThreadName().equalsIgnoreCase(threadName))
				{
					data.setHeapChunkSize(heap.getSize());
					data.setMaxHeapSize(heap.getMaxSize());
					data.setAllocatedCells(heap.getAllocatedCells());
					data.setFreeCells(heap.getFreeCells());
					data.setHeapAllocatedSpace(heap.getAllocSpace());
					data.setHeapFreeSpace(heap.getFreeSpace());
					data.setLargestAllocCellSize(heap.getLargestAllocCell());
					data.setLargestFreeCellSize(heap.getLargestFreeCell());
					data.setFreeSlackSize(heap.getFreeSlack());
					data.setStatus(heap.getStatus());
				
					return data;
				}
			}
		}
		
		return null;
	}
	
	public int getKernelHandles()
	{
		if(kernelHandlesList != null)
			return kernelHandlesList.size();
		else
			return 0;
	}
	
	/**
	 * This method parses all heap structures for this cycle and 
	 * stores the thread names of those heaps to corresponding lists 
	 * based on their status
	 *
	 */
	public void parseAllHeaps()
	{
		newlyCreatedHeaps = new ArrayList<String>();
		updatedHeaps = new ArrayList<String>();
		deletedHeaps = new ArrayList<String>();
		
		if(heapsList != null){
			for(HeapData heap:heapsList){
				if(heap.getStatus() == CycleData.New)
					newlyCreatedHeaps.add(heap.getThreadName());
				else if(heap.getStatus() == CycleData.Alive)
					updatedHeaps.add(heap.getThreadName());
				else if(heap.getStatus() == CycleData.Deleted)
					deletedHeaps.add(heap.getThreadName());
			}
		}
		
	}
	
	/**
	 * @return list of thread names whose heap is created in this cycle.
	 */
	public ArrayList<String> getNewHeapThreads()
	{
		return newlyCreatedHeaps;
	}
	
	/**
	 * @return list of thread names whose heap information is 
	 * updated in this cycle.
	 */
	public ArrayList<String> getAliveHeapThreads()
	{
		return updatedHeaps;
	}
	
	/**
	 * @return list of thread names whose heap is deleted in this cycle.
	 * 
	 */
	public ArrayList<String> getDeletedHeapThreads()
	{
		return deletedHeaps;
	}
	
	/**
	 * This method parses all stack structures for this cycle and 
	 * returns the list of thread names for all newly created stacks. 
	 *
	 */
	public ArrayList<String> getNewStackThreads()
	{
		ArrayList<String> threadNames = new ArrayList<String>();
		
		if(stacksList != null)
			for(StackData stack:stacksList)
			{
				if(stack.getStatus() == CycleData.New)
					threadNames.add(stack.getThreadName());
			}
		return threadNames;
	}
	
	/**
	 * This method parses all stack structures for this cycle and 
	 * returns the list of thread names for updated stacks. 
	 *
	 */
	public ArrayList<String> getAliveStackThreads()
	{
		ArrayList<String> threadNames = new ArrayList<String>();
		
		if(stacksList != null)
			for(StackData stack:stacksList)
			{
				if(stack.getStatus() == CycleData.Alive)
					threadNames.add(stack.getThreadName());
			}
		return threadNames;
	}
	
	/**
	 * This method parses all stack structures for this cycle and 
	 * returns the list of thread names for all deleted stacks. 
	 *
	 */
	public ArrayList<String> getDeletedStackThreads()
	{
		ArrayList<String> threadNames = new ArrayList<String>();
		
		if(stacksList != null)
			for(StackData stack:stacksList)
			{
				if(stack.getStatus() == CycleData.Deleted){
					threadNames.add(stack.getThreadName());
				}
			}
		return threadNames;
	}
	
	/**
	 * 
	 * @return list of thread names which contain PSHandles
	 */
	public ArrayList<String> getHPASThreads()
	{
		ArrayList<String> threadNames = new ArrayList<String>();
		
		if(psHandlesList != null)
			for(PSHandlesData hpas:psHandlesList)
				threadNames.add(hpas.getThreadName());
		
		return threadNames;
	}
	
	/**
	 * 
	 * @return list of thread names which contain file handles.
	 */
	public ArrayList<String> getFileThreads()
	{
		ArrayList<String> threadNames = new ArrayList<String>();
		
		if(filesList != null)
			for(FilesData file:filesList)
				threadNames.add(file.getThreadName());
		
		return threadNames;
	}
	
	public ArrayList<String> getDeletedChunkNames ()
	{
		ArrayList<String> deletedChunks = new ArrayList<String>();
	
		if(kernelHandlesList != null){
			for(KernelHandles handle:kernelHandlesList){
		
				if(handle.getHandleType().equals("Chunk") &&
						(handle.getStatus() == CycleData.Deleted))
				{
					deletedChunks.add(handle.getHandleName());
				}
			}
		}
		
		return deletedChunks;
	}
	
	
	
	public long getChangeCount() {
		return changeCount;
	}
	public void setChangeCount(long changeCount) {
		this.changeCount = changeCount;
	}
	public int getCycleNumber() {
		return cycleNumber;
	}
	public void setCycleNumber(int cycleNumber) {
		this.cycleNumber = cycleNumber;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
	public long getMemspyRam() {
		return memspyRam;
	}
	public void setMemspyRam(long memspyRam) {
		this.memspyRam = memspyRam;
	}
	public long getPrevFreeMem() {
		return prevFreeMem;
	}
	public void setPrevFreeMem(long prevFreeMem) {
		this.prevFreeMem = prevFreeMem;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}

	/**
	 * Clears all the previous data
	 *
	 */
	public void clear()
	{
		if(disksList != null)
			disksList.clear();
		if(heapsList != null)
			heapsList.clear();
		if(stacksList != null)
			stacksList.clear();
		if(globalDataChunksList != null)
			globalDataChunksList.clear();
		if(nonRHeapList != null)
			nonRHeapList.clear();
		if(chunksList != null)
			chunksList.clear();
		if(kernelHandlesList != null)
			kernelHandlesList.clear();
		if(filesList != null)
			filesList.clear();
		if(psHandlesList != null)
			psHandlesList.clear();
	}

	public ArrayList<GlobalDataChunks> getGlobalDataChunksList() {
		ArrayList<GlobalDataChunks> s = new ArrayList<GlobalDataChunks>();		
		if(globalDataChunksList!=null)
			for (GlobalDataChunks data: globalDataChunksList)
				s.add(data);
		return s;
	}
	
	public GlobalDataChunks getGlobalChunkDataFor(String chunkName)
	{
		if(globalDataChunksList != null)
		{
			for(GlobalDataChunks data : globalDataChunksList)
			{
				if(data.getChunkName().equalsIgnoreCase(chunkName))
				{
					return data;
				}
			}
		}
		return null;
	}

	public ChunksData getChunkDataFor(String chunkName)
	{
		if(chunksList != null)
		{
			for(ChunksData data : chunksList)
			{
				if(data.getChunkName().equalsIgnoreCase(chunkName))
				{
					return data;
				}
			}
		}
		return null;
	}

	public ArrayList<String> getGlobalChunkNames()
	{
		ArrayList<String> chunkNames = new ArrayList<String>();
		
		if(globalDataChunksList != null)
			for(GlobalDataChunks glod:globalDataChunksList)
				chunkNames.add(glod.getChunkName());
		
		return chunkNames;
	}
	
	

	public ArrayList<String> getNonHeapChunkNames()
	{
		ArrayList<String> chunkNames = new ArrayList<String>();
		
		if(chunksList != null)
			for(ChunksData chnk:chunksList)
				chunkNames.add(chnk.getChunkName());
		
		return chunkNames;
	}
	
	public ArrayList<PSHandlesData> getPsHandlesList() {
		ArrayList<PSHandlesData> s = new ArrayList<PSHandlesData>();		
		for (PSHandlesData data: psHandlesList)
			s.add(data);
		
		return s;
	}

	public ArrayList<KernelHandles> getGenHandlesList() {
		ArrayList<KernelHandles> s = new ArrayList<KernelHandles>();		
		for (KernelHandles data: kernelHandlesList)
			s.add(data);

		return s;

	}

	public ArrayList<DiskData> getDisksList() {
		ArrayList<DiskData> s = new ArrayList<DiskData>();		
		for (DiskData data: disksList)
			s.add(data);
		return s;
	}

	public ArrayList<HeapData> getHeapsList() {
		ArrayList<HeapData> s = new ArrayList<HeapData>();		
		for (HeapData data: heapsList)
			s.add(data);
		return s;
	}

	public ArrayList<ChunksData> getChunksList() {
		ArrayList<ChunksData> s = new ArrayList<ChunksData>();		
		if(chunksList!=null)
			for (ChunksData data: chunksList)
				s.add(data);
		return s;
	}
	
	/**
	 * 
	 * @returns list of window groups from this cycle.
	 */
	public ArrayList<WindowGroups> getWindowGroupsData()
	{
		ArrayList<WindowGroups> list = new ArrayList<WindowGroups>();
		
		if(wndgList != null)
		{
			for(WindowGroups wndg:wndgList)
			{
				list.add(wndg);
			}
		}
		
		return list;
	}
	public long getFreeMemory() {
		return freeMemory;
	}

	public void setFreeMemory(long freeMemory) {
		this.freeMemory = freeMemory;
	}

	public long getTotalMemory() {
		return totalMemory;
	}

	public void setTotalMemory(long totalMemory) {
		this.totalMemory = totalMemory;
	}

	public String getRomCheckSum() {
		return romCheckSum;
	}

	public void setRomCheckSum(String romCheckSum) {
		this.romCheckSum = romCheckSum;
	}

	public String getRomVersion() {
		return romVersion;
	}

	public void setRomVersion(String romVersion) {
		this.romVersion = romVersion;
	}
	
	/**
	 * 
	 * This method returns the data related to various kernel elements.
	 */
	public KernelElements getAllOpenKernelElements()
	{
		KernelElements elements = new KernelElements();
		
		if(kernelHandlesList != null){
			for(KernelHandles handle:kernelHandlesList)
			{
				if(handle.getHandleType().equals("Timer"))
				{
					int count = elements.getNumberOfTimers();
					
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfTimers(count);
				}
				else if(handle.getHandleType().equals("Semaphore"))
				{
					int count = elements.getNumberOfSemaphores();
					
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfSemaphores(count);
				}
				else if(handle.getHandleType().equals("Process"))
				{
					int count = elements.getNumberOfProcesses();
					
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfProcesses(count);
				}
				else if(handle.getHandleType().equals("Thread"))
				{
					int count = elements.getNumberOfThreads();
					
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfThreads(count);
				}
				else if(handle.getHandleType().equals("Chunk"))
				{
					int count = elements.getNumberOfChunks();
					
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfChunks(count);
				}
				else if(handle.getHandleType().equals("Session"))
				{
					int count = elements.getNumberOfSessions();
					
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfSessions(count);
				}
				else if(handle.getHandleType().equals("Server"))
				{
					int count = elements.getNumberOfServers();
				
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfServers(count);
				}
				else if(handle.getHandleType().equals("Msg. Queue"))
				{
					int count = elements.getNumberOfMsgQueues();
				
					if(handle.getStatus() == CycleData.New)
						count++;
					else if(handle.getStatus() == CycleData.Deleted)
						count--;
					
					elements.setNumberOfMsgQueues(count);
				}
			}
		}
		return elements;	
	}

	public int compareTo(CycleData tmp) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		Date aDate=null;
		Date bDate=null;
		try {
			aDate = sdf.parse(this.getTime());
			bDate = sdf.parse(tmp.getTime());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		if(aDate.before(bDate))
		{
			return -1;
		} 
		else if(aDate.after(bDate))
		{
			return 1;
		}
		return 0;
	}
}