Skip to content
Snippets Groups Projects
Commit 3e602a30 authored by Thomas Jahns's avatar Thomas Jahns :cartwheel:
Browse files

requests: Add optional persistence of allocation.

parent 6dbd6072
No related branches found
No related tags found
1 merge request!31Draft: Attempt at fuller exchanger interface
......@@ -91,7 +91,7 @@ typedef struct Xt_request_msgs_ *Xt_request_msgs;
struct Xt_request_msgs_ {
const struct Xt_request_vtable *vtable;
int n;
int n, auto_free;
MPI_Comm comm;
MPI_Request requests[];
};
......@@ -112,6 +112,7 @@ xt_request_msgs_alloc(int n, MPI_Comm comm, Xt_config config)
#endif
request->vtable = &request_msgs_vtable;
request->n = n;
request->auto_free = 1;
request->comm = comm;
return (Xt_request)request;
}
......@@ -153,6 +154,13 @@ xt_request_msgs_get_req_ptr(Xt_request request)
return request_msgs->requests;
}
void
xt_request_msgs_set_auto_free(Xt_request request, int auto_free)
{
Xt_request_msgs request_msgs = (Xt_request_msgs)request;
request_msgs->auto_free = auto_free;
}
static void xt_request_msgs_wait(Xt_request request) {
......@@ -170,8 +178,8 @@ static void xt_request_msgs_wait(Xt_request request) {
#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
#pragma GCC diagnostic pop
#endif
free(request_msgs);
if (request_msgs->auto_free)
free(request_msgs);
}
static int xt_request_msgs_test(Xt_request request) {
......@@ -183,7 +191,7 @@ static int xt_request_msgs_test(Xt_request request) {
int flag = xt_mpi_test_some(&(request_msgs->n), request_msgs->requests,
ops_completed_buffer, request_msgs->comm);
if (flag) free(request_msgs);
if (flag && request_msgs->auto_free) free(request_msgs);
return flag;
}
......@@ -215,7 +223,8 @@ xt_request_msgs_wait_omp(Xt_request request)
#endif
}
free(request);
if (((Xt_request_msgs)request)->auto_free)
free(request);
}
static int
......@@ -231,7 +240,7 @@ xt_request_msgs_test_omp(Xt_request request) {
flag &= xt_mpi_test_some_mt(&request_msgs->n, request_msgs->requests,
ops_completed_buffer, request_msgs->comm);
}
if (flag) free(request);
if (flag && ((Xt_request_msgs)request)->auto_free) free(request);
return flag;
}
......
......@@ -93,7 +93,7 @@ typedef struct Xt_request_msgs_ebuf_ * Xt_request_msgs_ebuf;
struct Xt_request_msgs_ebuf_ {
const struct Xt_request_vtable *vtable;
MPI_Comm comm;
int n_requests;
int n_requests, auto_free;
void (*finalizer)(Xt_request, void *);
size_t extra_buf_ofs;
MPI_Request requests[];
......@@ -126,6 +126,7 @@ xt_request_msgs_ebuf_alloc(int n_requests,
request->vtable = &request_msgs_ebuf_vtable;
request->comm = comm;
request->n_requests = n_requests;
request->auto_free = 1;
request->finalizer = no_finalizer;
request->extra_buf_ofs = ofs;
return (Xt_request)request;
......@@ -174,7 +175,8 @@ finish_requests(Xt_request_msgs_ebuf request_msgs_ebuf)
if (request_msgs_ebuf->finalizer != no_finalizer)
request_msgs_ebuf->finalizer((Xt_request)request_msgs_ebuf,
extra_buf(request_msgs_ebuf));
free(request_msgs_ebuf);
if (request_msgs_ebuf->auto_free)
free(request_msgs_ebuf);
}
static void xt_request_msgs_ebuf_wait(Xt_request request) {
......@@ -227,6 +229,19 @@ xt_request_msgs_ebuf_get_req_ptr(Xt_request request)
return request_msgs_ebuf->requests;
}
void
xt_request_msgs_ebuf_set_auto_free(Xt_request request, int auto_free)
{
Xt_request_msgs_ebuf request_msgs_ebuf = (Xt_request_msgs_ebuf)request;
#ifndef _OPENMP
assert(request->vtable == &request_msgs_ebuf_vtable);
#else
assert(request->vtable == &request_msgs_ebuf_vtable
|| request->vtable == &request_msgs_ebuf_auto_omp_vtable);
#endif
request_msgs_ebuf->auto_free = auto_free;
}
MPI_Comm
xt_request_msgs_ebuf_get_comm(Xt_request request)
{
......@@ -277,7 +292,8 @@ finish_requests_mt(Xt_request_msgs_ebuf request_msgs_ebuf)
extra_buf(request_msgs_ebuf));
#pragma omp barrier
#pragma omp master
free(request_msgs_ebuf);
if (request_msgs_ebuf->auto_free)
free(request_msgs_ebuf);
}
static void
......
......@@ -78,6 +78,14 @@ xt_request_msgs_ebuf_alloc(int n_requests,
PPM_DSO_INTERNAL MPI_Request *
xt_request_msgs_ebuf_get_req_ptr(Xt_request request);
/**
* @param[out] request xt_request_msgs_ebuf object
* @param auto_free if set to 0, deactivate automatic free call when
* all requests are finished (i.e. after wait or when test returns true)
*/
PPM_DSO_INTERNAL void
xt_request_msgs_ebuf_set_auto_free(Xt_request request, int auto_free);
PPM_DSO_INTERNAL void
xt_request_msgs_ebuf_set_finalizer(Xt_request request,
Xt_request_msgs_ebuf_finalizer finalize);
......
......@@ -75,6 +75,14 @@ xt_request_msgs_alloc(int n, MPI_Comm comm, Xt_config config);
PPM_DSO_INTERNAL MPI_Request *
xt_request_msgs_get_req_ptr(Xt_request request);
/**
* @param[out] request xt_request_msgs object
* @param auto_free if set to 0, deactivate automatic free call when
* all requests are finished (i.e. after wait or when test returns true)
*/
PPM_DSO_INTERNAL void
xt_request_msgs_set_auto_free(Xt_request request, int auto_free);
#endif
/*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment