summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/mem-pool.h
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/mem-pool.h')
-rw-r--r--libglusterfs/src/mem-pool.h148
1 files changed, 108 insertions, 40 deletions
diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h
index 6b09d6221..31f49f75c 100644
--- a/libglusterfs/src/mem-pool.h
+++ b/libglusterfs/src/mem-pool.h
@@ -1,20 +1,11 @@
/*
- Copyright (c) 2008-2010 Gluster, Inc. <http://www.gluster.com>
- This file is part of GlusterFS.
-
- GlusterFS is free software; you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- GlusterFS is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see
- <http://www.gnu.org/licenses/>.
+ Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of GlusterFS.
+
+ This file is licensed to you under your choice of the GNU Lesser
+ General Public License, version 3 or any later version (LGPLv3 or
+ later), or the GNU General Public License, version 2 (GPLv2), in all
+ cases as published by the Free Software Foundation.
*/
#ifndef _MEM_POOL_H_
@@ -22,6 +13,7 @@
#include "list.h"
#include "locking.h"
+#include "logging.h"
#include "mem-types.h"
#include <stdlib.h>
#include <inttypes.h>
@@ -29,15 +21,6 @@
#include <stdarg.h>
-#define MALLOC(size) malloc(size)
-#define CALLOC(cnt,size) calloc(cnt,size)
-
-#define FREE(ptr) \
- if (ptr != NULL) { \
- free ((void *)ptr); \
- ptr = (void *)0xeeeeeeee; \
- }
-
struct mem_acct {
uint32_t num_types;
struct mem_acct_rec *rec;
@@ -47,6 +30,7 @@ struct mem_acct_rec {
size_t size;
size_t max_size;
uint32_t num_allocs;
+ uint32_t total_allocs;
uint32_t max_num_allocs;
gf_lock_t lock;
};
@@ -67,17 +51,82 @@ gf_vasprintf (char **string_ptr, const char *format, va_list arg);
int
gf_asprintf (char **string_ptr, const char *format, ...);
+void
+__gf_free (void *ptr);
+
+
+static inline
+void* __gf_default_malloc (size_t size)
+{
+ void *ptr = NULL;
+
+ ptr = malloc (size);
+ if (!ptr)
+ gf_log_nomem ("", GF_LOG_ALERT, size);
+
+ return ptr;
+}
+
+static inline
+void* __gf_default_calloc (int cnt, size_t size)
+{
+ void *ptr = NULL;
+
+ ptr = calloc (cnt, size);
+ if (!ptr)
+ gf_log_nomem ("", GF_LOG_ALERT, (cnt * size));
+
+ return ptr;
+}
+
+static inline
+void* __gf_default_realloc (void *oldptr, size_t size)
+{
+ void *ptr = NULL;
+
+ ptr = realloc (oldptr, size);
+ if (!ptr)
+ gf_log_nomem ("", GF_LOG_ALERT, size);
+
+ return ptr;
+}
+
+#define MALLOC(size) __gf_default_malloc(size)
+#define CALLOC(cnt,size) __gf_default_calloc(cnt,size)
+#define REALLOC(ptr,size) __gf_default_realloc(ptr,size)
+
+#define FREE(ptr) \
+ if (ptr != NULL) { \
+ free ((void *)ptr); \
+ ptr = (void *)0xeeeeeeee; \
+ }
+
#define GF_CALLOC(nmemb, size, type) __gf_calloc (nmemb, size, type)
#define GF_MALLOC(size, type) __gf_malloc (size, type)
#define GF_REALLOC(ptr, size) __gf_realloc (ptr, size)
-void
-__gf_free (void *ptr);
+#define GF_FREE(free_ptr) __gf_free (free_ptr)
+static inline
+char *gf_strndup (const char *src, size_t len)
+{
+ char *dup_str = NULL;
-#define GF_FREE(free_ptr) __gf_free (free_ptr);
+ if (!src) {
+ goto out;
+ }
+
+ dup_str = GF_CALLOC (1, len + 1, gf_common_mt_strdup);
+ if (!dup_str) {
+ goto out;
+ }
+
+ memcpy (dup_str, src, len);
+out:
+ return dup_str;
+}
static inline
char * gf_strdup (const char *src)
@@ -98,31 +147,50 @@ char * gf_strdup (const char *src)
return dup_str;
}
+static inline void *
+gf_memdup (const void *src, size_t size)
+{
+ void *dup_mem = NULL;
+
+ dup_mem = GF_CALLOC(1, size, gf_common_mt_strdup);
+ if (!dup_mem)
+ goto out;
+ memcpy (dup_mem, src, size);
+
+out:
+ return dup_mem;
+}
struct mem_pool {
- struct list_head list;
- int hot_count;
- int cold_count;
- gf_lock_t lock;
- unsigned long padded_sizeof_type;
- void *pool;
- void *pool_end;
+ struct list_head list;
+ int hot_count;
+ int cold_count;
+ gf_lock_t lock;
+ unsigned long padded_sizeof_type;
+ void *pool;
+ void *pool_end;
int real_sizeof_type;
+ uint64_t alloc_count;
+ uint64_t pool_misses;
+ int max_alloc;
+ int curr_stdalloc;
+ int max_stdalloc;
+ char *name;
+ struct list_head global_list;
};
struct mem_pool *
-mem_pool_new_fn (unsigned long sizeof_type, unsigned long count);
+mem_pool_new_fn (unsigned long sizeof_type, unsigned long count, char *name);
-#define mem_pool_new(type,count) mem_pool_new_fn (sizeof(type), count)
+#define mem_pool_new(type,count) mem_pool_new_fn (sizeof(type), count, #type)
-void mem_put (struct mem_pool *pool, void *ptr);
+void mem_put (void *ptr);
void *mem_get (struct mem_pool *pool);
void *mem_get0 (struct mem_pool *pool);
void mem_pool_destroy (struct mem_pool *pool);
-int gf_mem_acct_is_enabled ();
-void gf_mem_acct_enable_set ();
+void gf_mem_acct_enable_set (void *ctx);
#endif /* _MEM_POOL_H */