@@ -101,13 +101,6 @@ void TrainingData::initialize() {
101
101
TrainingDataLocker::initialize ();
102
102
}
103
103
if (have_data ()) {
104
- // Initialize dependency tracking
105
- training_data_set ()->iterate_all ([](const Key* k, TrainingData* td) {
106
- if (td->is_MethodTrainingData ()) {
107
- td->as_MethodTrainingData ()->initialize_deps_tracking ();
108
- }
109
- });
110
-
111
104
if (_recompilation_schedule != nullptr && _recompilation_schedule->length () > 0 ) {
112
105
const int size = _recompilation_schedule->length ();
113
106
_recompilation_status = NEW_C_HEAP_ARRAY (bool , size, mtCompiler);
@@ -118,6 +111,17 @@ void TrainingData::initialize() {
118
111
}
119
112
}
120
113
114
+ void TrainingData::verify () {
115
+ if (TrainingData::have_data ()) {
116
+ archived_training_data_dictionary ()->iterate([&](TrainingData* td) {
117
+ if (td->is_MethodTrainingData ()) {
118
+ td->as_MethodTrainingData ()->verify ();
119
+ }
120
+ });
121
+ }
122
+ }
123
+
124
+
121
125
TrainingData::Key::Key (const KlassTrainingData* klass, Symbol* method_name, Symbol* signature)
122
126
: Key(method_name, signature, klass) {}
123
127
@@ -278,7 +282,27 @@ void CompileTrainingData::dec_init_deps_left(KlassTrainingData* ktd) {
278
282
assert (_init_deps.contains (ktd), " " );
279
283
assert (_init_deps_left > 0 , " " );
280
284
281
- Atomic::sub (&_init_deps_left, 1 );
285
+ uint init_deps_left1 = Atomic::sub (&_init_deps_left, 1 );
286
+
287
+ if (log .is_enabled ()) {
288
+ uint init_deps_left2 = compute_init_deps_left ();
289
+ log .print (" init_deps_left: %d (%d)" , init_deps_left1, init_deps_left2);
290
+ ktd->print_on (&log , true );
291
+ }
292
+ }
293
+
294
+ uint CompileTrainingData::compute_init_deps_left (bool count_initialized) {
295
+ int left = 0 ;
296
+ for (int i = 0 ; i < _init_deps.length (); i++) {
297
+ KlassTrainingData* ktd = _init_deps.at (i);
298
+ // Ignore symbolic refs and already initialized classes (unless explicitly requested).
299
+ if (ktd->has_holder ()) {
300
+ if (!ktd->holder ()->is_initialized () || count_initialized) {
301
+ ++left;
302
+ }
303
+ }
304
+ }
305
+ return left;
282
306
}
283
307
284
308
void CompileTrainingData::print_on (outputStream* st, bool name_only) const {
@@ -1037,18 +1061,19 @@ void MethodTrainingData::restore_unshareable_info(TRAPS) {
1037
1061
if (_final_profile != nullptr ) {
1038
1062
_final_profile->restore_unshareable_info (CHECK);
1039
1063
}
1040
- initialize_deps_tracking ();
1041
1064
}
1042
1065
1043
1066
void CompileTrainingData::remove_unshareable_info () {
1044
1067
TrainingData::remove_unshareable_info ();
1045
1068
_init_deps.remove_unshareable_info ();
1046
1069
_ci_records.remove_unshareable_info ();
1070
+ _init_deps_left = compute_init_deps_left (true );
1047
1071
}
1048
1072
1049
1073
void CompileTrainingData::restore_unshareable_info (TRAPS) {
1050
1074
TrainingData::restore_unshareable_info (CHECK);
1051
1075
_init_deps.restore_unshareable_info (CHECK);
1052
1076
_ci_records.restore_unshareable_info (CHECK);
1077
+ guarantee (_init_deps_left == (int )compute_init_deps_left (), " mismatch" );
1053
1078
}
1054
1079
#endif // INCLUDE_CDS
0 commit comments