]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/mem_pool.c
Doc + read_record updates
[bacula/bacula] / bacula / src / lib / mem_pool.c
index 4f928deb69f00927def2a1c35959ee1be10cf8d2..b1f849fef94345db8e53d70321e6d65701158c33 100644 (file)
 #include "bacula.h"
 
 struct s_pool_ctl {
-   size_t size;                      /* default size */
-   size_t max_size;                  /* max allocated */
-   size_t max_used;                  /* max buffers used */
-   size_t in_use;                    /* number in use */
+   int32_t size;                     /* default size */
+   int32_t max_size;                 /* max allocated */
+   int32_t max_used;                 /* max buffers used */
+   int32_t in_use;                   /* number in use */
    struct abufhead *free_buf;        /* pointer to free buffers */
 };
 
+/* Bacula Name length plus extra */
+#define NLEN (MAX_NAME_LENGTH+2)
+
 /* #define STRESS_TEST_POOL */
 #ifndef STRESS_TEST_POOL
 /*
@@ -57,6 +60,7 @@ struct s_pool_ctl {
  */
 static struct s_pool_ctl pool_ctl[] = {
    {  256,  256, 0, 0, NULL },       /* PM_NOPOOL no pooling */
+   {  NLEN, NLEN,0, 0, NULL },       /* PM_NAME Bacula name */
    {  256,  256, 0, 0, NULL },       /* PM_FNAME filename buffers */
    {  512,  512, 0, 0, NULL },       /* PM_MESSAGE message buffer */
    { 1024, 1024, 0, 0, NULL }        /* PM_EMSG error message buffer */
@@ -66,6 +70,7 @@ static struct s_pool_ctl pool_ctl[] = {
 /* This is used ONLY when stress testing the code */
 static struct s_pool_ctl pool_ctl[] = {
    {   20,   20, 0, 0, NULL },       /* PM_NOPOOL no pooling */
+   {  NLEN, NLEN,0, 0, NULL },       /* PM_NAME Bacula name */
    {   20,   20, 0, 0, NULL },       /* PM_FNAME filename buffers */
    {   20,   20, 0, 0, NULL },       /* PM_MESSAGE message buffer */
    {   20,   20, 0, 0, NULL }        /* PM_EMSG error message buffer */
@@ -75,7 +80,7 @@ static struct s_pool_ctl pool_ctl[] = {
 
 /*  Memory allocation control structures and storage.  */
 struct abufhead {
-   size_t ablen;                     /* Buffer length in bytes */
+   int32_t ablen;                    /* Buffer length in bytes */
    int32_t pool;                     /* pool */
    struct abufhead *next;            /* pointer to next free buffer */
 };
@@ -87,13 +92,10 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
 #define HEAD_SIZE BALIGN(sizeof(struct abufhead))
 
-extern POOLMEM *sm_malloc(char *fname, int lineno, int nbytes);
-
 POOLMEM *sm_get_pool_memory(char *fname, int lineno, int pool)
 {
    struct abufhead *buf;
 
-   sm_check(fname, lineno, True);
    if (pool > PM_MAX) {
       Emsg2(M_ABORT, 0, "MemPool index %d larger than max %d\n", pool, PM_MAX);
    }
@@ -106,12 +108,12 @@ POOLMEM *sm_get_pool_memory(char *fname, int lineno, int pool)
         pool_ctl[pool].max_used = pool_ctl[pool].in_use;
       }
       V(mutex);
-      Dmsg3(150, "sm_get_pool_memory reuse %x to %s:%d\n", buf, fname, lineno);
+      Dmsg3(300, "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) {
+   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);
    }
@@ -122,17 +124,16 @@ POOLMEM *sm_get_pool_memory(char *fname, int lineno, int pool)
       pool_ctl[pool].max_used = pool_ctl[pool].in_use;
    }
    V(mutex);
-   Dmsg3(150, "sm_get_pool_memory give %x to %s:%d\n", buf, fname, lineno);
+   Dmsg3(300, "sm_get_pool_memory give %x to %s:%d\n", buf, fname, lineno);
    return (POOLMEM *)((char *)buf+HEAD_SIZE);
 }
 
 /* Get nonpool memory of size requested */
-POOLMEM *sm_get_memory(char *fname, int lineno, size_t size)
+POOLMEM *sm_get_memory(char *fname, int lineno, int32_t size)
 {
    struct abufhead *buf;
    int pool = 0;
 
-   sm_check(fname, lineno, True);
    if ((buf = (struct abufhead *) sm_malloc(fname, lineno, size+HEAD_SIZE)) == NULL) {
       Emsg1(M_ABORT, 0, "Out of memory requesting %d bytes\n", size);
    }
@@ -147,29 +148,26 @@ POOLMEM *sm_get_memory(char *fname, int lineno, size_t size)
 
 
 /* Return the size of a memory buffer */
-size_t sm_sizeof_pool_memory(char *fname, int lineno, POOLMEM *obuf)
+int32_t sm_sizeof_pool_memory(char *fname, int lineno, POOLMEM *obuf)
 {
    char *cp = (char *)obuf;
 
-   sm_check(fname, lineno, False);
    ASSERT(obuf);
    cp -= HEAD_SIZE;
    return ((struct abufhead *)cp)->ablen;
 }
 
 /* Realloc pool memory buffer */
-POOLMEM *sm_realloc_pool_memory(char *fname, int lineno, POOLMEM *obuf, size_t size)
+POOLMEM *sm_realloc_pool_memory(char *fname, int lineno, POOLMEM *obuf, int32_t size)
 {
    char *cp = (char *)obuf;
    void *buf;
    int pool;
 
-   sm_check(fname, lineno, False);
    ASSERT(obuf);
    P(mutex);
    cp -= HEAD_SIZE;
    buf = sm_realloc(fname, lineno, cp, size+HEAD_SIZE);
-   sm_check(fname, lineno, True);
    if (buf == NULL) {
       V(mutex);
       Emsg1(M_ABORT, 0, "Out of memory requesting %d bytes\n", size);
@@ -180,13 +178,11 @@ POOLMEM *sm_realloc_pool_memory(char *fname, int lineno, POOLMEM *obuf, size_t s
       pool_ctl[pool].max_size = size;
    }
    V(mutex);
-   sm_check(fname, lineno, False);
    return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
 }
 
-POOLMEM *sm_check_pool_memory_size(char *fname, int lineno, POOLMEM *obuf, size_t size)
+POOLMEM *sm_check_pool_memory_size(char *fname, int lineno, POOLMEM *obuf, int32_t size)
 {
-   sm_check(fname, lineno, False);
    ASSERT(obuf);
    if (size <= sizeof_pool_memory(obuf)) {
       return obuf;
@@ -200,7 +196,6 @@ void sm_free_pool_memory(char *fname, int lineno, POOLMEM *obuf)
    struct abufhead *buf;
    int pool;
 
-   sm_check(fname, lineno, True);
    ASSERT(obuf);
    P(mutex);
    buf = (struct abufhead *)((char *)obuf - HEAD_SIZE);
@@ -213,13 +208,17 @@ void sm_free_pool_memory(char *fname, int lineno, POOLMEM *obuf)
       struct abufhead *next;
       /* Don't let him free the same buffer twice */
       for (next=pool_ctl[pool].free_buf; next; next=next->next) {
-        ASSERT(next != buf);  /* attempt to free twice */
+        if (next == buf) {
+            Dmsg4(300, "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 */
+        }
       }
 #endif
       buf->next = pool_ctl[pool].free_buf;
       pool_ctl[pool].free_buf = buf;
    }
-   Dmsg2(150, "free_pool_memory %x pool=%d\n", buf, pool);
+   Dmsg4(300, "free_pool_memory %x pool=%d from %s:%d\n", buf, pool, fname, lineno);
    V(mutex);
 }
 
@@ -256,7 +255,7 @@ POOLMEM *get_pool_memory(int pool)
 }
 
 /* Get nonpool memory of size requested */
-POOLMEM *get_memory(size_t size)
+POOLMEM *get_memory(int32_t size)
 {
    struct abufhead *buf;
    int pool = 0;
@@ -276,7 +275,7 @@ POOLMEM *get_memory(size_t size)
 
 
 /* Return the size of a memory buffer */
-size_t sizeof_pool_memory(POOLMEM *obuf)
+int32_t sizeof_pool_memory(POOLMEM *obuf)
 {
    char *cp = (char *)obuf;
 
@@ -286,7 +285,7 @@ size_t sizeof_pool_memory(POOLMEM *obuf)
 }
 
 /* Realloc pool memory buffer */
-POOLMEM *realloc_pool_memory(POOLMEM *obuf, size_t size)
+POOLMEM *realloc_pool_memory(POOLMEM *obuf, int32_t size)
 {
    char *cp = (char *)obuf;
    void *buf;
@@ -309,7 +308,7 @@ POOLMEM *realloc_pool_memory(POOLMEM *obuf, size_t size)
    return (POOLMEM *)(((char *)buf)+HEAD_SIZE);
 }
 
-POOLMEM *check_pool_memory_size(POOLMEM *obuf, size_t size)
+POOLMEM *check_pool_memory_size(POOLMEM *obuf, int32_t size)
 {
    ASSERT(obuf);
    if (size <= sizeof_pool_memory(obuf)) {
@@ -324,7 +323,6 @@ void free_pool_memory(POOLMEM *obuf)
    struct abufhead *buf;
    int pool;
 
-   sm_check(__FILE__, __LINE__, False);
    ASSERT(obuf);
    P(mutex);
    buf = (struct abufhead *)((char *)obuf - HEAD_SIZE);
@@ -337,13 +335,16 @@ void free_pool_memory(POOLMEM *obuf)
       struct abufhead *next;
       /* Don't let him free the same buffer twice */
       for (next=pool_ctl[pool].free_buf; next; next=next->next) {
-        ASSERT(next != buf);  /* attempt to free twice */
+        if (next == buf) {
+           V(mutex);
+           ASSERT(next != buf);  /* attempt to free twice */
+        }
       }
 #endif
       buf->next = pool_ctl[pool].free_buf;
       pool_ctl[pool].free_buf = buf;
    }
-   Dmsg2(150, "free_pool_memory %x pool=%d\n", buf, pool);
+   Dmsg2(300, "free_pool_memory %x pool=%d\n", buf, pool);
    V(mutex);
 }