From ccfafcb2fcc8bccf753e5ffb61f116ad5eb1ab6e Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <gonnet@google.com>
Date: Fri, 28 Jul 2017 18:13:11 +0200
Subject: [PATCH] add cell_set_super_mapper.

---
 src/cell.c   | 7 +++++++
 src/cell.h   | 1 +
 src/engine.c | 3 ++-
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/cell.c b/src/cell.c
index 7edee4d9ae..7572ffa661 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -1889,6 +1889,13 @@ void cell_set_super(struct cell *c, struct cell *super) {
       if (c->progeny[k] != NULL) cell_set_super(c->progeny[k], super);
 }
 
+void cell_set_super_mapper(void *map_data, int num_elements, void *extra_data) {
+  for (int ind = 0; ind < num_elements; ind++) {
+    struct cell *c = &((struct cell *)map_data)[ind];
+    cell_set_super(c, NULL);
+  }
+}
+
 /**
  * @brief Recursively drifts the #part in a cell hierarchy.
  *
diff --git a/src/cell.h b/src/cell.h
index ef887d10e6..320e226a7f 100644
--- a/src/cell.h
+++ b/src/cell.h
@@ -404,6 +404,7 @@ void cell_activate_subcell_tasks(struct cell *ci, struct cell *cj,
 void cell_activate_drift_part(struct cell *c, struct scheduler *s);
 void cell_activate_sorts(struct cell *c, int sid, struct scheduler *s);
 void cell_clear_drift_flags(struct cell *c, void *data);
+void cell_set_super_mapper(void *map_data, int num_elements, void *extra_data);
 
 /* Inlined functions (for speed). */
 
diff --git a/src/engine.c b/src/engine.c
index 5cd1857c56..287498f8ab 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -2506,7 +2506,8 @@ void engine_maketasks(struct engine *e) {
 
   /* Now that the self/pair tasks are at the right level, set the super
    * pointers. */
-  for (int k = 0; k < nr_cells; k++) cell_set_super(&cells[k], NULL);
+  threadpool_map(&e->threadpool, cell_set_super_mapper, cells, nr_cells,
+                 sizeof(struct cell), 0, NULL);
 
   /* Append hierarchical tasks to each cell. */
   for (int k = 0; k < nr_cells; k++)
-- 
GitLab