X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fmem_pool.c;h=b1f849fef94345db8e53d70321e6d65701158c33;hb=5fab1f6fa93fa0b2c8248c055d5b77a09e1dbab7;hp=4f928deb69f00927def2a1c35959ee1be10cf8d2;hpb=1d1d4ab652baf58b3c92c5d7688765c5a46d0b54;p=bacula%2Fbacula diff --git a/bacula/src/lib/mem_pool.c b/bacula/src/lib/mem_pool.c index 4f928deb69..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 */ }; @@ -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); }