hotspot/src/share/vm/classfile/placeholders.hpp
changeset 13728 882756847a04
parent 13195 be27e1b6a4b9
child 14488 ab48109f7d1b
equal deleted inserted replaced
13727:caf5eb7dd4a7 13728:882756847a04
     1 /*
     1 /*
     2  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    38   friend class VMStructs;
    38   friend class VMStructs;
    39 
    39 
    40 public:
    40 public:
    41   PlaceholderTable(int table_size);
    41   PlaceholderTable(int table_size);
    42 
    42 
    43   PlaceholderEntry* new_entry(int hash, Symbol* name, oop loader, bool havesupername, Symbol* supername);
    43   PlaceholderEntry* new_entry(int hash, Symbol* name, ClassLoaderData* loader_data, bool havesupername, Symbol* supername);
    44   void free_entry(PlaceholderEntry* entry);
    44   void free_entry(PlaceholderEntry* entry);
    45 
    45 
    46   PlaceholderEntry* bucket(int i) {
    46   PlaceholderEntry* bucket(int i) {
    47     return (PlaceholderEntry*)Hashtable<Symbol*, mtClass>::bucket(i);
    47     return (PlaceholderEntry*)Hashtable<Symbol*, mtClass>::bucket(i);
    48   }
    48   }
    54   void add_entry(int index, PlaceholderEntry* new_entry) {
    54   void add_entry(int index, PlaceholderEntry* new_entry) {
    55     Hashtable<Symbol*, mtClass>::add_entry(index, (HashtableEntry<Symbol*, mtClass>*)new_entry);
    55     Hashtable<Symbol*, mtClass>::add_entry(index, (HashtableEntry<Symbol*, mtClass>*)new_entry);
    56   }
    56   }
    57 
    57 
    58   void add_entry(int index, unsigned int hash, Symbol* name,
    58   void add_entry(int index, unsigned int hash, Symbol* name,
    59                 Handle loader, bool havesupername, Symbol* supername);
    59                 ClassLoaderData* loader_data, bool havesupername, Symbol* supername);
    60 
    60 
    61   // This returns a Symbol* to match type for SystemDictionary
    61   // This returns a Symbol* to match type for SystemDictionary
    62   Symbol* find_entry(int index, unsigned int hash,
    62   Symbol* find_entry(int index, unsigned int hash,
    63                        Symbol* name, Handle loader);
    63                        Symbol* name, ClassLoaderData* loader_data);
    64 
    64 
    65   PlaceholderEntry* get_entry(int index, unsigned int hash,
    65   PlaceholderEntry* get_entry(int index, unsigned int hash,
    66                        Symbol* name, Handle loader);
    66                        Symbol* name, ClassLoaderData* loader_data);
    67 
    67 
    68 // caller to create a placeholder entry must enumerate an action
    68 // caller to create a placeholder entry must enumerate an action
    69 // caller claims ownership of that action
    69 // caller claims ownership of that action
    70 // For parallel classloading:
    70 // For parallel classloading:
    71 // multiple LOAD_INSTANCE threads can proceed in parallel
    71 // multiple LOAD_INSTANCE threads can proceed in parallel
    83 
    83 
    84   // find_and_add returns probe pointer - old or new
    84   // find_and_add returns probe pointer - old or new
    85   // If no entry exists, add a placeholder entry and push SeenThread
    85   // If no entry exists, add a placeholder entry and push SeenThread
    86   // If entry exists, reuse entry and push SeenThread for classloadAction
    86   // If entry exists, reuse entry and push SeenThread for classloadAction
    87   PlaceholderEntry* find_and_add(int index, unsigned int hash,
    87   PlaceholderEntry* find_and_add(int index, unsigned int hash,
    88                                  Symbol* name, Handle loader,
    88                                  Symbol* name, ClassLoaderData* loader_data,
    89                                  classloadAction action, Symbol* supername,
    89                                  classloadAction action, Symbol* supername,
    90                                  Thread* thread);
    90                                  Thread* thread);
    91 
    91 
    92   void remove_entry(int index, unsigned int hash,
    92   void remove_entry(int index, unsigned int hash,
    93                     Symbol* name, Handle loader);
    93                     Symbol* name, ClassLoaderData* loader_data);
    94 
    94 
    95 // Remove placeholder information
    95 // Remove placeholder information
    96   void find_and_remove(int index, unsigned int hash,
    96   void find_and_remove(int index, unsigned int hash,
    97                        Symbol* name, Handle loader, Thread* thread);
    97                        Symbol* name, ClassLoaderData* loader_data, Thread* thread);
    98 
    98 
    99   // GC support.
    99   // GC support.
   100   void oops_do(OopClosure* f);
   100   void classes_do(KlassClosure* f);
   101 
   101 
   102   // JVMTI support
   102   // JVMTI support
   103   void entries_do(void f(Symbol*, oop));
   103   void entries_do(void f(Symbol*));
   104 
   104 
   105 #ifndef PRODUCT
   105 #ifndef PRODUCT
   106   void print();
   106   void print();
   107 #endif
   107 #endif
   108   void verify();
   108   void verify();
   155 class PlaceholderEntry : public HashtableEntry<Symbol*, mtClass> {
   155 class PlaceholderEntry : public HashtableEntry<Symbol*, mtClass> {
   156   friend class VMStructs;
   156   friend class VMStructs;
   157 
   157 
   158 
   158 
   159  private:
   159  private:
   160   oop               _loader;        // initiating loader
   160   ClassLoaderData*  _loader_data;   // initiating loader
   161   bool              _havesupername; // distinguish between null supername, and unknown
   161   bool              _havesupername; // distinguish between null supername, and unknown
   162   Symbol*           _supername;
   162   Symbol*           _supername;
   163   Thread*           _definer;       // owner of define token
   163   Thread*           _definer;       // owner of define token
   164   klassOop          _instanceKlass; // instanceKlass from successful define
   164   Klass*            _instanceKlass; // InstanceKlass from successful define
   165   SeenThread*       _superThreadQ;  // doubly-linked queue of Threads loading a superclass for this class
   165   SeenThread*       _superThreadQ;  // doubly-linked queue of Threads loading a superclass for this class
   166   SeenThread*       _loadInstanceThreadQ;  // loadInstance thread
   166   SeenThread*       _loadInstanceThreadQ;  // loadInstance thread
   167                                     // can be multiple threads if classloader object lock broken by application
   167                                     // can be multiple threads if classloader object lock broken by application
   168                                     // or if classloader supports parallel classloading
   168                                     // or if classloader supports parallel classloading
   169 
   169 
   174 
   174 
   175  public:
   175  public:
   176   // Simple accessors, used only by SystemDictionary
   176   // Simple accessors, used only by SystemDictionary
   177   Symbol*            klassname()           const { return literal(); }
   177   Symbol*            klassname()           const { return literal(); }
   178 
   178 
   179   oop                loader()              const { return _loader; }
   179   ClassLoaderData*   loader_data()         const { return _loader_data; }
   180   void               set_loader(oop loader) { _loader = loader; }
   180   void               set_loader_data(ClassLoaderData* loader_data) { _loader_data = loader_data; }
   181   oop*               loader_addr()         { return &_loader; }
       
   182 
   181 
   183   bool               havesupername()       const { return _havesupername; }
   182   bool               havesupername()       const { return _havesupername; }
   184   void               set_havesupername(bool havesupername) { _havesupername = havesupername; }
   183   void               set_havesupername(bool havesupername) { _havesupername = havesupername; }
   185 
   184 
   186   Symbol*            supername()           const { return _supername; }
   185   Symbol*            supername()           const { return _supername; }
   190   }
   189   }
   191 
   190 
   192   Thread*            definer()             const {return _definer; }
   191   Thread*            definer()             const {return _definer; }
   193   void               set_definer(Thread* definer) { _definer = definer; }
   192   void               set_definer(Thread* definer) { _definer = definer; }
   194 
   193 
   195   klassOop           instanceKlass()     const {return _instanceKlass; }
   194   Klass*             InstanceKlass()     const {return _instanceKlass; }
   196   void               set_instanceKlass(klassOop instanceKlass) { _instanceKlass = instanceKlass; }
   195   void               set_instanceKlass(Klass* InstanceKlass) { _instanceKlass = InstanceKlass; }
   197   klassOop*          instanceKlass_addr()   { return &_instanceKlass; }
       
   198 
   196 
   199   SeenThread*        superThreadQ()        const { return _superThreadQ; }
   197   SeenThread*        superThreadQ()        const { return _superThreadQ; }
   200   void               set_superThreadQ(SeenThread* SeenThread) { _superThreadQ = SeenThread; }
   198   void               set_superThreadQ(SeenThread* SeenThread) { _superThreadQ = SeenThread; }
   201 
   199 
   202   SeenThread*        loadInstanceThreadQ() const { return _loadInstanceThreadQ; }
   200   SeenThread*        loadInstanceThreadQ() const { return _loadInstanceThreadQ; }
   213     return (PlaceholderEntry**)HashtableEntry<Symbol*, mtClass>::next_addr();
   211     return (PlaceholderEntry**)HashtableEntry<Symbol*, mtClass>::next_addr();
   214   }
   212   }
   215 
   213 
   216   // Test for equality
   214   // Test for equality
   217   // Entries are unique for class/classloader name pair
   215   // Entries are unique for class/classloader name pair
   218   bool equals(Symbol* class_name, oop class_loader) const {
   216   bool equals(Symbol* class_name, ClassLoaderData* loader) const {
   219     return (klassname() == class_name && loader() == class_loader);
   217     return (klassname() == class_name && loader_data() == loader);
   220   }
   218   }
   221 
   219 
   222   SeenThread* actionToQueue(PlaceholderTable::classloadAction action) {
   220   SeenThread* actionToQueue(PlaceholderTable::classloadAction action) {
   223     SeenThread* queuehead;
   221     SeenThread* queuehead;
   224     switch (action) {
   222     switch (action) {
   329     return (actionToQueue(action) == NULL);
   327     return (actionToQueue(action) == NULL);
   330   }
   328   }
   331 
   329 
   332   // GC support
   330   // GC support
   333   // Applies "f->do_oop" to all root oops in the placeholder table.
   331   // Applies "f->do_oop" to all root oops in the placeholder table.
   334   void oops_do(OopClosure* blk);
   332   void classes_do(KlassClosure* closure);
   335 
   333 
   336   // Print method doesn't append a cr
   334   // Print method doesn't append a cr
   337   void print() const  PRODUCT_RETURN;
   335   void print() const  PRODUCT_RETURN;
   338   void verify() const;
   336   void verify() const;
   339 };
   337 };