< prev index next >
src/share/vm/gc/g1/ptrQueue.cpp
Print this page
rev 10256 : [mq]: bufnode_cleanup
rev 10257 : [mq]: flexible_array
*** 1,7 ****
/*
! * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 28,37 ****
--- 28,39 ----
#include "memory/allocation.inline.hpp"
#include "runtime/mutex.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/thread.inline.hpp"
+ #include <new>
+
PtrQueue::PtrQueue(PtrQueueSet* qset, bool permanent, bool active) :
_qset(qset), _buf(NULL), _index(0), _sz(0), _active(active),
_permanent(permanent), _lock(NULL)
{}
*** 85,94 ****
--- 87,109 ----
// case.
_lock->lock_without_safepoint_check();
}
+ BufferNode* BufferNode::allocate(size_t byte_size) {
+ assert(byte_size > 0, "precondition");
+ assert(is_size_aligned(byte_size, sizeof(void**)),
+ "Invalid buffer size " SIZE_FORMAT, byte_size);
+ void* data = NEW_C_HEAP_ARRAY(char, buffer_offset() + byte_size, mtGC);
+ return new (data) BufferNode;
+ }
+
+ void BufferNode::deallocate(BufferNode* node) {
+ node->~BufferNode();
+ FREE_C_HEAP_ARRAY(char, node);
+ }
+
PtrQueueSet::PtrQueueSet(bool notify_when_complete) :
_max_completed_queue(0),
_cbl_mon(NULL), _fl_lock(NULL),
_notify_when_complete(notify_when_complete),
_sz(0),
*** 121,141 ****
_fl_owner = (fl_owner != NULL) ? fl_owner : this;
}
void** PtrQueueSet::allocate_buffer() {
assert(_sz > 0, "Didn't set a buffer size.");
MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);
! if (_fl_owner->_buf_free_list != NULL) {
! void** res = BufferNode::make_buffer_from_node(_fl_owner->_buf_free_list);
! _fl_owner->_buf_free_list = _fl_owner->_buf_free_list->next();
_fl_owner->_buf_free_list_sz--;
! return res;
} else {
! // Allocate space for the BufferNode in front of the buffer.
! char *b = NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size(), mtGC);
! return BufferNode::make_buffer_from_block(b);
}
}
void PtrQueueSet::deallocate_buffer(void** buf) {
assert(_sz > 0, "Didn't set a buffer size.");
MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);
--- 136,162 ----
_fl_owner = (fl_owner != NULL) ? fl_owner : this;
}
void** PtrQueueSet::allocate_buffer() {
assert(_sz > 0, "Didn't set a buffer size.");
+ BufferNode* node = NULL;
+ {
MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);
! node = _fl_owner->_buf_free_list;
! if (node != NULL) {
! _fl_owner->_buf_free_list = node->next();
_fl_owner->_buf_free_list_sz--;
! }
! }
! if (node == NULL) {
! node = BufferNode::allocate(_sz);
} else {
! // Reinitialize buffer obtained from free list.
! node->set_index(0);
! node->set_next(NULL);
}
+ return BufferNode::make_buffer_from_node(node);
}
void PtrQueueSet::deallocate_buffer(void** buf) {
assert(_sz > 0, "Didn't set a buffer size.");
MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);
*** 148,164 ****
void PtrQueueSet::reduce_free_list() {
assert(_fl_owner == this, "Free list reduction is allowed only for the owner");
// For now we'll adopt the strategy of deleting half.
MutexLockerEx x(_fl_lock, Mutex::_no_safepoint_check_flag);
size_t n = _buf_free_list_sz / 2;
! while (n > 0) {
! assert(_buf_free_list != NULL, "_buf_free_list_sz must be wrong.");
! void* b = BufferNode::make_block_from_node(_buf_free_list);
! _buf_free_list = _buf_free_list->next();
! FREE_C_HEAP_ARRAY(char, b);
! _buf_free_list_sz --;
! n--;
}
}
void PtrQueue::handle_zero_index() {
assert(_index == 0, "Precondition.");
--- 169,185 ----
void PtrQueueSet::reduce_free_list() {
assert(_fl_owner == this, "Free list reduction is allowed only for the owner");
// For now we'll adopt the strategy of deleting half.
MutexLockerEx x(_fl_lock, Mutex::_no_safepoint_check_flag);
size_t n = _buf_free_list_sz / 2;
! for (size_t i = 0; i < n; ++i) {
! assert(_buf_free_list != NULL,
! "_buf_free_list_sz is wrong: " SIZE_FORMAT, _buf_free_list_sz);
! BufferNode* node = _buf_free_list;
! _buf_free_list = node->next();
! _buf_free_list_sz--;
! BufferNode::deallocate(node);
}
}
void PtrQueue::handle_zero_index() {
assert(_index == 0, "Precondition.");
*** 234,245 ****
return false;
}
void PtrQueueSet::enqueue_complete_buffer(void** buf, size_t index) {
MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
! BufferNode* cbn = BufferNode::new_from_buffer(buf);
cbn->set_index(index);
if (_completed_buffers_tail == NULL) {
assert(_completed_buffers_head == NULL, "Well-formedness");
_completed_buffers_head = cbn;
_completed_buffers_tail = cbn;
} else {
--- 255,267 ----
return false;
}
void PtrQueueSet::enqueue_complete_buffer(void** buf, size_t index) {
MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
! BufferNode* cbn = BufferNode::make_node_from_buffer(buf);
cbn->set_index(index);
+ cbn->set_next(NULL);
if (_completed_buffers_tail == NULL) {
assert(_completed_buffers_head == NULL, "Well-formedness");
_completed_buffers_head = cbn;
_completed_buffers_tail = cbn;
} else {
< prev index next >