comparison src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp @ 17947:1772223a25a2

8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV Reviewed-by: brutisso, mgerdin
author pliden
date Fri, 11 Apr 2014 11:00:12 +0200
parents 595c0f60d50d
children
comparison
equal deleted inserted replaced
17946:997fd9660dd5 17947:1772223a25a2
33 const size_t G1StringDedupQueue::_max_size = 1000000; // Max number of elements per queue 33 const size_t G1StringDedupQueue::_max_size = 1000000; // Max number of elements per queue
34 const size_t G1StringDedupQueue::_max_cache_size = 0; // Max cache size per queue 34 const size_t G1StringDedupQueue::_max_cache_size = 0; // Max cache size per queue
35 35
36 G1StringDedupQueue::G1StringDedupQueue() : 36 G1StringDedupQueue::G1StringDedupQueue() :
37 _cursor(0), 37 _cursor(0),
38 _cancel(false),
38 _empty(true), 39 _empty(true),
39 _dropped(0) { 40 _dropped(0) {
40 _nqueues = MAX2(ParallelGCThreads, (size_t)1); 41 _nqueues = MAX2(ParallelGCThreads, (size_t)1);
41 _queues = NEW_C_HEAP_ARRAY(G1StringDedupWorkerQueue, _nqueues, mtGC); 42 _queues = NEW_C_HEAP_ARRAY(G1StringDedupWorkerQueue, _nqueues, mtGC);
42 for (size_t i = 0; i < _nqueues; i++) { 43 for (size_t i = 0; i < _nqueues; i++) {
53 _queue = new G1StringDedupQueue(); 54 _queue = new G1StringDedupQueue();
54 } 55 }
55 56
56 void G1StringDedupQueue::wait() { 57 void G1StringDedupQueue::wait() {
57 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag); 58 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
58 while (_queue->_empty) { 59 while (_queue->_empty && !_queue->_cancel) {
59 ml.wait(Mutex::_no_safepoint_check_flag); 60 ml.wait(Mutex::_no_safepoint_check_flag);
60 } 61 }
62 }
63
64 void G1StringDedupQueue::cancel_wait() {
65 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
66 _queue->_cancel = true;
67 ml.notify();
61 } 68 }
62 69
63 void G1StringDedupQueue::push(uint worker_id, oop java_string) { 70 void G1StringDedupQueue::push(uint worker_id, oop java_string) {
64 assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint"); 71 assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
65 assert(worker_id < _queue->_nqueues, "Invalid queue"); 72 assert(worker_id < _queue->_nqueues, "Invalid queue");