This source file includes following definitions.
- pmix_ring_buffer_construct
- pmix_ring_buffer_destruct
- pmix_ring_buffer_init
- pmix_ring_buffer_push
- pmix_ring_buffer_pop
- pmix_ring_buffer_poke
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 #include <src/include/pmix_config.h>
  23 
  24 #include <stdlib.h>
  25 #include <stdio.h>
  26 #include <assert.h>
  27 
  28 #include "pmix_common.h"
  29 #include "src/class/pmix_ring_buffer.h"
  30 #include "src/util/output.h"
  31 
  32 static void pmix_ring_buffer_construct(pmix_ring_buffer_t *);
  33 static void pmix_ring_buffer_destruct(pmix_ring_buffer_t *);
  34 
  35 PMIX_CLASS_INSTANCE(pmix_ring_buffer_t, pmix_object_t,
  36                     pmix_ring_buffer_construct,
  37                     pmix_ring_buffer_destruct);
  38 
  39 
  40 
  41 
  42 static void pmix_ring_buffer_construct(pmix_ring_buffer_t *ring)
  43 {
  44     ring->head = 0;
  45     ring->tail = -1;
  46     ring->size = 0;
  47     ring->addr = NULL;
  48 }
  49 
  50 
  51 
  52 
  53 static void pmix_ring_buffer_destruct(pmix_ring_buffer_t *ring)
  54 {
  55     if( NULL != ring->addr) {
  56         free(ring->addr);
  57         ring->addr = NULL;
  58     }
  59 
  60     ring->size = 0;
  61 }
  62 
  63 
  64 
  65 
  66 int pmix_ring_buffer_init(pmix_ring_buffer_t* ring, int size)
  67 {
  68     
  69     if (NULL == ring) {
  70         return PMIX_ERR_BAD_PARAM;
  71     }
  72 
  73     
  74     ring->addr = (char **)calloc(size * sizeof(char*), 1);
  75     if (NULL == ring->addr) { 
  76         return PMIX_ERR_OUT_OF_RESOURCE;
  77     }
  78     ring->size = size;
  79 
  80     return PMIX_SUCCESS;
  81 }
  82 
  83 void* pmix_ring_buffer_push(pmix_ring_buffer_t *ring, void *ptr)
  84 {
  85     char *p=NULL;
  86 
  87     if (NULL != ring->addr[ring->head]) {
  88         p = (char*)ring->addr[ring->head];
  89         if (ring->tail == ring->size - 1) {
  90             ring->tail = 0;
  91         } else {
  92             ring->tail = ring->head + 1;
  93         }
  94     }
  95     ring->addr[ring->head] = (char*)ptr;
  96     if (ring->tail < 0) {
  97         ring->tail = ring->head;
  98     }
  99     if (ring->head == ring->size - 1) {
 100         ring->head = 0;
 101     } else {
 102         ring->head++;
 103     }
 104     return (void*)p;
 105 }
 106 
 107 void* pmix_ring_buffer_pop(pmix_ring_buffer_t *ring)
 108 {
 109     char *p=NULL;
 110 
 111     if (-1 == ring->tail) {
 112         
 113         p = NULL;
 114     } else {
 115         p = (char*)ring->addr[ring->tail];
 116         ring->addr[ring->tail] = NULL;
 117         if (ring->tail == ring->size-1) {
 118             ring->tail = 0;
 119         } else {
 120             ring->tail++;
 121         }
 122         
 123         if (ring->tail == ring->head) {
 124             ring->tail = -1;
 125         }
 126     }
 127     return (void*)p;
 128 }
 129 
 130  void* pmix_ring_buffer_poke(pmix_ring_buffer_t *ring, int i)
 131  {
 132     char *p=NULL;
 133     int offset;
 134 
 135     if (ring->size <= i || -1 == ring->tail) {
 136         p = NULL;
 137     } else if (i < 0) {
 138         
 139         if (ring->head == 0) {
 140             p = ring->addr[ring->size - 1];
 141         } else {
 142             p = ring->addr[ring->head - 1];
 143         }
 144     } else {
 145         
 146         offset = ring->tail + i;
 147         
 148         if (ring->size <= offset) {
 149             offset -= ring->size;
 150         }
 151         p = ring->addr[offset];
 152     }
 153     return (void*)p;
 154 }