--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp Wed Jan 20 12:54:25 2010 -0800
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp Wed Jan 20 22:10:33 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc. 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
@@ -23,6 +23,8 @@
*/
class AdapterHandlerEntry;
+class AdapterHandlerTable;
+class AdapterFingerPrint;
class vframeStream;
// Runtime is the base class for various runtime interfaces
@@ -337,7 +339,8 @@
int total_args_passed,
int max_arg,
const BasicType *sig_bt,
- const VMRegPair *regs);
+ const VMRegPair *regs,
+ AdapterFingerPrint* fingerprint);
// OSR support
@@ -528,28 +531,41 @@
// used by the adapters. The code generation happens here because it's very
// similar to what the adapters have to do.
-class AdapterHandlerEntry : public CHeapObj {
+class AdapterHandlerEntry : public BasicHashtableEntry {
+ friend class AdapterHandlerTable;
+
private:
+ AdapterFingerPrint* _fingerprint;
address _i2c_entry;
address _c2i_entry;
address _c2i_unverified_entry;
+ void init(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry, address c2i_unverified_entry) {
+ _fingerprint = fingerprint;
+ _i2c_entry = i2c_entry;
+ _c2i_entry = c2i_entry;
+ _c2i_unverified_entry = c2i_unverified_entry;
+ }
+
+ // should never be used
+ AdapterHandlerEntry();
+
public:
-
// The name we give all buffer blobs
static const char* name;
- AdapterHandlerEntry(address i2c_entry, address c2i_entry, address c2i_unverified_entry):
- _i2c_entry(i2c_entry),
- _c2i_entry(c2i_entry),
- _c2i_unverified_entry(c2i_unverified_entry) {
- }
-
address get_i2c_entry() { return _i2c_entry; }
address get_c2i_entry() { return _c2i_entry; }
address get_c2i_unverified_entry() { return _c2i_unverified_entry; }
void relocate(address new_base);
+
+ AdapterFingerPrint* fingerprint() { return _fingerprint; }
+
+ AdapterHandlerEntry* next() {
+ return (AdapterHandlerEntry*)BasicHashtableEntry::next();
+ }
+
#ifndef PRODUCT
void print();
#endif /* PRODUCT */
@@ -558,30 +574,18 @@
class AdapterHandlerLibrary: public AllStatic {
private:
static BufferBlob* _buffer; // the temporary code buffer in CodeCache
- static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection
- static GrowableArray<AdapterHandlerEntry*> * _handlers; // the corresponding handlers
- enum {
- AbstractMethodHandler = 1 // special handler for abstract methods
- };
+ static AdapterHandlerTable* _adapters;
+ static AdapterHandlerEntry* _abstract_method_handler;
static BufferBlob* buffer_blob();
static void initialize();
- static int get_create_adapter_index(methodHandle method);
- static address get_i2c_entry( int index ) {
- return get_entry(index)->get_i2c_entry();
- }
- static address get_c2i_entry( int index ) {
- return get_entry(index)->get_c2i_entry();
- }
- static address get_c2i_unverified_entry( int index ) {
- return get_entry(index)->get_c2i_unverified_entry();
- }
public:
- static AdapterHandlerEntry* get_entry( int index ) { return _handlers->at(index); }
+
+ static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint,
+ address i2c_entry, address c2i_entry, address c2i_unverified_entry);
static nmethod* create_native_wrapper(methodHandle method);
- static AdapterHandlerEntry* get_adapter(methodHandle method) {
- return get_entry(get_create_adapter_index(method));
- }
+ static AdapterHandlerEntry* get_adapter(methodHandle method);
+
#ifdef HAVE_DTRACE_H
static nmethod* create_dtrace_nmethod (methodHandle method);
#endif // HAVE_DTRACE_H
@@ -589,6 +593,7 @@
#ifndef PRODUCT
static void print_handler(CodeBlob* b);
static bool contains(CodeBlob* b);
+ static void print_statistics();
#endif /* PRODUCT */
};