summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-05-16 14:33:45 +0200
committerAnton Khirnov <anton@khirnov.net>2019-05-16 14:33:45 +0200
commite064b250449ea94ee34ed8f92252a6a846c20d15 (patch)
tree16948a83a9ac7b38008866010eb6f67e65b83056
parent1618ce8e5e8b5739d5e8f70dc2aced1288287526 (diff)
Allow the caller to supply the threadpool.
-rw-r--r--libmg2d.v2
-rw-r--r--mg2d.c16
-rw-r--r--mg2d.h4
3 files changed, 17 insertions, 5 deletions
diff --git a/libmg2d.v b/libmg2d.v
index b4901a6..5c9f863 100644
--- a/libmg2d.v
+++ b/libmg2d.v
@@ -1,4 +1,4 @@
-LIBMG2D_12 {
+LIBMG2D_13 {
global: mg2d_*;
local: *;
};
diff --git a/mg2d.c b/mg2d.c
index 5f2ce22..268613f 100644
--- a/mg2d.c
+++ b/mg2d.c
@@ -64,11 +64,13 @@ struct MG2DInternal {
MG2DLogger logger;
TPContext *tp;
+ TPContext *tp_internal;
MG2DLevel *root;
NDArray *u;
NDArray *rhs;
+
NDArray *diff_coeffs[MG2D_DIFF_COEFF_NB];
GridTransferContext *transfer_init;
@@ -471,9 +473,14 @@ static int threadpool_init(MG2DContext *ctx)
MG2DInternal *priv = ctx->priv;
int ret;
- ret = tp_init(&priv->tp, ctx->nb_threads);
- if (ret < 0)
- return ret;
+ if (ctx->tp) {
+ priv->tp = ctx->tp;
+ } else {
+ ret = tp_init(&priv->tp_internal, ctx->nb_threads);
+ if (ret < 0)
+ return ret;
+ priv->tp = priv->tp_internal;
+ }
return 0;
}
@@ -755,7 +762,8 @@ void mg2d_solver_free(MG2DContext **pctx)
for (int i = 0; i < ARRAY_ELEMS(ctx->boundaries); i++)
mg2di_bc_free(&ctx->boundaries[i]);
- tp_free(&ctx->priv->tp);
+ if (ctx->priv->tp_internal)
+ tp_free(&ctx->priv->tp_internal);
mg2di_gt_free(&ctx->priv->transfer_init);
diff --git a/mg2d.h b/mg2d.h
index fd11906..f6439c0 100644
--- a/mg2d.h
+++ b/mg2d.h
@@ -22,6 +22,8 @@
#include <stddef.h>
#include <stdint.h>
+#include <threadpool.h>
+
#include "mg2d_boundary.h"
#include "mg2d_constants.h"
@@ -160,6 +162,8 @@ typedef struct MG2DContext {
* exact solve is performed.
*/
size_t max_exact_size;
+
+ TPContext *tp;
} MG2DContext;
/**