diff options
Diffstat (limited to 'libglusterfs/src/circ-buff.c')
| -rw-r--r-- | libglusterfs/src/circ-buff.c | 294 | 
1 files changed, 143 insertions, 151 deletions
diff --git a/libglusterfs/src/circ-buff.c b/libglusterfs/src/circ-buff.c index 6259282a917..cb37ed30ea2 100644 --- a/libglusterfs/src/circ-buff.c +++ b/libglusterfs/src/circ-buff.c @@ -12,190 +12,182 @@  #include "libglusterfs-messages.h"  void -cb_destroy_data (circular_buffer_t *cb, -                 void (*destroy_buffer_data) (void *data)) +cb_destroy_data(circular_buffer_t *cb, void (*destroy_buffer_data)(void *data))  { -        if (destroy_buffer_data) -                destroy_buffer_data (cb->data); -        GF_FREE (cb->data); -        return; +    if (destroy_buffer_data) +        destroy_buffer_data(cb->data); +    GF_FREE(cb->data); +    return;  } -  /* hold lock while calling this function */  int -__cb_add_entry_buffer (buffer_t *buffer, void *item) +__cb_add_entry_buffer(buffer_t *buffer, void *item)  { -        circular_buffer_t   *ptr  = NULL; -        int    ret   = -1; -        //DO we really need the assert here? -        GF_ASSERT (buffer->used_len <= buffer->size_buffer); - -        if (buffer->use_once == _gf_true && -            buffer->used_len == buffer->size_buffer) { -                gf_msg  ("circ-buff", GF_LOG_WARNING, 0, LG_MSG_BUFFER_ERROR, -                         "buffer %p is use once buffer", buffer); -                return -1; -        } else { -                if (buffer->used_len == buffer->size_buffer) { -                        if (buffer->cb[buffer->w_index]) { -                                ptr = buffer->cb[buffer->w_index]; -                                if (ptr->data) { -                                        cb_destroy_data (ptr, -                                                   buffer->destroy_buffer_data); -                                        ptr->data = NULL; -                                        GF_FREE (ptr); -                                } -                                buffer->cb[buffer->w_index] = NULL; -                                ptr = NULL; -                        } +    circular_buffer_t *ptr = NULL; +    int ret = -1; +    // DO we really need the assert here? +    GF_ASSERT(buffer->used_len <= buffer->size_buffer); + +    if (buffer->use_once == _gf_true && +        buffer->used_len == buffer->size_buffer) { +        gf_msg("circ-buff", GF_LOG_WARNING, 0, LG_MSG_BUFFER_ERROR, +               "buffer %p is use once buffer", buffer); +        return -1; +    } else { +        if (buffer->used_len == buffer->size_buffer) { +            if (buffer->cb[buffer->w_index]) { +                ptr = buffer->cb[buffer->w_index]; +                if (ptr->data) { +                    cb_destroy_data(ptr, buffer->destroy_buffer_data); +                    ptr->data = NULL; +                    GF_FREE(ptr);                  } - -                buffer->cb[buffer->w_index] = -                        GF_CALLOC (1, sizeof (circular_buffer_t), -                                   gf_common_mt_circular_buffer_t); -                if (!buffer->cb[buffer->w_index]) -                        return -1; - -                buffer->cb[buffer->w_index]->data = item; -                ret = gettimeofday (&buffer->cb[buffer->w_index]->tv, NULL); -                if (ret == -1) -                        gf_msg_callingfn ("circ-buff", GF_LOG_WARNING, 0, -                                          LG_MSG_GETTIMEOFDAY_FAILED, -                                          "getting time of the day failed"); -                buffer->w_index++; -                buffer->w_index %= buffer->size_buffer; -                //used_buffer size cannot be greater than the total buffer size - -                if (buffer->used_len < buffer->size_buffer) -                        buffer->used_len++; -                return buffer->w_index; +                buffer->cb[buffer->w_index] = NULL; +                ptr = NULL; +            }          } + +        buffer->cb[buffer->w_index] = GF_CALLOC(1, sizeof(circular_buffer_t), +                                                gf_common_mt_circular_buffer_t); +        if (!buffer->cb[buffer->w_index]) +            return -1; + +        buffer->cb[buffer->w_index]->data = item; +        ret = gettimeofday(&buffer->cb[buffer->w_index]->tv, NULL); +        if (ret == -1) +            gf_msg_callingfn("circ-buff", GF_LOG_WARNING, 0, +                             LG_MSG_GETTIMEOFDAY_FAILED, +                             "getting time of the day failed"); +        buffer->w_index++; +        buffer->w_index %= buffer->size_buffer; +        // used_buffer size cannot be greater than the total buffer size + +        if (buffer->used_len < buffer->size_buffer) +            buffer->used_len++; +        return buffer->w_index; +    }  }  int -cb_add_entry_buffer (buffer_t *buffer, void *item) +cb_add_entry_buffer(buffer_t *buffer, void *item)  { -        int write_index = -1; +    int write_index = -1; -        pthread_mutex_lock (&buffer->lock); -        { -                write_index = __cb_add_entry_buffer (buffer, item); -        } -        pthread_mutex_unlock (&buffer->lock); +    pthread_mutex_lock(&buffer->lock); +    { +        write_index = __cb_add_entry_buffer(buffer, item); +    } +    pthread_mutex_unlock(&buffer->lock); -        return write_index; +    return write_index;  }  void -cb_buffer_show (buffer_t *buffer) +cb_buffer_show(buffer_t *buffer)  { -        pthread_mutex_lock (&buffer->lock); -        { -                gf_msg_debug ("circ-buff", 0, "w_index: %d, size: %" -                              GF_PRI_SIZET" used_buffer: %d", buffer->w_index, -                              buffer->size_buffer, buffer->used_len); -        } -        pthread_mutex_unlock (&buffer->lock); +    pthread_mutex_lock(&buffer->lock); +    { +        gf_msg_debug("circ-buff", 0, +                     "w_index: %d, size: %" GF_PRI_SIZET " used_buffer: %d", +                     buffer->w_index, buffer->size_buffer, buffer->used_len); +    } +    pthread_mutex_unlock(&buffer->lock);  }  void -cb_buffer_dump (buffer_t *buffer, void *data, -                int (fn) (circular_buffer_t *buffer, void *data)) +cb_buffer_dump(buffer_t *buffer, void *data, +               int(fn)(circular_buffer_t *buffer, void *data))  { -        int index = 0; -        circular_buffer_t *entry = NULL; -        int  entries = 0; -        int ul = 0; -        int w_ind = 0; -        int size_buff = 0; -        int i = 0; - -        ul = buffer->used_len; -        w_ind = buffer->w_index; -        size_buff = buffer->size_buffer; - -        pthread_mutex_lock (&buffer->lock); -        { -                if (buffer->use_once == _gf_false) { -                        index = (size_buff + (w_ind - ul))%size_buff; -                        for (entries = 0; entries < buffer->used_len; -                             entries++) { -                                entry = buffer->cb[index]; -                                if (entry) -                                        fn (entry, data); -                                else -                                        gf_msg_callingfn ("circ-buff", -                                                          GF_LOG_WARNING, 0, -                                                          LG_MSG_NULL_PTR, -                                                          "Null entry in " -                                                          "circular buffer at " -                                                          "index %d.", index); - -                                index++; -                                index %= buffer->size_buffer; -                        } -                } else { -                        for (i = 0; i < buffer->used_len ; i++) { -                                entry = buffer->cb[i]; -                                fn (entry, data); -                        } -                } +    int index = 0; +    circular_buffer_t *entry = NULL; +    int entries = 0; +    int ul = 0; +    int w_ind = 0; +    int size_buff = 0; +    int i = 0; + +    ul = buffer->used_len; +    w_ind = buffer->w_index; +    size_buff = buffer->size_buffer; + +    pthread_mutex_lock(&buffer->lock); +    { +        if (buffer->use_once == _gf_false) { +            index = (size_buff + (w_ind - ul)) % size_buff; +            for (entries = 0; entries < buffer->used_len; entries++) { +                entry = buffer->cb[index]; +                if (entry) +                    fn(entry, data); +                else +                    gf_msg_callingfn("circ-buff", GF_LOG_WARNING, 0, +                                     LG_MSG_NULL_PTR, +                                     "Null entry in " +                                     "circular buffer at " +                                     "index %d.", +                                     index); + +                index++; +                index %= buffer->size_buffer; +            } +        } else { +            for (i = 0; i < buffer->used_len; i++) { +                entry = buffer->cb[i]; +                fn(entry, data); +            }          } -        pthread_mutex_unlock (&buffer->lock); +    } +    pthread_mutex_unlock(&buffer->lock);  }  buffer_t * -cb_buffer_new (size_t buffer_size, gf_boolean_t use_once, -               void (*destroy_buffer_data) (void *data)) +cb_buffer_new(size_t buffer_size, gf_boolean_t use_once, +              void (*destroy_buffer_data)(void *data))  { -        buffer_t    *buffer = NULL; - -        buffer = GF_CALLOC (1, sizeof (*buffer), gf_common_mt_buffer_t); -        if (!buffer) { -                goto out; -        } - -        buffer->cb = GF_CALLOC (buffer_size, -                                sizeof (circular_buffer_t *), -                                gf_common_mt_circular_buffer_t); -        if (!buffer->cb) { -                GF_FREE (buffer); -                buffer = NULL; -                goto out; -        } - -        buffer->w_index = 0; -        buffer->size_buffer = buffer_size; -        buffer->use_once = use_once; -        buffer->used_len = 0; -        buffer->destroy_buffer_data = destroy_buffer_data; -        pthread_mutex_init (&buffer->lock, NULL); +    buffer_t *buffer = NULL; + +    buffer = GF_CALLOC(1, sizeof(*buffer), gf_common_mt_buffer_t); +    if (!buffer) { +        goto out; +    } + +    buffer->cb = GF_CALLOC(buffer_size, sizeof(circular_buffer_t *), +                           gf_common_mt_circular_buffer_t); +    if (!buffer->cb) { +        GF_FREE(buffer); +        buffer = NULL; +        goto out; +    } + +    buffer->w_index = 0; +    buffer->size_buffer = buffer_size; +    buffer->use_once = use_once; +    buffer->used_len = 0; +    buffer->destroy_buffer_data = destroy_buffer_data; +    pthread_mutex_init(&buffer->lock, NULL);  out: -        return buffer; +    return buffer;  }  void -cb_buffer_destroy (buffer_t *buffer) +cb_buffer_destroy(buffer_t *buffer)  { -        int                     i = 0; -        circular_buffer_t       *ptr = NULL; -        if (buffer) { -                if (buffer->cb) { -                        for (i = 0; i < buffer->used_len ; i++) { -                                ptr = buffer->cb[i]; -                                if (ptr->data) { -                                        cb_destroy_data (ptr, -                                                   buffer->destroy_buffer_data); -                                        ptr->data = NULL; -                                        GF_FREE (ptr); -                                } -                        } -                        GF_FREE (buffer->cb); +    int i = 0; +    circular_buffer_t *ptr = NULL; +    if (buffer) { +        if (buffer->cb) { +            for (i = 0; i < buffer->used_len; i++) { +                ptr = buffer->cb[i]; +                if (ptr->data) { +                    cb_destroy_data(ptr, buffer->destroy_buffer_data); +                    ptr->data = NULL; +                    GF_FREE(ptr);                  } -                pthread_mutex_destroy (&buffer->lock); -                GF_FREE (buffer); +            } +            GF_FREE(buffer->cb);          } +        pthread_mutex_destroy(&buffer->lock); +        GF_FREE(buffer); +    }  } -  | 
