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