Skip to content

Commit 9123d92

Browse files
Merge pull request #763 from sourceryinstitute/issue-762
Issue 762
2 parents dfde1b9 + 9d4afcb commit 9123d92

File tree

4 files changed

+32
-9
lines changed

4 files changed

+32
-9
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,7 @@ if(opencoarrays_aware_compiler)
925925
endif()
926926

927927
add_caf_test(issue-700-allow-multiple-scalar-dim-array-gets 2 issue-700-allow-multiple-scalar-dim-array-gets)
928+
add_caf_test(issue-762-mpi-crashing-on-exit 2 issue-762-mpi-crashing-on-exit)
928929

929930
# IMAGE FAIL tests
930931
if(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0.0)

src/runtime-libraries/mpi/mpi_caf.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,14 +1034,17 @@ finalize_internal(int status_code)
10341034
while (cur_stok)
10351035
{
10361036
prev_stok = cur_stok->prev;
1037-
ierr = MPI_Win_detach(global_dynamic_win, cur_stok); chk_err(ierr);
1037+
dprint("freeing slave token %p for memory %p", cur_stok->token, cur_stok->token->memptr);
1038+
ierr = MPI_Win_detach(global_dynamic_win, cur_stok->token); chk_err(ierr);
10381039
if (cur_stok->token->memptr)
10391040
{
10401041
ierr = MPI_Win_detach(global_dynamic_win, cur_stok->token->memptr);
10411042
chk_err(ierr);
1042-
free(cur_stok->token->memptr);
1043+
ierr = MPI_Free_mem(cur_stok->token->memptr);
1044+
chk_err(ierr);
10431045
}
1044-
free(cur_stok->token);
1046+
ierr = MPI_Free_mem(cur_stok->token);
1047+
chk_err(ierr);
10451048
free(cur_stok);
10461049
cur_stok = prev_stok;
10471050
}
@@ -1064,10 +1067,13 @@ finalize_internal(int status_code)
10641067
#ifdef GCC_GE_7
10651068
/* Unregister the window to the descriptors when freeing the token. */
10661069
dprint("MPI_Win_free(%p)\n", p);
1067-
ierr = MPI_Win_free(p); chk_err(ierr);
1068-
free(cur_tok->token);
1070+
ierr = MPI_Win_free(p);
1071+
chk_err(ierr);
1072+
ierr = MPI_Free_mem(cur_tok->token);
1073+
chk_err(ierr);
10691074
#else // GCC_GE_7
1070-
ierr = MPI_Win_free(p); chk_err(ierr);
1075+
ierr = MPI_Win_free(p);
1076+
chk_err(ierr);
10711077
#endif // GCC_GE_7
10721078
free(cur_tok);
10731079
cur_tok = prev;
@@ -1213,7 +1219,7 @@ PREFIX(register) (size_t size, caf_register_t type, caf_token_t *token,
12131219
struct caf_allocated_slave_tokens_t *tmp =
12141220
malloc(sizeof(struct caf_allocated_slave_tokens_t));
12151221
tmp->prev = caf_allocated_slave_tokens;
1216-
tmp->token = *token;
1222+
tmp->token = slave_token;
12171223
caf_allocated_slave_tokens = tmp;
12181224
}
12191225
else // (type == CAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY)
@@ -1528,7 +1534,8 @@ PREFIX(deregister) (caf_token_t *token, int *stat, char *errmsg,
15281534
{
15291535
ierr = MPI_Win_detach(global_dynamic_win, slave_token->memptr);
15301536
chk_err(ierr);
1531-
free(slave_token->memptr);
1537+
ierr = MPI_Free_mem(slave_token->memptr);
1538+
chk_err(ierr);
15321539
slave_token->memptr = NULL;
15331540
if (type == CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY)
15341541
{
@@ -1545,7 +1552,8 @@ PREFIX(deregister) (caf_token_t *token, int *stat, char *errmsg,
15451552
caf_allocated_slave_tokens = prev_stok;
15461553

15471554
free(cur_stok);
1548-
free(*token);
1555+
ierr = MPI_Free_mem(*token);
1556+
chk_err(ierr);
15491557
return;
15501558
}
15511559

src/tests/regression/reported/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ caf_compile_executable(issue-700-allow-multiple-scalar-dim-array-gets issue-700-
1616
if (gfortran_compiler AND (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0.0))
1717
caf_compile_executable(issue-515-mimic-mpi-gatherv issue-515-mimic-mpi-gatherv.f90)
1818
endif()
19+
caf_compile_executable(issue-762-mpi-crashing-on-exit issue-762-mpi-crashing-on-exit.f90)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
program hello_coarrays
2+
implicit none
3+
type :: array_type
4+
integer, allocatable :: values(:)
5+
end type
6+
type(array_type) :: array[*]
7+
allocate(array%values(2), source=0)
8+
array%values = this_image()
9+
if (all(array%values(:) .EQ. this_image())) then
10+
print *,"Test passed."
11+
end if
12+
end program
13+

0 commit comments

Comments
 (0)