8048949: Requeue queue implementation
Devirtualize flush and move calls. Reviewed-by: brutisso, tschatzl, mschoene
This commit is contained in:
parent
5aea4e6239
commit
b585c203ac
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -47,6 +47,13 @@ public:
|
|||||||
// active field set to true.
|
// active field set to true.
|
||||||
PtrQueue(qset_, perm, true /* active */) { }
|
PtrQueue(qset_, perm, true /* active */) { }
|
||||||
|
|
||||||
|
// Flush before destroying; queue may be used to capture pending work while
|
||||||
|
// doing something else, with auto-flush on completion.
|
||||||
|
~DirtyCardQueue() { if (!is_permanent()) flush(); }
|
||||||
|
|
||||||
|
// Process queue entries and release resources.
|
||||||
|
void flush() { flush_impl(); }
|
||||||
|
|
||||||
// Apply the closure to all elements, and reset the index to make the
|
// Apply the closure to all elements, and reset the index to make the
|
||||||
// buffer empty. If a closure application returns "false", return
|
// buffer empty. If a closure application returns "false", return
|
||||||
// "false" immediately, halting the iteration. If "consume" is true,
|
// "false" immediately, halting the iteration. If "consume" is true,
|
||||||
|
@ -31,11 +31,15 @@
|
|||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
|
PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
|
||||||
_qset(qset), _buf(NULL), _index(0), _active(active),
|
_qset(qset), _buf(NULL), _index(0), _sz(0), _active(active),
|
||||||
_perm(perm), _lock(NULL)
|
_perm(perm), _lock(NULL)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void PtrQueue::flush() {
|
PtrQueue::~PtrQueue() {
|
||||||
|
assert(_perm || (_buf == NULL), "queue must be flushed before delete");
|
||||||
|
}
|
||||||
|
|
||||||
|
void PtrQueue::flush_impl() {
|
||||||
if (!_perm && _buf != NULL) {
|
if (!_perm && _buf != NULL) {
|
||||||
if (_index == _sz) {
|
if (_index == _sz) {
|
||||||
// No work to do.
|
// No work to do.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -65,15 +65,18 @@ protected:
|
|||||||
Mutex* _lock;
|
Mutex* _lock;
|
||||||
|
|
||||||
PtrQueueSet* qset() { return _qset; }
|
PtrQueueSet* qset() { return _qset; }
|
||||||
|
bool is_permanent() const { return _perm; }
|
||||||
|
|
||||||
|
// Process queue entries and release resources, if not permanent.
|
||||||
|
void flush_impl();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Initialize this queue to contain a null buffer, and be part of the
|
// Initialize this queue to contain a null buffer, and be part of the
|
||||||
// given PtrQueueSet.
|
// given PtrQueueSet.
|
||||||
PtrQueue(PtrQueueSet* qset, bool perm = false, bool active = false);
|
PtrQueue(PtrQueueSet* qset, bool perm = false, bool active = false);
|
||||||
// Release any contained resources.
|
|
||||||
virtual void flush();
|
// Requires queue flushed or permanent.
|
||||||
// Calls flush() when destroyed.
|
~PtrQueue();
|
||||||
~PtrQueue() { flush(); }
|
|
||||||
|
|
||||||
// Associate a lock with a ptr queue.
|
// Associate a lock with a ptr queue.
|
||||||
void set_lock(Mutex* lock) { _lock = lock; }
|
void set_lock(Mutex* lock) { _lock = lock; }
|
||||||
|
@ -39,7 +39,7 @@ void ObjPtrQueue::flush() {
|
|||||||
// first before we flush it, otherwise we might end up with an
|
// first before we flush it, otherwise we might end up with an
|
||||||
// enqueued buffer with refs into the CSet which breaks our invariants.
|
// enqueued buffer with refs into the CSet which breaks our invariants.
|
||||||
filter();
|
filter();
|
||||||
PtrQueue::flush();
|
flush_impl();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method removes entries from an SATB buffer that will not be
|
// This method removes entries from an SATB buffer that will not be
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -60,9 +60,8 @@ public:
|
|||||||
// field to true. This is done in JavaThread::initialize_queues().
|
// field to true. This is done in JavaThread::initialize_queues().
|
||||||
PtrQueue(qset, perm, false /* active */) { }
|
PtrQueue(qset, perm, false /* active */) { }
|
||||||
|
|
||||||
// Overrides PtrQueue::flush() so that it can filter the buffer
|
// Process queue entries and free resources.
|
||||||
// before it is flushed.
|
void flush();
|
||||||
virtual void flush();
|
|
||||||
|
|
||||||
// Overrides PtrQueue::should_enqueue_buffer(). See the method's
|
// Overrides PtrQueue::should_enqueue_buffer(). See the method's
|
||||||
// definition for more information.
|
// definition for more information.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user