| 31 | |
| 32 | Tasks: |
| 33 | |
| 34 | * Create branch |
| 35 | * Copy mark/sweep implementation into a new file (gc_sf.c, perhaps) |
| 36 | * Change function names, especially in GC struct, in the new file |
| 37 | * Add the pointers for the new lists to the SF GC struct |
| 38 | * Change arena allocation to allocate space for each list in each new arena (because a GCable can only be on one list at a time, we need two pointers worth of data for each GCable -- allocating this in one chunk at the start of the arena makes them relatively contiguous in memory, so it should fit in the cache much better). Let's call this a GC_LL struct. |
| 39 | * Add a function to calculate the correct GC_LL struct for any given GCable, given a pointer to the GCable (this isn't trivial, but it can be cheap) |
| 40 | * Change the get_free_header function in gc_sf.c to put the freshly-allocated header on the MAYBE list |
| 41 | * Change the mark functions to splice a given GCable out of its current list and into the LIVE list |
| 42 | * Change the beginning of mark function in gc_sf.c to point to a new MAYBE list |
| 43 | * Change the end of mark function in gc_sf.c to append the MAYBE list to the FREE list (or prepend?) |
| 44 | * Change the "get a new free header" function to perform any active destruction (though for an optimization, if a PMC header already has sufficient PMC_data space allocated, it's unnecessary to free it) |
| 45 | * Add a configuration option to enable the new sweep-free GC |
| 46 | * Fix bugs |