91 // Safepoints are forbidden during DC lifetime. GC can invalidate
92 // _dependency_context_addr if it relocates the holder
93 SafepointStateTracker _safepoint_tracker;
94
95 DependencyContext(nmethodBucket* volatile* bucket_addr, volatile uint64_t* last_cleanup_addr)
96 : _dependency_context_addr(bucket_addr),
97 _last_cleanup_addr(last_cleanup_addr),
98 _safepoint_tracker(SafepointSynchronize::safepoint_state_tracker()) {}
99
100 ~DependencyContext() {
101 assert(!_safepoint_tracker.safepoint_state_changed(), "must be the same safepoint");
102 }
103 #else
104 DependencyContext(nmethodBucket* volatile* bucket_addr, volatile uint64_t* last_cleanup_addr)
105 : _dependency_context_addr(bucket_addr),
106 _last_cleanup_addr(last_cleanup_addr) {}
107 #endif // ASSERT
108
109 static void init();
110
111 void mark_dependent_nmethods(DeoptimizationScope* deopt_scope, DepChange& changes);
112 void add_dependent_nmethod(nmethod* nm);
113 void remove_all_dependents();
114 void clean_unloading_dependents();
115 static void purge_dependency_contexts();
116 static void release(nmethodBucket* b);
117 static void cleaning_start();
118 static void cleaning_end();
119
120 #ifndef PRODUCT
121 void print_dependent_nmethods(bool verbose);
122 bool is_empty();
123 #endif //PRODUCT
124 bool is_dependent_nmethod(nmethod* nm);
125 };
126 #endif // SHARE_CODE_DEPENDENCYCONTEXT_HPP
|
91 // Safepoints are forbidden during DC lifetime. GC can invalidate
92 // _dependency_context_addr if it relocates the holder
93 SafepointStateTracker _safepoint_tracker;
94
95 DependencyContext(nmethodBucket* volatile* bucket_addr, volatile uint64_t* last_cleanup_addr)
96 : _dependency_context_addr(bucket_addr),
97 _last_cleanup_addr(last_cleanup_addr),
98 _safepoint_tracker(SafepointSynchronize::safepoint_state_tracker()) {}
99
100 ~DependencyContext() {
101 assert(!_safepoint_tracker.safepoint_state_changed(), "must be the same safepoint");
102 }
103 #else
104 DependencyContext(nmethodBucket* volatile* bucket_addr, volatile uint64_t* last_cleanup_addr)
105 : _dependency_context_addr(bucket_addr),
106 _last_cleanup_addr(last_cleanup_addr) {}
107 #endif // ASSERT
108
109 static void init();
110
111 void mark_dependent_nmethods(DeoptimizationScope* deopt_scope, DepChange& changes, InstanceKlass* context = nullptr);
112 void add_dependent_nmethod(nmethod* nm);
113 void remove_all_dependents();
114 void clean_unloading_dependents();
115 static void purge_dependency_contexts();
116 static void release(nmethodBucket* b);
117 static void cleaning_start();
118 static void cleaning_end();
119
120 #ifndef PRODUCT
121 void print_dependent_nmethods(bool verbose);
122 bool is_empty();
123 #endif //PRODUCT
124 bool is_dependent_nmethod(nmethod* nm);
125 };
126 #endif // SHARE_CODE_DEPENDENCYCONTEXT_HPP
|