Factor out StringsStorage from CpuProfilesCollection.
Review URL: http://codereview.chromium.org/2769001 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4826 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
8227208d34
commit
e5bdf01d1e
@ -86,6 +86,37 @@ void TokenEnumerator::TokenRemoved(Object** token_location) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StringsStorage::StringsStorage()
|
||||||
|
: names_(StringsMatch) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StringsStorage::~StringsStorage() {
|
||||||
|
for (HashMap::Entry* p = names_.Start();
|
||||||
|
p != NULL;
|
||||||
|
p = names_.Next(p)) {
|
||||||
|
DeleteArray(reinterpret_cast<const char*>(p->value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char* StringsStorage::GetName(String* name) {
|
||||||
|
if (name->IsString()) {
|
||||||
|
char* c_name =
|
||||||
|
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).Detach();
|
||||||
|
HashMap::Entry* cache_entry = names_.Lookup(c_name, name->Hash(), true);
|
||||||
|
if (cache_entry->value == NULL) {
|
||||||
|
// New entry added.
|
||||||
|
cache_entry->value = c_name;
|
||||||
|
} else {
|
||||||
|
DeleteArray(c_name);
|
||||||
|
}
|
||||||
|
return reinterpret_cast<const char*>(cache_entry->value);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const char* CodeEntry::kEmptyNamePrefix = "";
|
const char* CodeEntry::kEmptyNamePrefix = "";
|
||||||
unsigned CodeEntry::next_call_uid_ = 1;
|
unsigned CodeEntry::next_call_uid_ = 1;
|
||||||
|
|
||||||
@ -438,8 +469,7 @@ void CodeMap::Print() {
|
|||||||
|
|
||||||
|
|
||||||
CpuProfilesCollection::CpuProfilesCollection()
|
CpuProfilesCollection::CpuProfilesCollection()
|
||||||
: function_and_resource_names_(StringsMatch),
|
: profiles_uids_(UidsMatch),
|
||||||
profiles_uids_(UidsMatch),
|
|
||||||
current_profiles_semaphore_(OS::CreateSemaphore(1)) {
|
current_profiles_semaphore_(OS::CreateSemaphore(1)) {
|
||||||
// Create list of unabridged profiles.
|
// Create list of unabridged profiles.
|
||||||
profiles_by_token_.Add(new List<CpuProfile*>());
|
profiles_by_token_.Add(new List<CpuProfile*>());
|
||||||
@ -470,11 +500,6 @@ CpuProfilesCollection::~CpuProfilesCollection() {
|
|||||||
profiles_by_token_.Iterate(DeleteProfilesList);
|
profiles_by_token_.Iterate(DeleteProfilesList);
|
||||||
code_entries_.Iterate(DeleteCodeEntry);
|
code_entries_.Iterate(DeleteCodeEntry);
|
||||||
args_count_names_.Iterate(DeleteArgsCountName);
|
args_count_names_.Iterate(DeleteArgsCountName);
|
||||||
for (HashMap::Entry* p = function_and_resource_names_.Start();
|
|
||||||
p != NULL;
|
|
||||||
p = function_and_resource_names_.Next(p)) {
|
|
||||||
DeleteArray(reinterpret_cast<const char*>(p->value));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -666,27 +691,6 @@ CodeEntry* CpuProfilesCollection::NewCodeEntry(int security_token_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char* CpuProfilesCollection::GetName(String* name) {
|
|
||||||
if (name->IsString()) {
|
|
||||||
char* c_name =
|
|
||||||
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).Detach();
|
|
||||||
HashMap::Entry* cache_entry =
|
|
||||||
function_and_resource_names_.Lookup(c_name,
|
|
||||||
name->Hash(),
|
|
||||||
true);
|
|
||||||
if (cache_entry->value == NULL) {
|
|
||||||
// New entry added.
|
|
||||||
cache_entry->value = c_name;
|
|
||||||
} else {
|
|
||||||
DeleteArray(c_name);
|
|
||||||
}
|
|
||||||
return reinterpret_cast<const char*>(cache_entry->value);
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const char* CpuProfilesCollection::GetName(int args_count) {
|
const char* CpuProfilesCollection::GetName(int args_count) {
|
||||||
ASSERT(args_count >= 0);
|
ASSERT(args_count >= 0);
|
||||||
if (args_count_names_.length() <= args_count) {
|
if (args_count_names_.length() <= args_count) {
|
||||||
|
@ -56,6 +56,28 @@ class TokenEnumerator {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Provides a storage of strings allocated in C++ heap, to hold them
|
||||||
|
// forever, even if they disappear from JS heap or external storage.
|
||||||
|
class StringsStorage {
|
||||||
|
public:
|
||||||
|
StringsStorage();
|
||||||
|
~StringsStorage();
|
||||||
|
|
||||||
|
const char* GetName(String* name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
INLINE(static bool StringsMatch(void* key1, void* key2)) {
|
||||||
|
return strcmp(reinterpret_cast<char*>(key1),
|
||||||
|
reinterpret_cast<char*>(key2)) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// String::Hash -> const char*
|
||||||
|
HashMap names_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(StringsStorage);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class CodeEntry {
|
class CodeEntry {
|
||||||
public:
|
public:
|
||||||
explicit INLINE(CodeEntry(int security_token_id));
|
explicit INLINE(CodeEntry(int security_token_id));
|
||||||
@ -258,10 +280,12 @@ class CpuProfilesCollection {
|
|||||||
String* title,
|
String* title,
|
||||||
double actual_sampling_rate);
|
double actual_sampling_rate);
|
||||||
List<CpuProfile*>* Profiles(int security_token_id);
|
List<CpuProfile*>* Profiles(int security_token_id);
|
||||||
|
const char* GetName(String* name) {
|
||||||
|
return function_and_resource_names_.GetName(name);
|
||||||
|
}
|
||||||
CpuProfile* GetProfile(int security_token_id, unsigned uid);
|
CpuProfile* GetProfile(int security_token_id, unsigned uid);
|
||||||
inline bool is_last_profile();
|
inline bool is_last_profile();
|
||||||
|
|
||||||
const char* GetName(String* name);
|
|
||||||
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag,
|
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
String* name, String* resource_name, int line_number);
|
String* name, String* resource_name, int line_number);
|
||||||
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name);
|
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name);
|
||||||
@ -280,17 +304,11 @@ class CpuProfilesCollection {
|
|||||||
List<CpuProfile*>* GetProfilesList(int security_token_id);
|
List<CpuProfile*>* GetProfilesList(int security_token_id);
|
||||||
int TokenToIndex(int security_token_id);
|
int TokenToIndex(int security_token_id);
|
||||||
|
|
||||||
INLINE(static bool StringsMatch(void* key1, void* key2)) {
|
|
||||||
return strcmp(reinterpret_cast<char*>(key1),
|
|
||||||
reinterpret_cast<char*>(key2)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE(static bool UidsMatch(void* key1, void* key2)) {
|
INLINE(static bool UidsMatch(void* key1, void* key2)) {
|
||||||
return key1 == key2;
|
return key1 == key2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// String::Hash -> const char*
|
StringsStorage function_and_resource_names_;
|
||||||
HashMap function_and_resource_names_;
|
|
||||||
// args_count -> char*
|
// args_count -> char*
|
||||||
List<char*> args_count_names_;
|
List<char*> args_count_names_;
|
||||||
List<CodeEntry*> code_entries_;
|
List<CodeEntry*> code_entries_;
|
||||||
|
Loading…
Reference in New Issue
Block a user