< prev index next >
src/hotspot/share/classfile/placeholders.hpp
Print this page
*** 72,85 ****
// LOAD_SUPER needed to check for class circularity
// DEFINE_CLASS: ultimately define class must be single threaded
// on a class/classloader basis
// so the head of that queue owns the token
// and the rest of the threads return the result the first thread gets
enum classloadAction {
LOAD_INSTANCE = 1, // calling load_instance_class
LOAD_SUPER = 2, // loading superclass for this class
! DEFINE_CLASS = 3 // find_or_define class
};
// find_and_add returns probe pointer - old or new
// If no entry exists, add a placeholder entry and push SeenThread for classloadAction
// If entry exists, reuse entry and push SeenThread for classloadAction
--- 72,87 ----
// LOAD_SUPER needed to check for class circularity
// DEFINE_CLASS: ultimately define class must be single threaded
// on a class/classloader basis
// so the head of that queue owns the token
// and the rest of the threads return the result the first thread gets
+ // FLATTENABLE_FIELD: needed to check for value type flattenable fields circularity
enum classloadAction {
LOAD_INSTANCE = 1, // calling load_instance_class
LOAD_SUPER = 2, // loading superclass for this class
! DEFINE_CLASS = 3, // find_or_define class
! FLATTENABLE_FIELD = 4 // flattenable value type fields
};
// find_and_add returns probe pointer - old or new
// If no entry exists, add a placeholder entry and push SeenThread for classloadAction
// If entry exists, reuse entry and push SeenThread for classloadAction
*** 107,116 ****
--- 109,120 ----
// For bootclasssearchpath, set before calling load_instance_class.
// Defining must be single threaded on a class/classloader basis
// For DEFINE_CLASS, the head of the queue owns the
// define token and the rest of the threads wait to return the
// result the first thread gets.
+ // For FLATTENABLE_FIELD, set when loading value type fields for
+ // class circularity checking.
class SeenThread: public CHeapObj<mtInternal> {
private:
Thread *_thread;
SeenThread* _stnext;
SeenThread* _stprev;
*** 158,167 ****
--- 162,172 ----
SeenThread* _defineThreadQ; // queue of Threads trying to define this class
// including _definer
// _definer owns token
// queue waits for and returns results from _definer
+ SeenThread* _flattenableFieldQ; // queue of value types for circularity checking
public:
// Simple accessors, used only by SystemDictionary
Symbol* klassname() const { return literal(); }
*** 190,199 ****
--- 195,207 ----
void set_loadInstanceThreadQ(SeenThread* SeenThread) { _loadInstanceThreadQ = SeenThread; }
SeenThread* defineThreadQ() const { return _defineThreadQ; }
void set_defineThreadQ(SeenThread* SeenThread) { _defineThreadQ = SeenThread; }
+ SeenThread* flattenableFieldQ() const { return _flattenableFieldQ; }
+ void set_flattenableFieldQ(SeenThread* SeenThread) { _flattenableFieldQ = SeenThread; }
+
PlaceholderEntry* next() const {
return (PlaceholderEntry*)HashtableEntry<Symbol*, mtClass>::next();
}
PlaceholderEntry** next_addr() {
*** 216,225 ****
--- 224,236 ----
queuehead = _superThreadQ;
break;
case PlaceholderTable::DEFINE_CLASS:
queuehead = _defineThreadQ;
break;
+ case PlaceholderTable::FLATTENABLE_FIELD:
+ queuehead = _flattenableFieldQ;
+ break;
default: Unimplemented();
}
return queuehead;
}
*** 232,241 ****
--- 243,255 ----
_superThreadQ = seenthread;
break;
case PlaceholderTable::DEFINE_CLASS:
_defineThreadQ = seenthread;
break;
+ case PlaceholderTable::FLATTENABLE_FIELD:
+ _flattenableFieldQ = seenthread;
+ break;
default: Unimplemented();
}
return;
}
*** 249,258 ****
--- 263,276 ----
bool define_class_in_progress() {
return (_defineThreadQ != NULL);
}
+ bool flattenable_field_in_progress() {
+ return (_flattenableFieldQ != NULL);
+ }
+
// Doubly-linked list of Threads per action for class/classloader pair
// Class circularity support: links in thread before loading superclass
// bootstrapsearchpath support: links in a thread before load_instance_class
// definers: use as queue of define requestors, including owner of
// define token. Appends for debugging of requestor order
< prev index next >