sync with libratbox upstream - r25870
This commit is contained in:
parent
b17d39da75
commit
ce1c921c95
2 changed files with 90 additions and 39 deletions
|
@ -1,3 +1,48 @@
|
|||
androsyn 2008/08/06 19:51:44 UTC (25861)
|
||||
Log:
|
||||
put back in the pad to even pointer boundaries stuff
|
||||
|
||||
Modified:
|
||||
libratbox/trunk/src/balloc.c (File Modified)
|
||||
|
||||
|
||||
androsyn 2008/08/06 19:30:25 UTC (25859)
|
||||
Log:
|
||||
fix the block heap free code
|
||||
|
||||
Modified:
|
||||
libratbox/trunk/src/balloc.c (File Modified)
|
||||
|
||||
|
||||
androsyn 2008/08/06 19:14:38 UTC (25857)
|
||||
Log:
|
||||
Fix a bug where we would get SIGBUS crashes when trying to use a long long.
|
||||
The problem was we were only aligning pointers to 4 bytes, which isn't good
|
||||
enough for long long on sparc when using gcc 4.x. Apparently gcc 3.x was more
|
||||
tolerant of this. This fixes it correctly.
|
||||
|
||||
|
||||
|
||||
Modified:
|
||||
libratbox/trunk/src/balloc.c (File Modified)
|
||||
|
||||
|
||||
androsyn 2008/08/05 04:12:26 UTC (25853)
|
||||
Log:
|
||||
fix a buffer overrun in the nossl case
|
||||
|
||||
Modified:
|
||||
libratbox/trunk/src/nossl.c (File Modified)
|
||||
|
||||
|
||||
androsyn 2008/08/04 22:04:38 UTC (25833)
|
||||
Log:
|
||||
make GET_SS_FAMILY use const and add a SET_SS_FAMILY macro. ircd fixes coming shortly
|
||||
|
||||
Modified:
|
||||
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||
|
||||
|
||||
androsyn 2008/07/29 15:26:55 UTC (25795)
|
||||
Log:
|
||||
some sanity checks in the rb_open path
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
* USA
|
||||
*
|
||||
* $Id: balloc.c 25675 2008-07-06 04:13:05Z androsyn $
|
||||
* $Id: balloc.c 25861 2008-08-06 19:51:44Z androsyn $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -69,6 +69,8 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
static uintptr_t offset_pad;
|
||||
|
||||
/* status information for an allocated block in heap */
|
||||
struct rb_heap_block
|
||||
{
|
||||
|
@ -79,17 +81,6 @@ struct rb_heap_block
|
|||
};
|
||||
typedef struct rb_heap_block rb_heap_block;
|
||||
|
||||
struct rb_heap_memblock
|
||||
{
|
||||
rb_heap_block *block;
|
||||
union {
|
||||
rb_dlink_node node;
|
||||
char data[1]; /* stub pointer..this is ugly */
|
||||
} ndata;
|
||||
};
|
||||
|
||||
typedef struct rb_heap_memblock rb_heap_memblock;
|
||||
|
||||
/* information for the root node of the heap */
|
||||
struct rb_bh
|
||||
{
|
||||
|
@ -155,6 +146,18 @@ void
|
|||
rb_init_bh(void)
|
||||
{
|
||||
heap_lists = rb_malloc(sizeof(rb_dlink_list));
|
||||
offset_pad = sizeof(void *);
|
||||
/* XXX if you get SIGBUS when trying to use a long long..here is where you need to
|
||||
* fix your shit
|
||||
*/
|
||||
#ifdef __sparc__
|
||||
if((offset_pad % __alignof__(long long)) != 0)
|
||||
{
|
||||
offset_pad += __alignof__(long long);
|
||||
offset_pad &= ~(__alignof__(long long) - 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef NOBALLOC
|
||||
#ifdef WIN32
|
||||
block_heap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
|
||||
|
@ -226,11 +229,11 @@ newblock(rb_bh * bh)
|
|||
rb_heap_block *b;
|
||||
unsigned long i;
|
||||
uintptr_t offset;
|
||||
|
||||
rb_dlink_node *node;
|
||||
/* Setup the initial data structure. */
|
||||
b = rb_malloc(sizeof(rb_heap_block));
|
||||
|
||||
b->alloc_size = bh->elemsPerBlock * (bh->elemSize + sizeof(rb_heap_block *));
|
||||
b->alloc_size = bh->elemsPerBlock * bh->elemSize;
|
||||
|
||||
b->elems = get_block(b->alloc_size);
|
||||
if(rb_unlikely(b->elems == NULL))
|
||||
|
@ -239,11 +242,11 @@ newblock(rb_bh * bh)
|
|||
}
|
||||
offset = (uintptr_t)b->elems;
|
||||
/* Setup our blocks now */
|
||||
for (i = 0; i < bh->elemsPerBlock; i++, offset += (bh->elemSize + sizeof(rb_heap_block *)))
|
||||
for (i = 0; i < bh->elemsPerBlock; i++, offset += bh->elemSize)
|
||||
{
|
||||
rb_heap_memblock *memblock = (rb_heap_memblock *)offset;
|
||||
memblock->block = b;
|
||||
rb_dlinkAdd(memblock, &memblock->ndata.node, &bh->free_list);
|
||||
*((void **)offset) = b;
|
||||
node = (void *)(offset + offset_pad);
|
||||
rb_dlinkAdd((void *)offset, node, &bh->free_list);
|
||||
}
|
||||
rb_dlinkAdd(b, &b->node, &bh->block_list);
|
||||
b->free_count = bh->elemsPerBlock;
|
||||
|
@ -272,26 +275,27 @@ rb_bh_create(size_t elemsize, int elemsperblock, const char *desc)
|
|||
rb_bh *bh;
|
||||
lrb_assert(elemsize > 0 && elemsperblock > 0);
|
||||
lrb_assert(elemsize >= sizeof(rb_dlink_node));
|
||||
|
||||
/* Catch idiotic requests up front */
|
||||
if((elemsize == 0) || (elemsperblock <= 0))
|
||||
{
|
||||
rb_bh_fail("Attempting to rb_bh_create idiotic sizes");
|
||||
}
|
||||
|
||||
|
||||
if(elemsize < sizeof(rb_dlink_node))
|
||||
rb_bh_fail("Attempt to rb_bh_create smaller than sizeof(rb_dlink_node)");
|
||||
|
||||
/* Allocate our new rb_bh */
|
||||
bh = rb_malloc(sizeof(rb_bh));
|
||||
|
||||
#ifndef NOBALLOC
|
||||
elemsize += offset_pad;
|
||||
if((elemsize % sizeof(void *)) != 0)
|
||||
{
|
||||
/* Pad to even pointer boundary */
|
||||
elemsize += sizeof(void *);
|
||||
elemsize &= ~(sizeof(void *) - 1);
|
||||
}
|
||||
#endif /* !NOBALLOC */
|
||||
#endif
|
||||
|
||||
bh->elemSize = elemsize;
|
||||
bh->elemsPerBlock = elemsperblock;
|
||||
|
@ -334,7 +338,8 @@ rb_bh_alloc(rb_bh * bh)
|
|||
{
|
||||
#ifndef NOBALLOC
|
||||
rb_dlink_node *new_node;
|
||||
rb_heap_memblock *memblock;
|
||||
rb_heap_block *block;
|
||||
void *ptr;
|
||||
#endif
|
||||
lrb_assert(bh != NULL);
|
||||
if(rb_unlikely(bh == NULL))
|
||||
|
@ -363,11 +368,11 @@ rb_bh_alloc(rb_bh * bh)
|
|||
}
|
||||
|
||||
new_node = bh->free_list.head;
|
||||
memblock = new_node->data;
|
||||
block = new_node->data;
|
||||
ptr = new_node->data + offset_pad;
|
||||
rb_dlinkDelete(new_node, &bh->free_list);
|
||||
memblock->block->free_count--;
|
||||
memset((void *)memblock->ndata.data, 0, bh->elemSize);
|
||||
return((void *)memblock->ndata.data);
|
||||
memset(ptr, 0, bh->elemSize - offset_pad);
|
||||
return(ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -387,7 +392,8 @@ int
|
|||
rb_bh_free(rb_bh * bh, void *ptr)
|
||||
{
|
||||
#ifndef NOBALLOC
|
||||
rb_heap_memblock *memblock;
|
||||
rb_heap_block *block;
|
||||
void *data;
|
||||
#endif
|
||||
lrb_assert(bh != NULL);
|
||||
lrb_assert(ptr != NULL);
|
||||
|
@ -407,14 +413,15 @@ rb_bh_free(rb_bh * bh, void *ptr)
|
|||
#ifdef NOBALLOC
|
||||
rb_free(ptr);
|
||||
#else
|
||||
memblock = (rb_heap_memblock *) ((uintptr_t)ptr - sizeof(rb_heap_block *));
|
||||
data = (void *)(ptr - offset_pad);
|
||||
block = *(rb_heap_block **)data;
|
||||
/* XXX */
|
||||
if(rb_unlikely(!((uintptr_t)ptr >= (uintptr_t)memblock->block->elems && (uintptr_t)ptr < (uintptr_t)memblock->block->elems + (uintptr_t)memblock->block->alloc_size)))
|
||||
if(rb_unlikely(!((uintptr_t)ptr >= (uintptr_t)block->elems && (uintptr_t)ptr < (uintptr_t)block->elems + (uintptr_t)block->alloc_size)))
|
||||
{
|
||||
rb_bh_fail("rb_bh_free() bogus pointer");
|
||||
}
|
||||
memblock->block->free_count++;
|
||||
rb_dlinkAdd(memblock, &memblock->ndata.node, &bh->free_list);
|
||||
block->free_count++;
|
||||
rb_dlinkAdd(data, (rb_dlink_node *)ptr, &bh->free_list);
|
||||
#endif /* !NOBALLOC */
|
||||
return (0);
|
||||
}
|
||||
|
@ -468,7 +475,7 @@ rb_bh_usage(rb_bh * bh, size_t * bused, size_t * bfree, size_t * bmemusage, cons
|
|||
|
||||
freem = rb_dlink_list_length(&bh->free_list);
|
||||
used = (rb_dlink_list_length(&bh->block_list) * bh->elemsPerBlock) - freem;
|
||||
memusage = used * (bh->elemSize + sizeof(void *));
|
||||
memusage = used * bh->elemSize;
|
||||
if(bused != NULL)
|
||||
*bused = used;
|
||||
if(bfree != NULL)
|
||||
|
@ -495,8 +502,8 @@ void rb_bh_usage_all(rb_bh_usage_cb *cb, void *data)
|
|||
bh = (rb_bh *)ptr->data;
|
||||
freem = rb_dlink_list_length(&bh->free_list);
|
||||
used = (rb_dlink_list_length(&bh->block_list) * bh->elemsPerBlock) - freem;
|
||||
memusage = used * (bh->elemSize + sizeof(void *));
|
||||
heapalloc = (freem + used) * (bh->elemSize + sizeof(void *));
|
||||
memusage = used * bh->elemSize;
|
||||
heapalloc = (freem + used) * bh->elemSize;
|
||||
if(bh->desc != NULL)
|
||||
desc = bh->desc;
|
||||
cb(used, freem, memusage, heapalloc, desc, data);
|
||||
|
@ -516,8 +523,8 @@ rb_bh_total_usage(size_t *total_alloc, size_t *total_used)
|
|||
bh = (rb_bh *)ptr->data;
|
||||
freem = rb_dlink_list_length(&bh->free_list);
|
||||
used = (rb_dlink_list_length(&bh->block_list) * bh->elemsPerBlock) - freem;
|
||||
used_memory += used * (bh->elemSize + sizeof(void *));
|
||||
total_memory += (freem + used) * (bh->elemSize + sizeof(void *));
|
||||
used_memory += used * bh->elemSize;
|
||||
total_memory += (freem + used) * bh->elemSize;
|
||||
}
|
||||
|
||||
if(total_alloc != NULL)
|
||||
|
@ -558,10 +565,9 @@ rb_bh_gc(rb_bh * bh)
|
|||
/* i'm seriously going to hell for this.. */
|
||||
|
||||
offset = (uintptr_t)b->elems;
|
||||
for (i = 0; i < bh->elemsPerBlock; i++, offset += ((uintptr_t)bh->elemSize + sizeof(rb_heap_memblock *)))
|
||||
for (i = 0; i < bh->elemsPerBlock; i++, offset += (uintptr_t)bh->elemSize)
|
||||
{
|
||||
rb_heap_memblock *memblock = (rb_heap_memblock *)offset;
|
||||
rb_dlinkDelete(&memblock->ndata.node, &bh->free_list);
|
||||
rb_dlinkDelete(((rb_dlink_node *)(offset + offset_pad)), &bh->free_list);
|
||||
}
|
||||
rb_dlinkDelete(&b->node, &bh->block_list);
|
||||
free_block(b->elems, b->alloc_size);
|
||||
|
|
Loading…
Reference in a new issue