analyzetool/commandlineengine/src/catallocs.cpp
author hgs
Mon, 23 Aug 2010 15:29:36 +0300
changeset 41 838cdffd57ce
parent 20 a71a3e32a2ae
child 49 7fdc9a71d314
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include "../inc/ATCommonDefines.h"
hgs
parents:
diff changeset
    18
#include "../inc/catallocs.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
void CATAllocs::Alloc( const string& sAllocString )
hgs
parents:
diff changeset
    21
{
hgs
parents:
diff changeset
    22
	LOG_LOW_FUNC_ENTRY("CATAllocs::Alloc");
hgs
parents:
diff changeset
    23
	string sAlloc( sAllocString );
hgs
parents:
diff changeset
    24
	CATAlloc alloc;
hgs
parents:
diff changeset
    25
	string sAddress = GetStringUntilNextSpace( sAlloc, true );
hgs
parents:
diff changeset
    26
	alloc.m_sTime = GetStringUntilNextSpace( sAlloc, true );
hgs
parents:
diff changeset
    27
	alloc.m_sSize = GetStringUntilNextSpace( sAlloc, true );
hgs
parents:
diff changeset
    28
	alloc.m_vCallStack.insert( pair<unsigned long,string>(1, sAlloc) );
hgs
parents:
diff changeset
    29
	// Add allocation
hgs
parents:
diff changeset
    30
	pair< map<string,CATAlloc>::iterator, bool> ret;
hgs
parents:
diff changeset
    31
	ret = m_vAllocs.insert( pair<string, CATAlloc>( sAddress, alloc ) );
hgs
parents:
diff changeset
    32
	if( ret.second == false )
hgs
parents:
diff changeset
    33
	{
hgs
parents:
diff changeset
    34
		// Allocation to this memory address was already added.
hgs
parents:
diff changeset
    35
		LOG_STRING( "CATAllocs: Allocating same address again, address: " << sAddress );
hgs
parents:
diff changeset
    36
	}
hgs
parents:
diff changeset
    37
}
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
void CATAllocs::AllocH( const string& sAllocHString )
hgs
parents:
diff changeset
    40
{
hgs
parents:
diff changeset
    41
	LOG_LOW_FUNC_ENTRY("CATAllocs::AllocH");
hgs
parents:
diff changeset
    42
	string sAllocH( sAllocHString );
hgs
parents:
diff changeset
    43
	// Parse alloc & create new allocation.
hgs
parents:
diff changeset
    44
	CATAlloc alloc;
hgs
parents:
diff changeset
    45
	string sAddress = GetStringUntilNextSpace( sAllocH, true );
hgs
parents:
diff changeset
    46
	alloc.m_sTime = GetStringUntilNextSpace( sAllocH, true );
hgs
parents:
diff changeset
    47
	alloc.m_sSize = GetStringUntilNextSpace( sAllocH, true );
hgs
parents:
diff changeset
    48
	alloc.m_iCSCount = _httoi( string( GetStringUntilNextSpace( sAllocH, true ) ).c_str() );
hgs
parents:
diff changeset
    49
	// Insert call stack fragment as "first" 1 because we are header.
hgs
parents:
diff changeset
    50
	if ( alloc.m_iCSCount > 0 )
hgs
parents:
diff changeset
    51
		alloc.m_vCallStack.insert( pair<unsigned long,string>( 0, sAllocH ) );
hgs
parents:
diff changeset
    52
	// Add allocation
hgs
parents:
diff changeset
    53
	pair< map<string,CATAlloc>::iterator, bool> ret;
hgs
parents:
diff changeset
    54
	ret = m_vAllocs.insert( pair<string, CATAlloc>( sAddress, alloc ) );
hgs
parents:
diff changeset
    55
	if( ret.second == false )
hgs
parents:
diff changeset
    56
	{
hgs
parents:
diff changeset
    57
		// Allocation to this memory address was already added.
hgs
parents:
diff changeset
    58
		LOG_STRING( "CATAllocs: Allocating same address again, address: " << sAddress );
hgs
parents:
diff changeset
    59
	}
hgs
parents:
diff changeset
    60
}
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
void CATAllocs::AllocF( const string& sAllocFString )
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
	LOG_LOW_FUNC_ENTRY("CATAllocs::AllocF");
