hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp
changeset 24093 095cc0a63ed9
parent 23472 35e93890ed88
child 25351 7c198a690050
equal deleted inserted replaced
24092:e274d864545a 24093:095cc0a63ed9
    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");