(&self)
| 201 | } |
| 202 | |
| 203 | pub(crate) fn start_cycle(&self) { |
| 204 | let pacing = self.0.pacing.get(); |
| 205 | let total_gcs = self.0.total_gcs.get(); |
| 206 | let wakeup_amount = if total_gcs == 0 { |
| 207 | // If we have no live `Gc`s, then the root cannot possibly own any data, so we should |
| 208 | // sleep for `min_sleep.` |
| 209 | pacing.min_sleep as f64 |
| 210 | } else { |
| 211 | // Estimate the amount of external memory that is remembered assuming that each Gc owns |
| 212 | // an even share of the external memory. |
| 213 | let remembered_external_size_estimate = self.0.remembered_gcs.get() as f64 |
| 214 | / total_gcs as f64 |
| 215 | * self.0.total_external_bytes.get() as f64; |
| 216 | |
| 217 | let remembered_size = |
| 218 | self.0.remembered_gc_bytes.get() as f64 + remembered_external_size_estimate; |
| 219 | |
| 220 | (remembered_size * pacing.pause_factor).max(pacing.min_sleep as f64) |
| 221 | }; |
| 222 | |
| 223 | self.0.wakeup_amount.set(wakeup_amount); |
| 224 | self.0.allocated_gc_bytes.set(0); |
| 225 | self.0.freed_gc_bytes.set(0); |
| 226 | self.0.traced_gcs.set(0); |
| 227 | self.0.traced_gc_bytes.set(0); |
| 228 | self.0.remembered_gcs.set(0); |
| 229 | self.0.remembered_gc_bytes.set(0); |
| 230 | self.0.allocated_external_bytes.set(0); |
| 231 | self.0.freed_external_bytes.set(0); |
| 232 | } |
| 233 | |
| 234 | #[inline] |
| 235 | pub(crate) fn mark_gc_allocated(&self, bytes: usize) { |
no test coverage detected