From 34380ac48cbf76a2459bddf651d1d30618072afc Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 11 Jun 2008 00:32:48 +0000 Subject: [PATCH] Tracked down issue with previous commit. For some reason, modifying the passed in parameter's value directly results in a segfault in registrar, and I cannot see why. Thoughts? git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25920 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/support/List.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/kits/support/List.cpp b/src/kits/support/List.cpp index c0f1481e19..ad2d452b88 100644 --- a/src/kits/support/List.cpp +++ b/src/kits/support/List.cpp @@ -34,7 +34,7 @@ #include #include #include - +#include // helper function static inline @@ -174,7 +174,7 @@ BList::RemoveItem(int32 index) if (index >= 0 && index < fItemCount) { item = fObjectList[index]; move_items(fObjectList + index + 1, -1, fItemCount - index - 1); - Resize(fItemCount - 1); + Resize(fItemCount - 1); } return item; } @@ -434,10 +434,20 @@ BList::Resize(int32 count) { bool result = true; // calculate the new physical size - int32 newSize = count; - if (newSize <= 0) - newSize = 1; - newSize = ((newSize - 1) / fBlockSize + 1) * fBlockSize; + // by doubling the existing size + // until we can hold at least count items + int32 newSize = fBlockSize; + // TODO: determine why modifying count directly via + // if (count <= 0) count = fBlockSize; + // results in this code segfaulting the registrar while using the local var 'c' does not. + int32 c = count; + if (c <= 0) + c = fBlockSize; + if ((size_t)c != fPhysicalSize) { + while (newSize < c) + newSize <<= 1; + } + // resize if necessary if ((size_t)newSize != fPhysicalSize) { void** newObjectList