< 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 >