From 4bafd30ad710a5776b75c77a3036a9f1ec0bc667 Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Wed, 21 Jan 2004 04:39:58 +0000 Subject: [PATCH] Assert when shared buffers are used on multiple threads. b=112547 r=jst sr=darin git-svn-id: svn://10.0.0.236/trunk@151620 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/string/public/nsBufferHandle.h | 25 +++++++++ mozilla/xpcom/string/src/Makefile.in | 1 + mozilla/xpcom/string/src/nsBufferHandle.cpp | 55 ++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 mozilla/xpcom/string/src/nsBufferHandle.cpp diff --git a/mozilla/xpcom/string/public/nsBufferHandle.h b/mozilla/xpcom/string/public/nsBufferHandle.h index a7c24c36e48..1674ea60469 100755 --- a/mozilla/xpcom/string/public/nsBufferHandle.h +++ b/mozilla/xpcom/string/public/nsBufferHandle.h @@ -179,6 +179,21 @@ struct nsStringAllocatorTraits // end of string allocator stuff that needs to move +#ifdef DEBUG + +// A small utility class for verifying that all reference counting of +// shared buffer handles (which are not threadsafe) occurs on a single +// thread. +class nsSingleThreadVerifier + { + public: + nsSingleThreadVerifier(); + void verify() const; + protected: + void* mThread; + }; + +#endif template class nsSharedBufferHandle @@ -261,16 +276,26 @@ class nsSharedBufferHandle protected: PRUint32 mFlags; size_type mStorageLength; +#ifdef DEBUG + nsSingleThreadVerifier mSingleThreadVerifier; +#endif PRUint32 get_refcount() const { +#ifdef DEBUG + mSingleThreadVerifier.verify(); +#endif return mFlags & kRefCountMask; } PRUint32 set_refcount( PRUint32 aNewRefCount ) { +#ifdef DEBUG + mSingleThreadVerifier.verify(); +#endif + NS_ASSERTION(aNewRefCount <= kRefCountMask, "aNewRefCount <= kRefCountMask"); mFlags = (mFlags & kFlagsMask) | aNewRefCount; diff --git a/mozilla/xpcom/string/src/Makefile.in b/mozilla/xpcom/string/src/Makefile.in index 128e936e9b6..e4f1dee9518 100644 --- a/mozilla/xpcom/string/src/Makefile.in +++ b/mozilla/xpcom/string/src/Makefile.in @@ -37,6 +37,7 @@ REQUIRES = xpcom \ CPPSRCS = \ nsASingleFragmentString.cpp \ nsAString.cpp \ + nsBufferHandle.cpp \ nsDependentConcatenation.cpp \ nsDependentSubstring.cpp \ nsFragmentedString.cpp \ diff --git a/mozilla/xpcom/string/src/nsBufferHandle.cpp b/mozilla/xpcom/string/src/nsBufferHandle.cpp new file mode 100644 index 00000000000..e4565ab55a1 --- /dev/null +++ b/mozilla/xpcom/string/src/nsBufferHandle.cpp @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is nsBufferHandle.cpp. + * + * The Initial Developer of the Original Code is L. David Baron. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * L. David Baron (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsBufferHandle.h" + +#ifdef DEBUG + +#include "prthread.h" + +nsSingleThreadVerifier::nsSingleThreadVerifier() +{ + mThread = PR_GetCurrentThread(); +} + +void nsSingleThreadVerifier::verify() const +{ + NS_ASSERTION(mThread == PR_GetCurrentThread(), + "sharable string being used on multiple threads"); +} + +#endif