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++)