blob: c9de22831508b3205cfc0160abb5498bf0df6127 [file] [log] [blame]
Brian Carlstrom7e93b502011-08-04 14:16:22 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_INTERN_TABLE_H_
4#define ART_SRC_INTERN_TABLE_H_
5
6#include "unordered_map.h"
7
8#include "heap.h"
9#include "object.h"
10
11namespace art {
12
Elliott Hughescf4c6c42011-09-01 15:16:42 -070013/**
14 * Used to intern strings.
15 *
16 * There are actually two tables: one that holds strong references to its strings, and one that
17 * holds weak references. The former is used for string literals, for which there is an effective
18 * reference from the constant pool. The latter is used for strings interned at runtime via
19 * String.intern. Some code (XML parsers being a prime example) relies on being able to intern
20 * arbitrarily many strings for the duration of a parse without permanently increasing the memory
21 * footprint.
22 */
Brian Carlstrom7e93b502011-08-04 14:16:22 -070023class InternTable {
24 public:
25 InternTable();
Elliott Hughesde69d7f2011-08-18 16:49:37 -070026 ~InternTable();
Brian Carlstroma663ea52011-08-19 23:33:41 -070027
Elliott Hughescf4c6c42011-09-01 15:16:42 -070028 // Interns a potentially new string in the 'strong' table. (See above.)
29 const String* InternStrong(int32_t utf16_length, const char* utf8_data);
Brian Carlstroma663ea52011-08-19 23:33:41 -070030
Elliott Hughescf4c6c42011-09-01 15:16:42 -070031 // Interns a potentially new string in the 'weak' table. (See above.)
32 const String* InternWeak(const String* s);
33
34 // Register a String trusting that it is safe to intern.
35 // Used when reinitializing InternTable from an image.
36 void RegisterStrong(const String* s);
37
Elliott Hughes410c0c82011-09-01 17:58:25 -070038 // Removes all weak interns for which the predicate functor 'p' returns true.
39 // (We use an explicit Predicate type rather than a template to keep implementation
40 // out of the header file.)
41 struct Predicate {
42 virtual ~Predicate() {}
43 virtual bool operator()(const String*) const = 0;
44 };
45 void RemoveWeakIf(const Predicate& p);
Elliott Hughescf4c6c42011-09-01 15:16:42 -070046
47 bool ContainsWeak(const String* s);
Brian Carlstroma663ea52011-08-19 23:33:41 -070048
49 size_t Size() const;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070050
Elliott Hughes410c0c82011-09-01 17:58:25 -070051 void VisitRoots(Heap::RootVisitor* visitor, void* arg) const;
Brian Carlstrom7e93b502011-08-04 14:16:22 -070052
53 private:
Elliott Hughescf4c6c42011-09-01 15:16:42 -070054 typedef std::tr1::unordered_multimap<int32_t, const String*> Table;
55
56 const String* Insert(const String* s, bool is_strong);
57
58 const String* Lookup(Table& table, const String* s, uint32_t hash_code);
59 const String* Insert(Table& table, const String* s, uint32_t hash_code);
60 void Remove(Table& table, const String* s, uint32_t hash_code);
61
62 Table strong_interns_;
63 Table weak_interns_;
Brian Carlstrom7e93b502011-08-04 14:16:22 -070064 Mutex* intern_table_lock_;
65};
66
67} // namespace art
68
69#endif // ART_SRC_CLASS_LINKER_H_