hgs
parents:
diff changeset
    65
	string sAllocF( sAllocFString );
hgs
parents:
diff changeset
    66
	string sAddress = GetStringUntilNextSpace( sAllocF, true );
hgs
parents:
diff changeset
    67
	string sTime = GetStringUntilNextSpace( sAllocF, true );
hgs
parents:
diff changeset
    68
	unsigned long iNumber = _httoi( string( GetStringUntilNextSpace( sAllocF, true ) ).c_str() );
hgs
parents:
diff changeset
    69
	string sCallSstack = sAllocF;
hgs
parents:
diff changeset
    70
	// Find correct allocation into which add call stack fragment.
hgs
parents:
diff changeset
    71
	map<string, CATAlloc>::iterator it;
hgs
parents:
diff changeset
    72
	it = m_vAllocs.find( sAddress );
hgs
parents:
diff changeset
    73
	// TODO: If cannot find, create new in cache.
hgs
parents:
diff changeset
    74
	if ( it == m_vAllocs.end() )
hgs
parents:
diff changeset
    75
	{
hgs
parents:
diff changeset
    76
		LOG_STRING( "CATAllocs: Allocate fragment without header: " << sAddress );
hgs
parents:
diff changeset
    77
		return;
hgs
parents:
diff changeset
    78
	}
hgs
parents:
diff changeset
    79
	pair< map<unsigned long,string>::iterator, bool> ret;
hgs
parents:
diff changeset
    80
	// Add call stack to it.
hgs
parents:
diff changeset
    81
	ret = it->second.m_vCallStack.insert( pair<unsigned long,string>( iNumber, sCallSstack ) );
hgs
parents:
diff changeset
    82
	if( ret.second == false )
hgs
parents:
diff changeset
    83
	{
hgs
parents:
diff changeset
    84
		LOG_STRING( "CATAllocs: Same allocation fragment again: " << sAddress );
hgs
parents:
diff changeset
    85
	}
hgs
parents:
diff changeset
    86
}
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
// Free message.
hgs
parents:
diff changeset
    89
void CATAllocs::Free( const string& sFreeString )
hgs
parents:
diff changeset
    90
{
hgs
parents:
diff changeset
    91
	LOG_LOW_FUNC_ENTRY("CATAllocs::Free");
hgs
parents:
diff changeset
    92
	string sFree( sFreeString );
hgs
parents:
diff changeset
    93
	string sKey = GetStringUntilNextSpace( sFree );
hgs
parents:
diff changeset
    94
	// Find related allocation.
hgs
parents:
diff changeset
    95
	map<string, CATAlloc>::iterator it;
hgs
parents:
diff changeset
    96
	it = m_vAllocs.find( sKey );
hgs
parents:
diff changeset
    97
	if ( it == m_vAllocs.end() )
hgs
parents:
diff changeset
    98
	{
hgs
parents:
diff changeset
    99
		LOG_STRING( "CATAllocs: Free message which has no alloc pair: " << sKey );
hgs
parents:
diff changeset
   100
		return;
hgs
parents:
diff changeset
   101
	}
hgs
parents:
diff changeset
   102
	// Delete it.
hgs
parents:
diff changeset
   103
	m_vAllocs.erase( it );
hgs
parents:
diff changeset
   104
}
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// FreeH.
hgs
parents:
diff changeset
   107
void CATAllocs::FreeH( const string& sFreeH )
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
	LOG_LOW_FUNC_ENTRY("CATAllocs::FreeH");
hgs
parents:
diff changeset
   110
	// Current implementation does not use call stack of
hgs
parents:
diff changeset
   111
	// free message to anything.
hgs
parents:
diff changeset
   112
	string sFree( sFreeH );
hgs
parents:
diff changeset
   113
	string sKey = GetStringUntilNextSpace( sFree );
hgs
parents:
diff changeset
   114
	// Time stamp. (not used currently)
