diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/circ-buff.c | 30 | ||||
| -rw-r--r-- | libglusterfs/src/circ-buff.h | 5 | ||||
| -rw-r--r-- | libglusterfs/src/event-history.c | 6 | ||||
| -rw-r--r-- | libglusterfs/src/event-history.h | 3 | 
4 files changed, 34 insertions, 10 deletions
diff --git a/libglusterfs/src/circ-buff.c b/libglusterfs/src/circ-buff.c index a48c9287984..484ce7dc939 100644 --- a/libglusterfs/src/circ-buff.c +++ b/libglusterfs/src/circ-buff.c @@ -10,6 +10,17 @@  #include "circ-buff.h" +void +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; +} + +  /* hold lock while calling this function */  int  __cb_add_entry_buffer (buffer_t *buffer, void *item) @@ -29,7 +40,8 @@ __cb_add_entry_buffer (buffer_t *buffer, void *item)                          if (buffer->cb[buffer->w_index]) {                                  ptr = buffer->cb[buffer->w_index];                                  if (ptr->data) { -                                        GF_FREE (ptr->data); +                                        cb_destroy_data (ptr, +                                                   buffer->destroy_buffer_data);                                          ptr->data = NULL;                                          GF_FREE (ptr);                                  } @@ -131,7 +143,8 @@ cb_buffer_dump (buffer_t *buffer, void *data,  }  buffer_t * -cb_buffer_new (size_t buffer_size, gf_boolean_t use_once) +cb_buffer_new (size_t buffer_size, gf_boolean_t use_once, +               void (*destroy_buffer_data) (void *data))  {          buffer_t    *buffer = NULL; @@ -157,6 +170,7 @@ cb_buffer_new (size_t buffer_size, gf_boolean_t use_once)          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: @@ -166,12 +180,18 @@ out:  void  cb_buffer_destroy (buffer_t *buffer)  { -        int i = 0; - +        int                     i = 0; +        circular_buffer_t       *ptr = NULL;          if (buffer) {                  if (buffer->cb) {                          for (i = 0; i < buffer->used_len ; i++) { -                                GF_FREE (buffer->cb[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);                  } diff --git a/libglusterfs/src/circ-buff.h b/libglusterfs/src/circ-buff.h index 5b5acc387bf..e3459f5e3d0 100644 --- a/libglusterfs/src/circ-buff.h +++ b/libglusterfs/src/circ-buff.h @@ -38,7 +38,7 @@ struct _buffer {          /* indicates the amount of circular buffer used. */          circular_buffer_t **cb; - +        void (*destroy_buffer_data) (void *data);          pthread_mutex_t   lock;  }; @@ -51,7 +51,8 @@ void  cb_buffer_show (buffer_t *buffer);  buffer_t * -cb_buffer_new (size_t buffer_size,gf_boolean_t use_buffer_once); +cb_buffer_new (size_t buffer_size,gf_boolean_t use_buffer_once, +               void (*destroy_data) (void *data));  void  cb_buffer_destroy (buffer_t *buffer); diff --git a/libglusterfs/src/event-history.c b/libglusterfs/src/event-history.c index fe511caeb1e..82baa521aec 100644 --- a/libglusterfs/src/event-history.c +++ b/libglusterfs/src/event-history.c @@ -11,7 +11,8 @@  #include "event-history.h"  eh_t * -eh_new (size_t buffer_size, gf_boolean_t use_buffer_once) +eh_new (size_t buffer_size, gf_boolean_t use_buffer_once, +        void (*destroy_buffer_data) (void *data))  {          eh_t *history = NULL;          buffer_t *buffer = NULL; @@ -22,7 +23,8 @@ eh_new (size_t buffer_size, gf_boolean_t use_buffer_once)                  goto out;          } -        buffer = cb_buffer_new (buffer_size, use_buffer_once); +        buffer = cb_buffer_new (buffer_size, use_buffer_once, +                                destroy_buffer_data);          if (!buffer) {                  gf_log ("", GF_LOG_ERROR, "allocating circular buffer failed");                  GF_FREE (history); diff --git a/libglusterfs/src/event-history.h b/libglusterfs/src/event-history.h index b1750bbae96..b64f63b5eb4 100644 --- a/libglusterfs/src/event-history.h +++ b/libglusterfs/src/event-history.h @@ -32,7 +32,8 @@ eh_dump (eh_t *event , void *data,           int (fn) (circular_buffer_t *buffer, void *data));  eh_t * -eh_new (size_t buffer_size, gf_boolean_t use_buffer_once); +eh_new (size_t buffer_size, gf_boolean_t use_buffer_once, +        void (*destroy_data) (void *data));  int  eh_save_history (eh_t *history, void *string);  | 
