This source file includes following definitions.
- ADIOI_FAILSAFE_OpenColl
1
2
3
4
5
6
7
8 #include "adio.h"
9
10
11
12
13
14
15 void ADIOI_FAILSAFE_OpenColl(ADIO_File fd, int rank,
16 int access_mode, int *error_code)
17 {
18 MPI_Comm tmp_comm;
19 int orig_amode_excl, orig_amode_wronly;
20
21 orig_amode_excl = access_mode;
22 if ((access_mode & ADIO_CREATE) && (access_mode & ADIO_EXCL)) {
23
24
25
26
27 if(rank == fd->hints->ranklist[0]) {
28 fd->access_mode = access_mode;
29
30
31
32
33 tmp_comm = fd->comm;
34 fd->comm = MPI_COMM_SELF;
35 (*(fd->fns->ADIOI_xxx_Open))(fd, error_code);
36 MPI_Bcast(error_code, 1, MPI_INT, \
37 fd->hints->ranklist[0], tmp_comm);
38
39 if (*error_code == MPI_SUCCESS)
40 (*(fd->fns->ADIOI_xxx_Close))(fd, error_code);
41
42 fd->comm = tmp_comm;
43 }
44 else MPI_Bcast(error_code, 1, MPI_INT,
45 fd->hints->ranklist[0], fd->comm);
46 if (*error_code != MPI_SUCCESS) {
47 return;
48 }
49 else {
50
51 access_mode = access_mode ^ ADIO_EXCL;
52 }
53 }
54
55 if (fd->hints->deferred_open && !(fd->is_agg)) {
56
57
58
59 fd->access_mode = orig_amode_excl;
60 *error_code = MPI_SUCCESS;
61 return;
62 }
63
64
65
66
67
68
69 orig_amode_wronly = access_mode;
70 if (access_mode & ADIO_WRONLY) {
71 access_mode = access_mode ^ ADIO_WRONLY;
72 access_mode = access_mode | ADIO_RDWR;
73 }
74 fd->access_mode = access_mode;
75
76 (*(fd->fns->ADIOI_xxx_Open))(fd, error_code);
77
78
79
80 fd->access_mode = orig_amode_wronly;
81 if (*error_code != MPI_SUCCESS)
82 (*(fd->fns->ADIOI_xxx_Open))(fd, error_code);
83
84 if(*error_code != MPI_SUCCESS) return;
85
86 if (fd->access_mode != orig_amode_excl) fd->access_mode = orig_amode_excl;
87
88
89
90 fd->is_open = 1;
91 }
92
93
94
95
96
97