This source file includes following definitions.
- ADIOI_Info_print_keyvals
- find_file
- file_to_info_all
- ADIOI_process_system_hints
- ADIOI_incorporate_system_hints
1
2
3
4
5
6
7
8 #include <adio.h>
9
10 #include <stdio.h>
11
12 #ifdef HAVE_FCNTL_H
13 #include <fcntl.h>
14 #endif
15 #ifdef HAVE_SYS_TYPES_H
16 #include <sys/types.h>
17 #endif
18 #ifdef HAVE_STDLIB_H
19 #include <stdlib.h>
20 #endif
21 #ifdef HAVE_STRING_H
22 #include <string.h>
23 #endif
24 #ifdef HAVE_UNISTD_H
25 #include <unistd.h>
26 #endif
27 #ifdef HAVE_IO_H
28 #include <io.h>
29 #endif
30
31
32
33 #define ROMIO_HINT_DEFAULT_CFG "/etc/romio-hints"
34 #define ROMIO_HINT_ENV_VAR "ROMIO_HINTS"
35
36
37
38 void ADIOI_Info_print_keyvals(MPI_Info info)
39 {
40 int i, nkeys, flag;
41 char key[MPI_MAX_INFO_KEY+1];
42 char value[MPI_MAX_INFO_VAL+1];
43
44 if (info == MPI_INFO_NULL)
45 return;
46
47 MPI_Info_get_nkeys(info, &nkeys);
48
49 for (i=0; i<nkeys; i++) {
50 MPI_Info_get_nthkey(info, i, key);
51 ADIOI_Info_get(info, key, MPI_MAX_INFO_VAL, value, &flag);
52 printf("key = %-25s value = %-10s\n", key, value);
53 }
54 return;
55 }
56
57
58
59
60
61 static int find_file(void)
62 {
63 int fd=-1;
64 char * hintfile;
65
66 hintfile = getenv(ROMIO_HINT_ENV_VAR);
67 if(hintfile)
68 fd = open(hintfile, O_RDONLY);
69 if (fd < 0 )
70 fd = open(ROMIO_HINT_DEFAULT_CFG, O_RDONLY);
71
72 return fd;
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 static int file_to_info_all(int fd, MPI_Info info, int rank, MPI_Comm comm)
89 {
90 char *buffer, *token, *key, *val, *garbage;
91 char *pos1=NULL, *pos2=NULL;
92 int flag;
93 ssize_t ret;
94 int valuelen;
95
96
97 #define HINTFILE_MAX_SIZE 1024*4
98 buffer = (char *)ADIOI_Calloc(HINTFILE_MAX_SIZE, sizeof (char));
99
100 if (rank == 0) {
101 ret = read(fd, buffer, HINTFILE_MAX_SIZE);
102
103
104 if (ret == -1)
105 buffer[0] = '\0';
106 }
107 MPI_Bcast(buffer, HINTFILE_MAX_SIZE, MPI_BYTE, 0, comm);
108
109 token = strtok_r(buffer, "\n", &pos1);
110 if (token == NULL)
111 goto fn_exit;
112 do {
113 if ( (key = strtok_r(token, " \t", &pos2)) == NULL)
114
115 continue;
116 if (token[0] == '#')
117
118 continue;
119 if ( (val = strtok_r(NULL, " \t", &pos2)) == NULL)
120
121 continue;
122 if ( (garbage = strtok_r(NULL, " \t", &pos2)) != NULL)
123
124 continue;
125
126 #ifdef SYSHINT_DEBUG
127 printf("found: key=%s val=%s\n", key, val);
128 #endif
129
130
131 ADIOI_Info_get_valuelen(info, key, &valuelen, &flag);
132 if (flag == 1) continue;
133 ADIOI_Info_set(info, key, val);
134 } while ((token = strtok_r(NULL, "\n", &pos1)) != NULL);
135
136 fn_exit:
137 ADIOI_Free(buffer);
138 return 0;
139 }
140
141 void ADIOI_process_system_hints(ADIO_File fd, MPI_Info info)
142 {
143 int hintfd=-1, rank;
144
145 MPI_Comm_rank(fd->comm, &rank);
146 if (rank == 0) {
147 hintfd = find_file();
148 }
149
150 file_to_info_all(hintfd, info, rank, fd->comm);
151
152 if (hintfd != -1)
153 close(hintfd);
154 }
155
156
157
158 void ADIOI_incorporate_system_hints(MPI_Info info,
159 MPI_Info sysinfo,
160 MPI_Info *new_info)
161 {
162 int i, nkeys_sysinfo, nkeys_info=0, flag=0;
163 int valuelen;
164
165 char val[MPI_MAX_INFO_VAL+1], key[MPI_MAX_INFO_KEY+1];
166
167 if (sysinfo == MPI_INFO_NULL)
168 nkeys_sysinfo = 0;
169 else
170 MPI_Info_get_nkeys(sysinfo, &nkeys_sysinfo);
171
172
173 if (info == MPI_INFO_NULL && nkeys_sysinfo == 0) {
174 *new_info = MPI_INFO_NULL;
175 return;
176 }
177
178 if (info == MPI_INFO_NULL)
179 MPI_Info_create(new_info);
180 else {
181
182
183
184 MPI_Info_get_nkeys(info, &nkeys_info);
185 MPI_Info_dup(info, new_info);
186 }
187
188 for (i=0; i<nkeys_sysinfo; i++) {
189 MPI_Info_get_nthkey(sysinfo, i, key);
190
191 if (info != MPI_INFO_NULL && nkeys_info)
192 ADIOI_Info_get_valuelen(info, key, &valuelen, &flag);
193 if (flag == 1) continue;
194 ADIOI_Info_get(sysinfo, key, MPI_MAX_INFO_VAL, val, &flag);
195 ADIOI_Info_set(*new_info, key, val);
196 flag = 0;
197 }
198
199 return;
200 }
201
202