1 /*
2  * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef SHARE_GC_G1_G1CODECACHEREMSET_HPP
26 #define SHARE_GC_G1_G1CODECACHEREMSET_HPP
27 
28 class CodeBlobClosure;
29 class G1CodeRootSetTable;
30 class HeapRegion;
31 class nmethod;
32 
33 // Implements storage for a set of code roots.
34 // All methods that modify the set are not thread-safe except if otherwise noted.
35 class G1CodeRootSet {
36   friend class G1CodeRootSetTest;
37  private:
38 
39   const static size_t SmallSize = 32;
40   const static size_t Threshold = 24;
41   const static size_t LargeSize = 512;
42 
43   G1CodeRootSetTable* _table;
44   G1CodeRootSetTable* load_acquire_table();
45 
46   size_t _length;
47 
48   void move_to_large();
49   void allocate_small_table();
50 
51  public:
G1CodeRootSet()52   G1CodeRootSet() : _table(NULL), _length(0) {}
53   ~G1CodeRootSet();
54 
55   static void purge();
56 
57   static size_t static_mem_size();
58 
59   void add(nmethod* method);
60 
61   bool remove(nmethod* method);
62 
63   // Safe to call without synchronization, but may return false negatives.
64   bool contains(nmethod* method);
65 
66   void clear();
67 
68   void nmethods_do(CodeBlobClosure* blk) const;
69 
70   // Remove all nmethods which no longer contain pointers into our "owner" region
71   void clean(HeapRegion* owner);
72 
is_empty()73   bool is_empty() {
74     bool empty = length() == 0;
75     assert(empty == (_table == NULL), "is empty only if table is deallocated");
76     return empty;
77   }
78 
79   // Length in elements
length() const80   size_t length() const { return _length; }
81 
82   // Memory size in bytes taken by this set.
83   size_t mem_size();
84 
85 };
86 
87 #endif // SHARE_GC_G1_G1CODECACHEREMSET_HPP
88