core/systems/PluginSys.cpp
changeset 1766 d30c252089be
parent 1689 451c11ef473a
child 1784 72b2eec6b55f
     1.1 --- a/core/systems/PluginSys.cpp	Wed Dec 05 15:38:45 2007 +0000
     1.2 +++ b/core/systems/PluginSys.cpp	Wed Dec 05 18:07:18 2007 +0000
     1.3 @@ -123,6 +123,80 @@
     1.4  	}
     1.5  }
     1.6  
     1.7 +unsigned int CPlugin::CalcMemUsage()
     1.8 +{
     1.9 +	unsigned int base_size = 
    1.10 +		sizeof(CPlugin) 
    1.11 +		+ sizeof(IdentityToken_t)
    1.12 +		+ (m_PhraseFiles.size() * sizeof(unsigned int))
    1.13 +		+ (m_dependents.size() * sizeof(CPlugin *))
    1.14 +		+ (m_dependsOn.size() * sizeof(CPlugin *))
    1.15 +		+ (m_fakeNatives.size() * (sizeof(FakeNative *) + sizeof(FakeNative)))
    1.16 +		+ (m_WeakNatives.size() * sizeof(WeakNative))
    1.17 +		+ (m_configs.size() * (sizeof(AutoConfig *) + sizeof(AutoConfig)))
    1.18 +		+ sm_trie_mem_usage(m_pProps);
    1.19 +
    1.20 +	for (unsigned int i = 0; i < m_configs.size(); i++)
    1.21 +	{
    1.22 +		base_size += m_configs[i]->autocfg.size();
    1.23 +		base_size += m_configs[i]->folder.size();
    1.24 +	}
    1.25 +
    1.26 +	for (List<String>::iterator i = m_Libraries.begin();
    1.27 +		 i != m_Libraries.end();
    1.28 +		 i++)
    1.29 +	{
    1.30 +		base_size += (*i).size();
    1.31 +	}
    1.32 +
    1.33 +	for (List<String>::iterator i = m_RequiredLibs.begin();
    1.34 +		 i != m_RequiredLibs.end();
    1.35 +		 i++)
    1.36 +	{
    1.37 +		base_size += (*i).size();
    1.38 +	}
    1.39 +
    1.40 +	for (List<FakeNative *>::iterator i = m_fakeNatives.begin();
    1.41 +		 i != m_fakeNatives.end();
    1.42 +		 i++)
    1.43 +	{
    1.44 +		base_size += (*i)->name.size();
    1.45 +	}
    1.46 +
    1.47 +	if (m_plugin != NULL)
    1.48 +	{
    1.49 +		base_size += sizeof(sp_plugin_t);
    1.50 +		base_size += m_plugin->data_size;
    1.51 +		base_size += m_plugin->pcode_size;
    1.52 +		base_size += (m_plugin->info.natives_num * sizeof(sp_file_natives_t));
    1.53 +		base_size += (m_plugin->info.publics_num * sizeof(sp_file_publics_t));
    1.54 +		base_size += (m_plugin->info.pubvars_num * sizeof(sp_file_pubvars_t));
    1.55 +		base_size += (m_plugin->debug.files_num * sizeof(sp_fdbg_file_t));
    1.56 +		base_size += (m_plugin->debug.lines_num * sizeof(sp_fdbg_line_t));
    1.57 +		base_size += (m_plugin->debug.syms_num * sizeof(sp_fdbg_symbol_t));
    1.58 +		/* We can't get strtab size, oh well. */
    1.59 +	}
    1.60 +
    1.61 +	if (m_ctx.base != NULL)
    1.62 +	{
    1.63 +		base_size += sizeof(BaseContext);
    1.64 +		base_size += m_ctx.base->GetPublicsNum() * sizeof(CFunction);
    1.65 +	}
    1.66 +	if (m_ctx.ctx != NULL)
    1.67 +	{
    1.68 +		base_size += m_ctx.ctx->mem_size;
    1.69 +		base_size += (m_plugin->debug.files_num * sizeof(sp_debug_file_t));
    1.70 +		base_size += (m_plugin->debug.lines_num * sizeof(sp_debug_line_t));
    1.71 +		base_size += (m_plugin->debug.syms_num * sizeof(sp_debug_symbol_t));
    1.72 +		base_size += (m_plugin->info.pubvars_num * sizeof(sp_pubvar_t));
    1.73 +		base_size += (m_plugin->info.publics_num * sizeof(sp_public_t));
    1.74 +		base_size += (m_plugin->info.natives_num * sizeof(sp_native_t));
    1.75 +		/* We also don't know the JIT code size, oh well. */
    1.76 +	}
    1.77 +
    1.78 +	return base_size;
    1.79 +}
    1.80 +
    1.81  Handle_t CPlugin::GetMyHandle()
    1.82  {
    1.83  	return m_handle;
    1.84 @@ -1969,6 +2043,12 @@
    1.85  	/* We don't care about the internal object, actually */
    1.86  }
    1.87  
    1.88 +bool CPluginManager::GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
    1.89 +{
    1.90 +	*pSize = ((CPlugin *)object)->CalcMemUsage();
    1.91 +	return true;
    1.92 +}
    1.93 +
    1.94  void CPluginManager::RegisterNativesFromCore(sp_nativeinfo_t *natives)
    1.95  {
    1.96  	for (unsigned int i = 0; natives[i].func != NULL; i++)