diff options
author | Anton Khirnov <anton@khirnov.net> | 2019-05-16 14:33:45 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2019-05-16 14:33:45 +0200 |
commit | e064b250449ea94ee34ed8f92252a6a846c20d15 (patch) | |
tree | 16948a83a9ac7b38008866010eb6f67e65b83056 | |
parent | 1618ce8e5e8b5739d5e8f70dc2aced1288287526 (diff) |
Allow the caller to supply the threadpool.
-rw-r--r-- | libmg2d.v | 2 | ||||
-rw-r--r-- | mg2d.c | 16 | ||||
-rw-r--r-- | mg2d.h | 4 |
3 files changed, 17 insertions, 5 deletions
@@ -1,4 +1,4 @@ -LIBMG2D_12 { +LIBMG2D_13 { global: mg2d_*; local: *; }; @@ -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); @@ -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; /** |