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