--- a/src/hotspot/share/gc/z/zNMethodTable.hpp Tue Dec 11 11:29:28 2018 +0100
+++ b/src/hotspot/share/gc/z/zNMethodTable.hpp Tue Dec 11 11:08:39 2018 +0100
@@ -24,28 +24,40 @@
#ifndef SHARE_GC_Z_ZNMETHODTABLE_HPP
#define SHARE_GC_Z_ZNMETHODTABLE_HPP
+#include "gc/z/zArray.hpp"
#include "gc/z/zGlobals.hpp"
+#include "gc/z/zLock.hpp"
#include "gc/z/zNMethodTableEntry.hpp"
#include "memory/allocation.hpp"
+class ZWorkers;
+
+class ZNMethodTableEntryClosure {
+public:
+ virtual void do_nmethod_entry(ZNMethodTableEntry entry) = 0;
+};
+
class ZNMethodTable : public AllStatic {
private:
static ZNMethodTableEntry* _table;
static size_t _size;
+ static ZLock _iter_lock;
+ static ZNMethodTableEntry* _iter_table;
+ static size_t _iter_table_size;
+ static ZArray<void*> _iter_deferred_deletes;
static size_t _nregistered;
static size_t _nunregistered;
static volatile size_t _claimed ATTRIBUTE_ALIGNED(ZCacheLineSize);
static ZNMethodTableEntry create_entry(nmethod* nm);
- static void destroy_entry(ZNMethodTableEntry entry);
-
- static nmethod* method(ZNMethodTableEntry entry);
static size_t first_index(const nmethod* nm, size_t size);
static size_t next_index(size_t prev_index, size_t size);
+ static void sweeper_wait_for_iteration();
+
static bool register_entry(ZNMethodTableEntry* table, size_t size, ZNMethodTableEntry entry);
- static bool unregister_entry(ZNMethodTableEntry* table, size_t size, const nmethod* nm);
+ static bool unregister_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm);
static void rebuild(size_t new_size);
static void rebuild_if_needed();
@@ -53,19 +65,28 @@
static void log_register(const nmethod* nm, ZNMethodTableEntry entry);
static void log_unregister(const nmethod* nm);
- static void entry_oops_do(ZNMethodTableEntry entry, OopClosure* cl);
+public:
+ static void safe_delete(void* data);
-public:
static size_t registered_nmethods();
static size_t unregistered_nmethods();
static void register_nmethod(nmethod* nm);
static void unregister_nmethod(nmethod* nm);
+ static void disarm_nmethod(nmethod* nm);
- static void gc_prologue();
- static void gc_epilogue();
+ static ZReentrantLock* lock_for_nmethod(nmethod* nm);
static void oops_do(OopClosure* cl);
+
+ static void entry_oops_do(ZNMethodTableEntry entry, OopClosure* cl);
+
+ static void nmethod_entries_do_begin();
+ static void nmethod_entries_do_end();
+ static void nmethod_entries_do(ZNMethodTableEntryClosure* cl);
+
+ static void unlink(ZWorkers* workers, bool unloading_occurred);
+ static void purge(ZWorkers* workers);
};
#endif // SHARE_GC_Z_ZNMETHODTABLE_HPP