diff -r f90c822e73f8 -r 2d8a650513c2 src/share/vm/utilities/taskqueue.hpp --- a/src/share/vm/utilities/taskqueue.hpp Wed Apr 27 01:25:04 2016 +0800 +++ b/src/share/vm/utilities/taskqueue.hpp Fri Apr 29 00:06:10 2016 +0800 @@ -22,6 +22,12 @@ * */ +/* + * This file has been modified by Loongson Technology in 2015. These + * modifications are Copyright (c) 2015 Loongson Technology, and are made + * available on the same license terms set forth above. + */ + #ifndef SHARE_VM_UTILITIES_TASKQUEUE_HPP #define SHARE_VM_UTILITIES_TASKQUEUE_HPP @@ -588,15 +594,34 @@ template bool GenericTaskQueueSet::steal_best_of_2(uint queue_num, int* seed, E& t) { if (_n > 2) { - uint k1 = queue_num; - while (k1 == queue_num) k1 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; - uint k2 = queue_num; - while (k2 == queue_num || k2 == k1) k2 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; - // Sample both and try the larger. - uint sz1 = _queues[k1]->size(); - uint sz2 = _queues[k2]->size(); - if (sz2 > sz1) return _queues[k2]->pop_global(t); - else return _queues[k1]->pop_global(t); + if(UseNUMASteal) { + uint i = 10; + uint k = queue_num; + while ((k == queue_num || (k - queue_num) > 3 || (queue_num - k) > 3) && i > 0) { + i--; + k = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; + } + if(i > 0) { + return _queues[k]->pop_global(t); + } + else { + while (k == queue_num) { + k = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; + } + return _queues[k]->pop_global(t); + } + } + else{ + uint k1 = queue_num; + while (k1 == queue_num) k1 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; + uint k2 = queue_num; + while (k2 == queue_num || k2 == k1) k2 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; + // Sample both and try the larger. + uint sz1 = _queues[k1]->size(); + uint sz2 = _queues[k2]->size(); + if (sz2 > sz1) return _queues[k2]->pop_global(t); + else return _queues[k1]->pop_global(t); + } } else if (_n == 2) { // Just try the other one. uint k = (queue_num + 1) % 2;