diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-09-11 06:16:18 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-09-18 15:56:25 -0400 |
commit | 40dc91069d15bfc1d81f1722b39e06cac8fdddd1 (patch) | |
tree | 35dddbae6594e1db99802ed08ddd2b1ee4e92afe /rts/Linker.c | |
parent | c492134912e5270180881b7345ee86dc32756bdd (diff) | |
download | haskell-40dc91069d15bfc1d81f1722b39e06cac8fdddd1.tar.gz |
rts: Refactor unloading of foreign export StablePtrs
Previously we would allocate a linked list cell for each foreign export.
Now we can avoid this by taking advantage of the fact that they are
already broken into groups.
Diffstat (limited to 'rts/Linker.c')
-rw-r--r-- | rts/Linker.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/rts/Linker.c b/rts/Linker.c index fa38480fb6..2d54c29196 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -1239,14 +1239,18 @@ static void freeOcStablePtrs (ObjectCode *oc) { // Release any StablePtrs that were created when this // object module was initialized. - ForeignExportStablePtr *fe_ptr, *next; + struct ForeignExportsList *exports, *next; - for (fe_ptr = oc->stable_ptrs; fe_ptr != NULL; fe_ptr = next) { - next = fe_ptr->next; - freeStablePtr(fe_ptr->stable_ptr); - stgFree(fe_ptr); + for (exports = oc->foreign_exports; exports != NULL; exports = next) { + next = exports->next; + for (int i = 0; i < exports->n_entries; i++) { + freeStablePtr(exports->stable_ptrs[i]); + } + stgFree(exports->stable_ptrs); + exports->stable_ptrs = NULL; + exports->next = NULL; } - oc->stable_ptrs = NULL; + oc->foreign_exports = NULL; } static void @@ -1404,7 +1408,7 @@ mkOc( pathchar *path, char *image, int imageSize, oc->n_segments = 0; oc->segments = NULL; oc->proddables = NULL; - oc->stable_ptrs = NULL; + oc->foreign_exports = NULL; #if defined(NEED_SYMBOL_EXTRAS) oc->symbol_extras = NULL; #endif |