13
13
14
14
struct objspace {
15
15
size_t gc_count ;
16
+ size_t total_gc_time ;
16
17
size_t total_allocated_objects ;
17
18
18
19
st_table * id_to_obj_tbl ;
@@ -134,6 +135,9 @@ rb_mmtk_block_for_gc(MMTk_VMMutatorThread mutator)
134
135
else {
135
136
objspace -> gc_count ++ ;
136
137
138
+ struct timespec gc_start_time ;
139
+ clock_gettime (CLOCK_MONOTONIC , & gc_start_time );
140
+
137
141
int lock_lev = rb_gc_vm_lock ();
138
142
rb_gc_vm_barrier ();
139
143
@@ -151,6 +155,13 @@ rb_mmtk_block_for_gc(MMTk_VMMutatorThread mutator)
151
155
mutator -> execution_context = NULL ;
152
156
153
157
rb_gc_vm_unlock (lock_lev );
158
+
159
+ struct timespec gc_end_time ;
160
+ clock_gettime (CLOCK_MONOTONIC , & gc_end_time );
161
+
162
+ objspace -> total_gc_time +=
163
+ (gc_end_time .tv_sec - gc_start_time .tv_sec ) * (1000 * 1000 * 1000 ) +
164
+ (gc_end_time .tv_nsec - gc_start_time .tv_nsec );
154
165
}
155
166
156
167
if ((err = pthread_mutex_unlock (& objspace -> mutex )) != 0 ) {
@@ -1076,6 +1087,7 @@ VALUE rb_gc_impl_latest_gc_info(void *objspace_ptr, VALUE key) { }
1076
1087
1077
1088
enum gc_stat_sym {
1078
1089
gc_stat_sym_count ,
1090
+ gc_stat_sym_time ,
1079
1091
gc_stat_sym_total_allocated_objects ,
1080
1092
gc_stat_sym_total_bytes ,
1081
1093
gc_stat_sym_used_bytes ,
@@ -1093,6 +1105,7 @@ setup_gc_stat_symbols(void)
1093
1105
if (gc_stat_symbols [0 ] == 0 ) {
1094
1106
#define S (s ) gc_stat_symbols[gc_stat_sym_##s] = ID2SYM(rb_intern_const(#s))
1095
1107
S (count );
1108
+ S (time );
1096
1109
S (total_allocated_objects );
1097
1110
S (total_bytes );
1098
1111
S (used_bytes );
@@ -1127,6 +1140,7 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym)
1127
1140
rb_hash_aset(hash, gc_stat_symbols[gc_stat_sym_##name], SIZET2NUM(attr));
1128
1141
1129
1142
SET (count , objspace -> gc_count );
1143
+ SET (time , objspace -> total_gc_time / (1000 * 1000 ));
1130
1144
SET (total_allocated_objects , objspace -> total_allocated_objects );
1131
1145
SET (total_bytes , mmtk_total_bytes ());
1132
1146
SET (used_bytes , mmtk_used_bytes ());
0 commit comments