hgs
parents:
diff changeset
   115
	// Call stack count. (not used currently)
hgs
parents:
diff changeset
   116
	// Call stack data. (not used currently)
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
	// Find related allocation.
hgs
parents:
diff changeset
   119
	map<string, CATAlloc>::iterator it;
hgs
parents:
diff changeset
   120
	it = m_vAllocs.find( sKey );
hgs
parents:
diff changeset
   121
	if ( it == m_vAllocs.end() )
hgs
parents:
diff changeset
   122
	{
hgs
parents:
diff changeset
   123
		LOG_STRING( "CATAllocs: FreeH message which has no alloc pair: " << sKey );
hgs
parents:
diff changeset
   124
		return;
hgs
parents:
diff changeset
   125
	}
hgs
parents:
diff changeset
   126
	// Delete it.
hgs
parents:
diff changeset
   127
	m_vAllocs.erase( it );
hgs
parents:
diff changeset
   128
}
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
// FreeF.
hgs
parents:
diff changeset
   131
void CATAllocs::FreeF( const string& /* sFreeF */ )
hgs
parents:
diff changeset
   132
{
hgs
parents:
diff changeset
   133
	LOG_LOW_FUNC_ENTRY("CATAllocs::FreeF");
hgs
parents:
diff changeset
   134
	// Fragments are currently ignored.
hgs
parents:
diff changeset
   135
	// Memory address. (not used currently)
hgs
parents:
diff changeset
   136
	// Time stamp. (not used currently)
hgs
parents:
diff changeset
   137
	// Packet number. (not used currently)
hgs
parents:
diff changeset
   138
	// Call stack data. (not used currently)
hgs
parents:
diff changeset
   139
}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
// Get "leak" list ordered by allocation time.
hgs
parents:
diff changeset
   142
void CATAllocs::GetLeakList( vector<string>& vLeakList )
hgs
parents:
diff changeset
   143
{
hgs
parents:
diff changeset
   144
	LOG_LOW_FUNC_ENTRY("CATAllocs::GetLeakList");
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
	// Create multimap where key is timestamp.
hgs
parents:
diff changeset
   147
	// Add allocations there so they will go ascending order.
hgs
parents:
diff changeset
   148
	multimap<string,string> mmap;
hgs
parents:
diff changeset
   149
	multimap<string,string>::iterator itMmap;
hgs
parents:
diff changeset
   150
	
hgs
parents:
diff changeset
   151
	map<string, CATAlloc>::iterator it;
hgs
parents:
diff changeset
   152
	for( it = m_vAllocs.begin(); it != m_vAllocs.end() ; it++ )
hgs
parents:
diff changeset
   153
	{
hgs
parents:
diff changeset
   154
		string sTime = it->second.m_sTime;
hgs
parents:
diff changeset
   155
		
hgs
parents:
diff changeset
   156
		string sLine = it->first;
hgs
parents:
diff changeset
   157
		sLine.append(" ");
hgs
parents:
diff changeset
   158
		sLine.append( it->second.GetAllocString() );
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
		mmap.insert( pair<string,string>( sTime, sLine ) );
hgs
parents:
diff changeset
   161
	}
hgs
parents:
diff changeset
   162
	
hgs
parents:
diff changeset
   163
	// Iterate list to parameter vector.
hgs
parents:
diff changeset
   164
	vLeakList.clear();
hgs
parents:
diff changeset
   165
	for ( itMmap = mmap.begin(); itMmap != mmap.end(); itMmap++ )
hgs
parents:
diff changeset
   166
		vLeakList.push_back( itMmap->second );
hgs
parents:
diff changeset
   167
}
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
// Clear alloc data.
hgs
parents:
diff changeset
   170
void CATAllocs::ClearAllocs( void )
hgs
parents:
diff changeset
   171
{
hgs
parents:
diff changeset
   172
	LOG_LOW_FUNC_ENTRY("CATAllocs::ClearAllocs");
hgs
parents:
diff changeset
   173
	m_vAllocs.clear();
hgs
parents:
diff changeset
   174
}
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
//EOF