Last active
October 1, 2021 11:53
-
-
Save niyarin/d01897e282a7aab415a36f58f4d4739f to your computer and use it in GitHub Desktop.
EphemeronのGC疑似コード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(DEFINE ephemeron-queue '()) | |
(DEFINE (trace-pointer-queueing-ephemerons obj) | |
(UNLESS (MARKED? obj) | |
(MARK-OBJECT! obj) | |
(IF (EPHEMERON? obj) | |
(PUSH! ephemeron-queue obj) | |
(FOR-EACH trace-pointer-queueing-ephemerons | |
(REF-POINTERS obj))))) | |
(DEFINE (trace-pointer obj) | |
(UNLESS (MARKED? obj) | |
(MARK-OBJECT! obj) | |
(FOR-EACH trace-pointer | |
(REF-POINTERS obj)))) | |
(DEFINE (mark-phase1) | |
(FOR-EACH trace-pointer-queueing-ephemerons roots)) | |
(DEFINE (mark-phase2) | |
(LET ((reachable-properties | |
(FILTER EPHEMERON-KEY-MARKED? ephemeron-queue))) | |
(UNLESS (NULL? reachable-properties) | |
(SET! ephemeron-queue | |
(REMOVE EPHEMERON-KEY-MARKED? ephemeron-queue)) | |
(FOR-EACH (LAMBDA (ephemeron) | |
(trace-pointer-queueing-ephemerons | |
(EPHEMERON-VALUE ephemeron))) | |
reachable-properties) | |
(mark-phase2)))) | |
(DEFINE (mark-phase3) | |
(FOR-EACH (LAMBDA (ephemeron) | |
(SIGNAL ephemeron 'ALMOST-COLLECTABLE) | |
(trace-pointer (EPHEMERON-KEY ephemeron)) | |
(trace-pointer (EPHEMERON-VALUE ephemeron))) | |
ephemeron-queue)) | |
(DEFINE (garbage-collect-mark) | |
(mark-phase1) | |
(mark-phase2) | |
(mark-phase3)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment