summaryrefslogtreecommitdiff
path: root/rts/Linker.c
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-09-11 06:16:18 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-09-18 15:56:25 -0400
commit40dc91069d15bfc1d81f1722b39e06cac8fdddd1 (patch)
tree35dddbae6594e1db99802ed08ddd2b1ee4e92afe /rts/Linker.c
parentc492134912e5270180881b7345ee86dc32756bdd (diff)
downloadhaskell-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.c18
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