comparison src/share/vm/memory/freeBlockDictionary.hpp @ 6026:9f059abe8cf2

7131629: Generalize the CMS free list code Summary: Make the FreeChunk, FreeList, TreeList, and BinaryTreeDictionary classes usable outside CMS. Reviewed-by: brutisso, johnc, jwilhelm Contributed-by: coleen.phillimore@oracle.com
author jmasa
date Thu, 29 Mar 2012 19:46:24 -0700
parents src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.hpp@f95d63e2154a
children f69a5d43dc19
comparison
equal deleted inserted replaced
6016:3c91f2c9fd21 6026:9f059abe8cf2
1 /*
2 * Copyright (c) 2001, 2012, 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_VM_MEMORY_FREEBLOCKDICTIONARY_HPP
26 #define SHARE_VM_MEMORY_FREEBLOCKDICTIONARY_HPP
27
28 #include "memory/allocation.hpp"
29 #include "runtime/mutex.hpp"
30 #include "utilities/debug.hpp"
31 #include "utilities/globalDefinitions.hpp"
32 #include "utilities/ostream.hpp"
33
34 // A FreeBlockDictionary is an abstract superclass that will allow
35 // a number of alternative implementations in the future.
36 template <class Chunk>
37 class FreeBlockDictionary: public CHeapObj {
38 public:
39 enum Dither {
40 atLeast,
41 exactly,
42 roughly
43 };
44 enum DictionaryChoice {
45 dictionaryBinaryTree = 0,
46 dictionarySplayTree = 1,
47 dictionarySkipList = 2
48 };
49
50 private:
51 NOT_PRODUCT(Mutex* _lock;)
52
53 public:
54 virtual void removeChunk(Chunk* fc) = 0;
55 virtual Chunk* getChunk(size_t size, Dither dither = atLeast) = 0;
56 virtual void returnChunk(Chunk* chunk) = 0;
57 virtual size_t totalChunkSize(debug_only(const Mutex* lock)) const = 0;
58 virtual size_t maxChunkSize() const = 0;
59 virtual size_t minSize() const = 0;
60 // Reset the dictionary to the initial conditions for a single
61 // block.
62 virtual void reset(HeapWord* addr, size_t size) = 0;
63 virtual void reset() = 0;
64
65 virtual void dictCensusUpdate(size_t size, bool split, bool birth) = 0;
66 virtual bool coalDictOverPopulated(size_t size) = 0;
67 virtual void beginSweepDictCensus(double coalSurplusPercent,
68 float inter_sweep_current, float inter_sweep_estimate,
69 float intra__sweep_current) = 0;
70 virtual void endSweepDictCensus(double splitSurplusPercent) = 0;
71 virtual Chunk* findLargestDict() const = 0;
72 // verify that the given chunk is in the dictionary.
73 virtual bool verifyChunkInFreeLists(Chunk* tc) const = 0;
74
75 // Sigma_{all_free_blocks} (block_size^2)
76 virtual double sum_of_squared_block_sizes() const = 0;
77
78 virtual Chunk* find_chunk_ends_at(HeapWord* target) const = 0;
79 virtual void inc_totalSize(size_t v) = 0;
80 virtual void dec_totalSize(size_t v) = 0;
81
82 NOT_PRODUCT (
83 virtual size_t sumDictReturnedBytes() = 0;
84 virtual void initializeDictReturnedBytes() = 0;
85 virtual size_t totalCount() = 0;
86 )
87
88 virtual void reportStatistics() const {
89 gclog_or_tty->print("No statistics available");
90 }
91
92 virtual void printDictCensus() const = 0;
93 virtual void print_free_lists(outputStream* st) const = 0;
94
95 virtual void verify() const = 0;
96
97 Mutex* par_lock() const PRODUCT_RETURN0;
98 void set_par_lock(Mutex* lock) PRODUCT_RETURN;
99 void verify_par_locked() const PRODUCT_RETURN;
100 };
101
102 #endif // SHARE_VM_MEMORY_FREEBLOCKDICTIONARY_HPP