8035946: Use ResourceHashtable for dependency checking

Use ResourceHashtable for dependency checking and delete GenericHashtable

Reviewed-by: kvn, coleenp
This commit is contained in:
Albert Noll 2014-03-03 08:04:14 +01:00
parent ad8d066a4a
commit 7722b3d097
6 changed files with 26 additions and 208 deletions

View file

@ -327,86 +327,4 @@ public:
}
};
/*
* Usage of GenericHashtable:
*
* class X : public GenericHashtableEntry<X, ResourceObj> {
*
* // Implement virtual functions in class X
* bool equals(X* sig) const;
* uintptr_t hash() const;
* };
*
* void foo() {
* GenericHashtable<X, ResourceObj>* table = new GenericHashtable<X, ResourceObj>(11027, false);
*
* X* elem = new X();
* table->add(elem);
* table->contains(elem);
* }
*
* You can choose other allocation types as well. For example, to store the hashtable to a
* particular region (CHeapObj<type>) simply replace ResourceObj with the desired type:
*
* class X : public GenericHashtableEntry<X, CHeapObj<mtCode> > { ... };
*
* To make the destructor (and remove) of the hashtable work:
* 1) override the delete operator of X
* 2) provide a destructor of the X
*
* You may also find it convenient to override the new operator.
*
* If you use this templates do not forget to add an explicit initialization
* (at the end of hashtable.cpp).
*
* template class GenericHashtable<X, ResourceObj>;
*/
template <class T, class M> class GenericHashtableEntry : public M {
private:
T* _next;
T* _prev;
public:
// Must be implemented by subclass.
virtual uintptr_t key() const = 0;
virtual bool equals(T* other) const = 0;
T* next() const { return _next; }
T* prev() const { return _prev; }
void set_next(T* item) { _next = item; }
void set_prev(T* item) { _prev = item; }
// Constructor and destructor
GenericHashtableEntry() : _next(NULL), _prev(NULL) { };
virtual ~GenericHashtableEntry() {};
};
template <class T, class M> class GenericHashtable : public M {
private:
T** _items;
int _size;
bool _C_heap;
MEMFLAGS _memflag;
// Accessor methods
T* head (int idx) const { return _items[idx]; }
void set_head(T* item, int idx) { _items[idx] = item; }
int index (T* item) { assert(item != NULL, "missing null check"); return item->key() % size(); }
// Helper function
T* contains_impl(T* item, int idx);
DEBUG_ONLY(int _num_items;)
public:
GenericHashtable(int size, bool C_heap = false, MEMFLAGS memflag = mtNone);
~GenericHashtable();
T* contains(T* match_item);
T* remove (T* match_item);
bool add (T* item);
bool on_C_heap() const { return _C_heap; }
int size() const { return _size; }
};
#endif // SHARE_VM_UTILITIES_HASHTABLE_HPP