]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/mem_pool.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / lib / mem_pool.c
index 439085110ffeef15fb8a9348dbd7b4214c9cb09e..a62b6c50c6481f0d1ebe4fd3754fccd0a9656b9b 100644 (file)
@@ -1,10 +1,10 @@
 /*
- *  Bacula memory pool routines. 
+ *  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 
+ *  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
@@ -21,7 +21,7 @@
  */
 
 /*
-   Copyright (C) 2000-2004 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -44,7 +44,7 @@
 
 struct s_pool_ctl {
    int32_t size;                     /* default size */
-   int32_t max_size;                 /* max allocated */
+   int32_t max_allocated;            /* max allocated */
    int32_t max_used;                 /* max buffers used */
    int32_t in_use;                   /* number in use */
    struct abufhead *free_buf;        /* pointer to free buffers */
@@ -108,11 +108,11 @@ POOLMEM *sm_get_pool_memory(const char *fname, int lineno, int pool)
         pool_ctl[pool].max_used = pool_ctl[pool].in_use;
       }
       V(mutex);
-      Dmsg3(300, "sm_get_pool_memory reuse %x to %s:%d\n", buf, fname, lineno);
+      Dmsg3(800, "sm_get_pool_memory reuse %x to %s:%d\n", buf, fname, lineno);
       sm_new_owner(fname, lineno, (char *)buf);
       return (POOLMEM *)((char *)buf+HEAD_SIZE);
    }
-      
+
    if ((buf = (struct abufhead *)sm_malloc(fname, lineno, pool_ctl[pool].size+HEAD_SIZE)) == NULL) {
       V(mutex);
       Emsg1(M_ABORT, 0, "Out of memory requesting %d bytes\n", pool_ctl[pool].size);
@@ -124,7 +124,7 @@ POOLMEM *sm_get_pool_memory(const char *fname, int lineno, int pool)
       pool_ctl[pool].max_used = pool_ctl[pool].in_use;
    }
    V(mutex);
-   Dmsg3(300, "sm_get_pool_memory give %x to %s:%d\n", buf, fname, lineno);
+   Dmsg3(800, "sm_get_pool_memory give %x to %s:%d\n", buf, fname, lineno);
    return (POOLMEM *)((char *)buf+HEAD_SIZE);
 }
 
@@ -174,8 +174,8 @@ POOLMEM *sm_realloc_pool_memory(const char *fname, int lineno, POOLMEM *obuf, in
    }
    ((struct abufhead *)buf)->ablen = size;
    pool = ((struct abufhead *)buf)->pool;
-   if (size > pool_ctl[pool].max_size) {
-      pool_ctl[pool].max_size = size;
+   if (size > pool_ctl[pool].max_allocated) {
+      pool_ctl[pool].max_allocated = size;
    }
    V(mutex);
    return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
@@ -209,7 +209,7 @@ void sm_free_pool_memory(const char *fname, int lineno, POOLMEM *obuf)
       /* Don't let him free the same buffer twice */
       for (next=pool_ctl[pool].free_buf; next; next=next->next) {
         if (next == buf) {
-            Dmsg4(300, "bad free_pool_memory %x pool=%d from %s:%d\n", buf, pool, fname, lineno);
+            Dmsg4(800, "bad free_pool_memory %x pool=%d from %s:%d\n", buf, pool, fname, lineno);
            V(mutex);                 /* unblock the pool */
            ASSERT(next != buf);      /* attempt to free twice */
         }
@@ -218,14 +218,14 @@ void sm_free_pool_memory(const char *fname, int lineno, POOLMEM *obuf)
       buf->next = pool_ctl[pool].free_buf;
       pool_ctl[pool].free_buf = buf;
    }
-   Dmsg4(300, "free_pool_memory %x pool=%d from %s:%d\n", buf, pool, fname, lineno);
+   Dmsg4(800, "free_pool_memory %x pool=%d from %s:%d\n", buf, pool, fname, lineno);
    V(mutex);
 }
 
 
 #else
 
-/* =================================================================== */
+/* =========  NO SMARTALLOC  ========================================= */
 
 POOLMEM *get_pool_memory(int pool)
 {
@@ -238,7 +238,7 @@ POOLMEM *get_pool_memory(int pool)
       V(mutex);
       return (POOLMEM *)((char *)buf+HEAD_SIZE);
    }
