X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fmem_pool.c;h=b1f849fef94345db8e53d70321e6d65701158c33;hb=5fab1f6fa93fa0b2c8248c055d5b77a09e1dbab7;hp=50bb16463bf7abb3c83a0c7203d9a62b1c6d8e00;hpb=98dc06234c38f53941d714ec2eaafc1f4b0ab311;p=bacula%2Fbacula diff --git a/bacula/src/lib/mem_pool.c b/bacula/src/lib/mem_pool.c index 50bb16463b..b1f849fef9 100644 --- a/bacula/src/lib/mem_pool.c +++ b/bacula/src/lib/mem_pool.c @@ -43,13 +43,16 @@ #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 */ }; @@ -103,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); } @@ -119,12 +124,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 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; @@ -143,7 +148,7 @@ 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; @@ -153,7 +158,7 @@ size_t sm_sizeof_pool_memory(char *fname, int lineno, POOLMEM *obuf) } /* 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; @@ -176,7 +181,7 @@ POOLMEM *sm_realloc_pool_memory(char *fname, int lineno, POOLMEM *obuf, size_t s 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) { ASSERT(obuf); if (size <= sizeof_pool_memory(obuf)) { @@ -203,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); } @@ -246,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; @@ -266,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; @@ -276,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; @@ -299,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)) { @@ -326,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); }