summaryrefslogtreecommitdiff
path: root/src/intern_table.h
blob: c814a1b85c117a2f1bb90ee90aa033c3c1e0f034 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2011 Google Inc. All Rights Reserved.

#ifndef ART_SRC_INTERN_TABLE_H_
#define ART_SRC_INTERN_TABLE_H_

#include "unordered_map.h"

#include "heap.h"
#include "mutex.h"
#include "object.h"

namespace art {

/**
 * Used to intern strings.
 *
 * There are actually two tables: one that holds strong references to its strings, and one that
 * holds weak references. The former is used for string literals, for which there is an effective
 * reference from the constant pool. The latter is used for strings interned at runtime via
 * String.intern. Some code (XML parsers being a prime example) relies on being able to intern
 * arbitrarily many strings for the duration of a parse without permanently increasing the memory
 * footprint.
 */
class InternTable {
 public:
  InternTable();

  // Interns a potentially new string in the 'strong' table. (See above.)
  String* InternStrong(int32_t utf16_length, const char* utf8_data);

  // Interns a potentially new string in the 'strong' table. (See above.)
  String* InternStrong(const char* utf8_data);

  // Interns a potentially new string in the 'strong' table. (See above.)
  String* InternStrong(String* s);

  // Interns a potentially new string in the 'weak' table. (See above.)
  String* InternWeak(String* s);

  // Register a String trusting that it is safe to intern.
  // Used when reinitializing InternTable from an image.
  void RegisterStrong(String* s);

  // Removes all weak interns for which the predicate functor 'p' returns true.
  // (We use an explicit Predicate type rather than a template to keep implementation
  // out of the header file.)
  struct Predicate {
    virtual ~Predicate() {}
    virtual bool operator()(const String*) const = 0;
  };
  void RemoveWeakIf(const Predicate& p);

  bool ContainsWeak(String* s);

  size_t Size() const;

  void VisitRoots(Heap::RootVisitor* visitor, void* arg) const;

 private:
  typedef std::tr1::unordered_multimap<int32_t, String*> Table;

  String* Insert(String* s, bool is_strong);

  String* Lookup(Table& table, String* s, uint32_t hash_code);
  String* Insert(Table& table, String* s, uint32_t hash_code);
  void Remove(Table& table, const String* s, uint32_t hash_code);

  mutable Mutex intern_table_lock_;
  Table strong_interns_;
  Table weak_interns_;
};

}  // namespace art

#endif  // ART_SRC_CLASS_LINKER_H_