-      
+
    if ((buf=malloc(pool_ctl[pool].size+HEAD_SIZE)) == NULL) {
       V(mutex);
       Emsg1(M_ABORT, 0, "Out of memory requesting %d bytes\n", pool_ctl[pool].size);
@@ -284,6 +284,8 @@ 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)
 {
@@ -301,13 +303,14 @@ POOLMEM *realloc_pool_memory(POOLMEM *obuf, int32_t size)
    }
    ((struct abufhead *)buf)->ablen = size;
    pool = ((struct abufhead *)buf)->pool;
-   if (size > pool_ctl[pool].max_size) {
-      pool_ctl[pool].max_size = size;
+   if (size > pool_ctl[pool].max_allocated) {
+      pool_ctl[pool].max_allocated = size;
    }
    V(mutex);
    return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
 }
 
+
 POOLMEM *check_pool_memory_size(POOLMEM *obuf, int32_t size)
 {
    ASSERT(obuf);
@@ -344,7 +347,7 @@ void free_pool_memory(POOLMEM *obuf)
       buf->next = pool_ctl[pool].free_buf;
       pool_ctl[pool].free_buf = buf;
    }
-   Dmsg2(300, "free_pool_memory %x pool=%d\n", buf, pool);
+   Dmsg2(800, "free_pool_memory %x pool=%d\n", buf, pool);
    V(mutex);
 }
 
@@ -387,23 +390,24 @@ static const char *pool_name(int pool)
    sprintf(buf, "%-6d", pool);
    return buf;
 }
-   
-/* Print staticstics on memory pool usage   
- */ 
+
+/* Print staticstics on memory pool usage
+ */
 void print_memory_pool_stats()
 {
    Dmsg0(-1, "Pool   Maxsize  Maxused  Inuse\n");
    for (int i=0; i<=PM_MAX; i++)
-      Dmsg4(-1, "%5s  %7d  %7d  %5d\n", pool_name(i), pool_ctl[i].max_size,
+      Dmsg4(-1, "%5s  %7d  %7d  %5d\n", pool_name(i), pool_ctl[i].max_allocated,
         pool_ctl[i].max_used, pool_ctl[i].in_use);
 
    Dmsg0(-1, "\n");
 }
 
 #else
-void print_memory_pool_stats() {} 
+void print_memory_pool_stats() {}
 #endif /* DEBUG */
 
+
 /*
  * Concatenate a string (str) onto a pool memory buffer pm
  *   Returns: length of concatenated string
@@ -483,13 +487,50 @@ int pm_strcpy(POOLMEM *&pm, POOL_MEM &str)
 
 
 int pm_strcpy(POOL_MEM &pm, const char *str)
-{  
+{
    int len = strlen(str) + 1;
    pm.check_size(len);
    memcpy(pm.c_str(), str, len);
    return len - 1;
 }
 
+/* ==============  CLASS POOL_MEM   ============== */
+
+/* Return the size of a memory buffer */
+int32_t POOL_MEM::max_size()
+{
+   int32_t size;
+   char *cp = mem;
+   cp -= HEAD_SIZE;
+   size = ((struct abufhead *)cp)->ablen;
+   Dmsg1(000, "max_size=%d\n", size);
+   return size;
+}
+
+void POOL_MEM::realloc_pm(int32_t size)
+{
+   char *cp = mem;
+   char *buf;
+   int pool;
+
+   P(mutex);
+   cp -= HEAD_SIZE;
+   buf = (char *)realloc(cp, size+HEAD_SIZE);
+   if (buf == NULL) {
+      V(mutex);
+      Emsg1(M_ABORT, 0, "Out of memory requesting %d bytes\n", size);
+   }
+   Dmsg2(000, "Old buf=0x%x new buf=0x%x\n", cp, buf);
+   ((struct abufhead *)buf)->ablen = size;
+   pool = ((struct abufhead *)buf)->pool;
+   if (size > pool_ctl[pool].max_allocated) {
+      pool_ctl[pool].max_allocated = size;
+   }
+   mem = buf+HEAD_SIZE;
+   V(mutex);
+   Dmsg3(000, "Old buf=0x%x new buf=0x%x mem=0x%x\n", cp, buf, mem);
+}
+
 int POOL_MEM::strcat(const char *str)
 {
    int pmlen = strlen(mem);
@@ -502,7 +543,7 @@ int POOL_MEM::strcat(const char *str)
 
 
 int POOL_MEM::strcpy(const char *str)
-{  
+{
    int len = strlen(str) + 1;
    check_size(len);
    memcpy(mem, str, len);