This source file includes following definitions.
- ompi_fcoll_base_sort_iovec
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 #include "ompi_config.h"
  23 #include "base.h"
  24 #include "ompi/mca/common/ompio/common_ompio.h"
  25 
  26 
  27 int ompi_fcoll_base_sort_iovec (struct iovec *iov,
  28                            int num_entries,
  29                            int *sorted)
  30 {
  31     int i = 0;
  32     int j = 0;
  33     int left = 0;
  34     int right = 0;
  35     int largest = 0;
  36     int heap_size = num_entries - 1;
  37     int temp = 0;
  38     unsigned char done = 0;
  39     int* temp_arr = NULL;
  40 
  41     if (0 == num_entries) {
  42         return OMPI_SUCCESS;
  43     }
  44 
  45     temp_arr = (int*)malloc(num_entries*sizeof(int));
  46     if (NULL == temp_arr) {
  47         opal_output (1, "OUT OF MEMORY\n");
  48         return OMPI_ERR_OUT_OF_RESOURCE;
  49     }
  50     temp_arr[0] = 0;
  51     for (i = 1; i < num_entries; ++i) {
  52         temp_arr[i] = i;
  53     }
  54     
  55     for (i = num_entries/2-1 ; i>=0 ; i--) {
  56         done = 0;
  57         j = i;
  58         largest = j;
  59 
  60         while (!done) {
  61             left = j*2+1;
  62             right = j*2+2;
  63             if ((left <= heap_size) &&
  64                 (iov[temp_arr[left]].iov_base > iov[temp_arr[j]].iov_base)) {
  65                 largest = left;
  66             }
  67             else {
  68                 largest = j;
  69             }
  70             if ((right <= heap_size) &&
  71                 (iov[temp_arr[right]].iov_base >
  72                  iov[temp_arr[largest]].iov_base)) {
  73                 largest = right;
  74             }
  75             if (largest != j) {
  76                 temp = temp_arr[largest];
  77                 temp_arr[largest] = temp_arr[j];
  78                 temp_arr[j] = temp;
  79                 j = largest;
  80             }
  81             else {
  82                 done = 1;
  83             }
  84         }
  85     }
  86 
  87     for (i = num_entries-1; i >=1; --i) {
  88         temp = temp_arr[0];
  89         temp_arr[0] = temp_arr[i];
  90         temp_arr[i] = temp;
  91         heap_size--;
  92         done = 0;
  93         j = 0;
  94         largest = j;
  95 
  96         while (!done) {
  97             left =  j*2+1;
  98             right = j*2+2;
  99 
 100             if ((left <= heap_size) &&
 101                 (iov[temp_arr[left]].iov_base >
 102                  iov[temp_arr[j]].iov_base)) {
 103                 largest = left;
 104             }
 105             else {
 106                 largest = j;
 107             }
 108             if ((right <= heap_size) &&
 109                 (iov[temp_arr[right]].iov_base >
 110                  iov[temp_arr[largest]].iov_base)) {
 111                 largest = right;
 112             }
 113             if (largest != j) {
 114                 temp = temp_arr[largest];
 115                 temp_arr[largest] = temp_arr[j];
 116                 temp_arr[j] = temp;
 117                 j = largest;
 118             }
 119             else {
 120                 done = 1;
 121             }
 122         }
 123         sorted[i] = temp_arr[i];
 124     }
 125     sorted[0] = temp_arr[0];
 126 
 127     if (NULL != temp_arr) {
 128         free(temp_arr);
 129         temp_arr = NULL;
 130     }
 131     return OMPI_SUCCESS;
 132 }