From 0f14ff966a74e35f771da2f26112a1145bf092cc Mon Sep 17 00:00:00 2001
From: "raphael.bach" <raphael.bach@etu.hesge.ch>
Date: Wed, 22 Jun 2022 23:59:24 +0200
Subject: [PATCH] Add `fmpi_futhark_get_data_sync()`

---
 include/internal/fmpi_futhark.h               |  7 ++++
 .../internal/generic/fmpi_futhark_generic.h   |  3 ++
 src/fmpi_futhark.c                            | 41 +++++++++++++++++++
 3 files changed, 51 insertions(+)

diff --git a/include/internal/fmpi_futhark.h b/include/internal/fmpi_futhark.h
index f96d0e2..99673c4 100644
--- a/include/internal/fmpi_futhark.h
+++ b/include/internal/fmpi_futhark.h
@@ -132,6 +132,13 @@ void * fmpi_futhark_new_data(
     const struct fmpi_futhark_ctx * ctx, const void * data,
     enum fmpi_type_base type, size_t dim_cnt, size_t x, size_t y, size_t z
 );
+/*------------------------------------------------------------------------------
+    fmpi_futhark_get_data_sync()
+------------------------------------------------------------------------------*/
+void * fmpi_futhark_get_data_sync(
+    const struct fmpi_futhark_ctx * ctx, void * in, void * out,
+    enum fmpi_type_base type, size_t dim_cnt
+);
 /*==============================================================================
    MACRO
 ==============================================================================*/
diff --git a/include/internal/generic/fmpi_futhark_generic.h b/include/internal/generic/fmpi_futhark_generic.h
index cfecb3b..266a52b 100644
--- a/include/internal/generic/fmpi_futhark_generic.h
+++ b/include/internal/generic/fmpi_futhark_generic.h
@@ -69,6 +69,9 @@ void * fmpi_futhark_new_##D##d_##T( \
 ); \
 void fmpi_futhark_free_##D##d_##T( \
     const struct fmpi_futhark_ctx * ctx, void * array \
+); \
+int fmpi_futhark_values_##D##d_##T( \
+    const struct fmpi_futhark_ctx * ctx, void * in, void * out \
 )
 
 FMPI_DECLARE_FUNCS_DT(FMPI_FUTHARK_DECLARATION, 1, FMPI_FUTHARK_TYPES);
diff --git a/src/fmpi_futhark.c b/src/fmpi_futhark.c
index a76aeb3..112a8ea 100644
--- a/src/fmpi_futhark.c
+++ b/src/fmpi_futhark.c
@@ -44,6 +44,15 @@ static const fmpi_futhark_new_data_func fmpi_futhark_new_data_func_list[] = {
    FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 2),
    FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 3)
 };
+
+typedef int (*fmpi_futhark_get_data_func)(
+    const struct fmpi_futhark_ctx * ctx, void * in, void * out
+);
+static const fmpi_futhark_get_data_func fmpi_futhark_get_data_func_list[] = {
+    FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 1),
+    FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 2),
+    FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 3)
+};
 /*==============================================================================
     MACRO
 ==============================================================================*/
@@ -151,6 +160,29 @@ void * fmpi_futhark_new_data(
     const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type);
     return fmpi_futhark_new_data_func_list[idx](ctx, data, x, y, z);
 }
+/*------------------------------------------------------------------------------
+    fmpi_futhark_get_data()
+------------------------------------------------------------------------------*/
+void * fmpi_futhark_get_data_sync(
+    const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out,
+    const enum fmpi_type_base type, const size_t dim_cnt
+){
+    assert(ctx != NULL);
+    assert(in != NULL);
+    assert(out != NULL);
+    assert(dim_cnt <= FMPI_DIM_MAX);
+    const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type);
+    const int err = fmpi_futhark_get_data_func_list[idx](ctx, in, out);
+    if(err != FUTHARK_SUCCESS) {
+        FMPI_RAISE_FUTHARK_ERROR(ctx, "futhark_values_##T##_##D##d() failed!");
+        return NULL;
+    }
+    fmpi_futhark_sync(ctx);
+    if(fmpi_futhark_check_error(ctx, "futhark_values_##T##_##D##d") == true) {
+        return NULL;
+    }
+    return out;
+}
 
 #define FMPI_FUTHARK_DEFINITION(D, T) \
 void * fmpi_futhark_new_##D##d_##T( \
@@ -178,6 +210,15 @@ void fmpi_futhark_free_##D##d_##T( \
     if(err != 0) { \
         fmpi_futhark_check_error(ctx, CPL_STRINGIFY(futhark_free_##T##_##D##d)); \
     } \
+} \
+int fmpi_futhark_values_##D##d_##T( \
+    const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out \
+){ \
+    _Static_assert((D) <= FMPI_DIM_MAX, ""); \
+    assert(ctx != NULL); \
+    assert(in != NULL); \
+    assert(out != NULL); \
+    return futhark_values_##T##_##D##d(ctx->ctx, in, out); \
 }
 
 FMPI_DEFINE_FUNCS_DT(FMPI_FUTHARK_DEFINITION, 1, FMPI_FUTHARK_TYPES)
-- 
GitLab