-/*
- * Bacula memory pool routines.
- *
- * The idea behind these routines is that there will be
- * pools of memory that are pre-allocated for quick
- * access. The pools will have a fixed memory size on allocation
- * but if need be, the size can be increased. This is
- * particularly useful for filename
- * buffers where 256 bytes should be sufficient in 99.99%
- * of the cases, but when it isn't we want to be able to
- * increase the size.
- *
- * A major advantage of the pool memory aside from the speed
- * is that the buffer carrys around its size, so to ensure that
- * there is enough memory, simply call the check_pool_memory_size()
- * with the desired size and it will adjust only if necessary.
- *
- * Kern E. Sibbald
- *
- * Version $Id$
- */
/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
This program is Free Software; you can redistribute it and/or
modify it under the terms of version two of the GNU General Public
- License as published by the Free Software Foundation plus additions
- that are listed in the file LICENSE.
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
*/
+/*
+ * Bacula memory pool routines.
+ *
+ * The idea behind these routines is that there will be
+ * pools of memory that are pre-allocated for quick
+ * access. The pools will have a fixed memory size on allocation
+ * but if need be, the size can be increased. This is
+ * particularly useful for filename
+ * buffers where 256 bytes should be sufficient in 99.99%
+ * of the cases, but when it isn't we want to be able to
+ * increase the size.
+ *
+ * A major advantage of the pool memory aside from the speed
+ * is that the buffer carrys around its size, so to ensure that
+ * there is enough memory, simply call the check_pool_memory_size()
+ * with the desired size and it will adjust only if necessary.
+ *
+ * Kern E. Sibbald
+ *
+ * Version $Id$
+ */
#include "bacula.h"
int32_t ablen; /* Buffer length in bytes */
int32_t pool; /* pool */
struct abufhead *next; /* pointer to next free buffer */
+ int32_t bnet_size; /* dummy for bnet_send() */
};
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
#ifdef SMARTALLOC
#define HEAD_SIZE BALIGN(sizeof(struct abufhead))
return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
}
-
/* Return the size of a memory buffer */
int32_t sm_sizeof_pool_memory(const char *fname, int lineno, POOLMEM *obuf)
{
char *cp = (char *)obuf;
- ASSERT(obuf);
+ if (obuf == NULL) {
+ Emsg0(M_ABORT, 0, _("obuf is NULL\n"));
+ }
cp -= HEAD_SIZE;
return ((struct abufhead *)cp)->ablen;
}
V(mutex);
}
-
#else
/* ========= NO SMARTALLOC ========================================= */
return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
}
-
/* Return the size of a memory buffer */
int32_t sizeof_pool_memory(POOLMEM *obuf)
{
return ((struct abufhead *)cp)->ablen;
}
-
-
/* Realloc pool memory buffer */
POOLMEM *realloc_pool_memory(POOLMEM *obuf, int32_t size)
{
return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
}
-
POOLMEM *check_pool_memory_size(POOLMEM *obuf, int32_t size)
{
ASSERT(obuf);
Dmsg2(1800, "free_pool_memory %p pool=%d\n", buf, pool);
V(mutex);
}
-
#endif /* SMARTALLOC */
-
/*
* Clean up memory pool periodically
*
}
}
-
-
-
/* Release all pooled memory */
void close_memory_pool()
{
}
#ifdef DEBUG
-
static const char *pool_name(int pool)
{
static const char *name[] = {"NoPool", "NAME ", "FNAME ", "MSG ", "EMSG "};
void print_memory_pool_stats() {}
#endif /* DEBUG */
-
/*
* Concatenate a string (str) onto a pool memory buffer pm
* Returns: length of concatenated string
int pm_strcat(POOLMEM **pm, const char *str)
{
int pmlen = strlen(*pm);
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+ len = strlen(str) + 1;
*pm = check_pool_memory_size(*pm, pmlen + len);
memcpy(*pm+pmlen, str, len);
return pmlen + len - 1;
int pm_strcat(POOLMEM *&pm, const char *str)
{
int pmlen = strlen(pm);
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+ len = strlen(str) + 1;
pm = check_pool_memory_size(pm, pmlen + len);
memcpy(pm+pmlen, str, len);
return pmlen + len - 1;
}
-
int pm_strcat(POOLMEM *&pm, POOL_MEM &str)
{
int pmlen = strlen(pm);
int pm_strcat(POOL_MEM &pm, const char *str)
{
int pmlen = strlen(pm.c_str());
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+ len = strlen(str) + 1;
pm.check_size(pmlen + len);
memcpy(pm.c_str()+pmlen, str, len);
return pmlen + len - 1;
}
-
/*
* Copy a string (str) into a pool memory buffer pm
* Returns: length of string copied
*/
int pm_strcpy(POOLMEM **pm, const char *str)
{
- int len = strlen(str) + 1;
+ int len;
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
*pm = check_pool_memory_size(*pm, len);
memcpy(*pm, str, len);
return len - 1;
int pm_strcpy(POOLMEM *&pm, const char *str)
{
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+ len = strlen(str) + 1;
pm = check_pool_memory_size(pm, len);
memcpy(pm, str, len);
return len - 1;
return len - 1;
}
-
int pm_strcpy(POOL_MEM &pm, const char *str)
{
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
pm.check_size(len);
memcpy(pm.c_str(), str, len);
return len - 1;
}
+/*
+ * Copy data into a pool memory buffer pm
+ * Returns: length of data copied
+ */
+int pm_memcpy(POOLMEM **pm, const char *data, int32_t n)
+{
+ *pm = check_pool_memory_size(*pm, n);
+ memcpy(*pm, data, n);
+ return n;
+}
+
+int pm_memcpy(POOLMEM *&pm, const char *data, int32_t n)
+{
+ pm = check_pool_memory_size(pm, n);
+ memcpy(pm, data, n);
+ return n;
+}
+
+int pm_memcpy(POOLMEM *&pm, POOL_MEM &data, int32_t n)
+{
+ pm = check_pool_memory_size(pm, n);
+ memcpy(pm, data.c_str(), n);
+ return n;
+}
+
+int pm_memcpy(POOL_MEM &pm, const char *data, int32_t n)
+{
+ pm.check_size(n);
+ memcpy(pm.c_str(), data, n);
+ return n;
+}
+
/* ============== CLASS POOL_MEM ============== */
/* Return the size of a memory buffer */
int POOL_MEM::strcat(const char *str)
{
int pmlen = strlen(mem);
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+ len = strlen(str) + 1;
check_size(pmlen + len);
memcpy(mem+pmlen, str, len);
return pmlen + len - 1;
}
-
int POOL_MEM::strcpy(const char *str)
{
- int len = strlen(str) + 1;
+ int len;
+
+ if (!str) str = "";
+
+ len = strlen(str) + 1;
check_size(len);
memcpy(mem, str, len);
return len - 1;