Push on the abandoned list.
| 1153 | |
| 1154 | // Push on the abandoned list. |
| 1155 | static void mi_abandoned_push(mi_segment_t* segment) { |
| 1156 | mi_assert_internal(segment->thread_id == 0); |
| 1157 | mi_assert_internal(mi_atomic_load_ptr_relaxed(mi_segment_t, &segment->abandoned_next) == NULL); |
| 1158 | mi_assert_internal(segment->next == NULL); |
| 1159 | mi_assert_internal(segment->used > 0); |
| 1160 | mi_tagged_segment_t next; |
| 1161 | mi_tagged_segment_t ts = mi_atomic_load_relaxed(&abandoned); |
| 1162 | do { |
| 1163 | mi_atomic_store_ptr_release(mi_segment_t, &segment->abandoned_next, mi_tagged_segment_ptr(ts)); |
| 1164 | next = mi_tagged_segment(segment, ts); |
| 1165 | } while (!mi_atomic_cas_weak_release(&abandoned, &ts, next)); |
| 1166 | mi_atomic_increment_relaxed(&abandoned_count); |
| 1167 | } |
| 1168 | |
| 1169 | // Wait until there are no more pending reads on segments that used to be in the abandoned list |
| 1170 | // called for example from `arena.c` before decommitting |
no test coverage detected