From 4b83262008f3f368f2b4dd19b65a2552efa6f136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 10 Mar 2008 22:56:27 +0000 Subject: [PATCH] * _Realloc() did not initialize the reference count either. * _Alloc() can now preserve the original reference count, only _Clone() still initializes it to 1. As Karsten pointed out, this is necessary to preserve the "shareable" status of the private data. * I hope that's finally it. What happened to our testing suite, anyway? :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24355 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/support/String.h | 2 +- src/kits/support/String.cpp | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/headers/os/support/String.h b/headers/os/support/String.h index 7e07178048..0d9141d2da 100644 --- a/headers/os/support/String.h +++ b/headers/os/support/String.h @@ -221,7 +221,7 @@ private: // Management status_t _Detach(); - char* _Alloc(int32 length); + char* _Alloc(int32 length, bool adoptReferenceCount = true); char* _Realloc(int32 length); void _Init(const char* src, int32 length); char* _Clone(const char* data, int32 length); diff --git a/src/kits/support/String.cpp b/src/kits/support/String.cpp index 9fac0581e1..f941f876a3 100644 --- a/src/kits/support/String.cpp +++ b/src/kits/support/String.cpp @@ -1679,7 +1679,7 @@ BString::_Detach() char* -BString::_Alloc(int32 length) +BString::_Alloc(int32 length, bool adoptReferenceCount) { if (length < 0) return NULL; @@ -1692,7 +1692,11 @@ BString::_Alloc(int32 length) newData[length] = '\0'; // initialize reference count & length - *(((vint32*)newData) - 2) = 1; + int32 referenceCount = 1; + if (adoptReferenceCount && fPrivateData != NULL) + referenceCount = _ReferenceCount(); + + *(((vint32*)newData) - 2) = referenceCount; *(((int32*)newData) - 1) = length & 0x7fffffff; return newData; @@ -1711,12 +1715,15 @@ BString::_Realloc(int32 length) dataPtr = (char*)realloc(dataPtr, length + kPrivateDataOffset + 1); if (dataPtr) { + int32 oldReferenceCount = _ReferenceCount(); + dataPtr += kPrivateDataOffset; fPrivateData = dataPtr; fPrivateData[length] = '\0'; _SetLength(length); + _ReferenceCount() = oldReferenceCount; } return dataPtr; } @@ -1734,7 +1741,7 @@ BString::_Init(const char* src, int32 length) char* BString::_Clone(const char* data, int32 length) { - char* newData = _Alloc(length); + char* newData = _Alloc(length, false); if (newData == NULL) return NULL;