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_SHENANDOAH_SHENANDOAHSTRDEDUPQUEUE_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHSTRDEDUPQUEUE_HPP
27
28 #include "gc/shared/stringdedup/stringDedup.hpp"
29 #include "gc/shenandoah/shenandoahHeap.hpp"
30 #include "oops/oop.hpp"
31
32 template <uint buffer_size>
33 class ShenandoahOopBuffer : public CHeapObj<mtGC> {
34 private:
35 oop _buf[buffer_size];
36 uint _index;
37 ShenandoahOopBuffer<buffer_size>* _next;
38
39 public:
40 ShenandoahOopBuffer();
41
42 bool is_full() const;
43 bool is_empty() const;
44 uint size() const;
45
46 void push(oop obj);
47 oop pop();
48
49 void reset();
50
51 void set_next(ShenandoahOopBuffer<buffer_size>* next);
52 ShenandoahOopBuffer<buffer_size>* next() const;
53
54 void unlink_or_oops_do(StringDedupUnlinkOrOopsDoClosure* cl);
55 void oops_do(OopClosure* cl);
56 };
57
58 typedef ShenandoahOopBuffer<64> ShenandoahQueueBuffer;
59
60 // Muti-producer and single consumer queue set
61 class ShenandoahStrDedupQueue : public StringDedupQueue {
62 private:
63 ShenandoahQueueBuffer** _producer_queues;
64 ShenandoahQueueBuffer* _consumer_queue;
65 size_t _num_producer_queue;
66
67 // The queue is used for producers to publish completed buffers
68 ShenandoahQueueBuffer* _published_queues;
69
70 // Cached free buffers
71 ShenandoahQueueBuffer* _free_list;
72 size_t _num_free_buffer;
73 const size_t _max_free_buffer;
74
75 bool _cancel;
|
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_SHENANDOAH_SHENANDOAHSTRDEDUPQUEUE_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHSTRDEDUPQUEUE_HPP
27
28 #include "gc/shared/stringdedup/stringDedup.hpp"
29 #include "gc/shenandoah/shenandoahHeap.hpp"
30 #include "oops/oop.hpp"
31
32 template <uint buffer_size>
33 class ShenandoahOopBuffer : public CHeapObj<mtGC> {
34 private:
35 oop _buf[buffer_size];
36 volatile uint _index;
37 ShenandoahOopBuffer<buffer_size>* _next;
38
39 public:
40 ShenandoahOopBuffer();
41
42 bool is_full() const;
43 bool is_empty() const;
44 uint size() const;
45
46 void push(oop obj);
47 oop pop();
48
49 void reset();
50
51 void set_next(ShenandoahOopBuffer<buffer_size>* next);
52 ShenandoahOopBuffer<buffer_size>* next() const;
53
54 void unlink_or_oops_do(StringDedupUnlinkOrOopsDoClosure* cl);
55 void oops_do(OopClosure* cl);
56
57 private:
58 uint index_acquire() const;
59 void set_index_release(uint index);
60 };
61
62 typedef ShenandoahOopBuffer<64> ShenandoahQueueBuffer;
63
64 // Muti-producer and single consumer queue set
65 class ShenandoahStrDedupQueue : public StringDedupQueue {
66 private:
67 ShenandoahQueueBuffer** _producer_queues;
68 ShenandoahQueueBuffer* _consumer_queue;
69 size_t _num_producer_queue;
70
71 // The queue is used for producers to publish completed buffers
72 ShenandoahQueueBuffer* _published_queues;
73
74 // Cached free buffers
75 ShenandoahQueueBuffer* _free_list;
76 size_t _num_free_buffer;
77 const size_t _max_free_buffer;
78
79 bool _cancel;
|