summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2011-12-01 16:50:27 -0500
committerNat Goodspeed <nat@lindenlab.com>2011-12-01 16:50:27 -0500
commit95fb0249e9f43d907608cc5840d1f8c0e49981d0 (patch)
tree01c39992a96522b9e871e0e94c6b83ffb54dc542
parente97fb23218734d1fbda87eedd7659235777a69ae (diff)
LLSD-14: Move LLSD::(outstanding|allocation)Count() to free functions.
Free functions can be unconditionally compiled into the .o file, but conditionally hidden in the header file. Static class methods don't have that flexibility: without a declaration in the header file, you can't compile a function definition in the .cpp file. That makes it awkward to use the same llcommon build for production and for unit tests. Why make the function declarations conditional at all? These are debugging functions. They break the abstraction, they peek under the covers. Production code should not use them. Making them conditional on an #ifdef symbol in the unit-test source file means the compiler would reject any use by production code. Put differently, it allows us to assert with confidence that only unit tests do use them. Put new free functions in (lowercase) llsd namespace so as not to clutter global namespace. Tweak the one known consumer (llsd_new_tut.cpp) accordingly.
-rw-r--r--indra/llcommon/llsd.cpp14
-rw-r--r--indra/llcommon/llsd.h30
-rw-r--r--indra/test/llsd_new_tut.cpp13
3 files changed, 32 insertions, 25 deletions
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index 1bd5d06d29..08cb7bd2a8 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -91,7 +91,7 @@ protected:
bool shared() const { return (mUseCount > 1) && (mUseCount != STATIC_USAGE_COUNT); }
U32 mUseCount;
-
+
public:
static void reset(Impl*& var, Impl* impl);
///< safely set var to refer to the new impl (possibly shared)
@@ -901,11 +901,6 @@ LLSD& LLSD::operator[](Integer i)
const LLSD& LLSD::operator[](Integer i) const
{ return safe(impl).ref(i); }
-#ifdef LLSD_DEBUG_INFO
-U32 LLSD::allocationCount() { return Impl::sAllocationCount; }
-U32 LLSD::outstandingCount() { return Impl::sOutstandingCount; }
-#endif
-
static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat)
{
// sStorage is used to hold the string representation of the llsd last
@@ -954,6 +949,13 @@ LLSD::array_iterator LLSD::endArray() { return makeArray(impl).endArray(); }
LLSD::array_const_iterator LLSD::beginArray() const{ return safe(impl).beginArray(); }
LLSD::array_const_iterator LLSD::endArray() const { return safe(impl).endArray(); }
+namespace llsd
+{
+
+U32 allocationCount() { return LLSD::Impl::sAllocationCount; }
+U32 outstandingCount() { return LLSD::Impl::sOutstandingCount; }
+
+} // namespace llsd
// Diagnostic dump of contents in an LLSD object
#ifdef LLSD_DEBUG_INFO
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 3519b134c2..ae083dd629 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -389,19 +389,6 @@ private:
Impl* impl;
friend class LLSD::Impl;
//@}
-
- /** @name Unit Testing Interface */
- //@{
-public:
-#ifdef LLSD_DEBUG_INFO
- /// @warn THESE COUNTS WILL NOT BE ACCURATE IN A MULTI-THREADED
- /// ENVIRONMENT.
- ///
- /// These counts track LLSD::Impl (hidden) objects.
- static U32 allocationCount(); ///< how many Impls have been made
- static U32 outstandingCount(); ///< how many Impls are still alive
-#endif
- //@}
private:
/** @name Debugging Interface */
@@ -475,6 +462,23 @@ struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
+namespace llsd
+{
+
+/** @name Unit Testing Interface */
+//@{
+#ifdef LLSD_DEBUG_INFO
+ /// @warn THESE COUNTS WILL NOT BE ACCURATE IN A MULTI-THREADED
+ /// ENVIRONMENT.
+ ///
+ /// These counts track LLSD::Impl (hidden) objects.
+ LL_COMMON_API U32 allocationCount(); ///< how many Impls have been made
+ LL_COMMON_API U32 outstandingCount(); ///< how many Impls are still alive
+#endif
+//@}
+
+} // namespace llsd
+
/** QUESTIONS & TO DOS
- Would Binary be more convenient as unsigned char* buffer semantics?
- Should Binary be convertible to/from String, and if so how?
diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp
index f332ad0ee2..b55a562e98 100644
--- a/indra/test/llsd_new_tut.cpp
+++ b/indra/test/llsd_new_tut.cpp
@@ -25,6 +25,7 @@
* $/LicenseInfo$
*/
+#define LLSD_DEBUG_INFO
#include <tut/tut.hpp>
#include "linden_common.h"
#include "lltut.h"
@@ -39,11 +40,11 @@ namespace tut
private:
U32 mOutstandingAtStart;
public:
- SDCleanupCheck() : mOutstandingAtStart(LLSD::outstandingCount()) { }
+ SDCleanupCheck() : mOutstandingAtStart(llsd::outstandingCount()) { }
~SDCleanupCheck()
{
ensure_equals("SDCleanupCheck",
- LLSD::outstandingCount(), mOutstandingAtStart);
+ llsd::outstandingCount(), mOutstandingAtStart);
}
};
@@ -57,12 +58,12 @@ namespace tut
SDAllocationCheck(const std::string& message, int expectedAllocations)
: mMessage(message),
mExpectedAllocations(expectedAllocations),
- mAllocationAtStart(LLSD::allocationCount())
+ mAllocationAtStart(llsd::allocationCount())
{ }
~SDAllocationCheck()
{
ensure_equals(mMessage + " SDAllocationCheck",
- LLSD::allocationCount() - mAllocationAtStart,
+ llsd::allocationCount() - mAllocationAtStart,
mExpectedAllocations);
}
};
@@ -746,7 +747,7 @@ namespace tut
{
SDAllocationCheck check("shared values test for threaded work", 9);
- //U32 start_llsd_count = LLSD::outstandingCount();
+ //U32 start_llsd_count = llsd::outstandingCount();
LLSD m = LLSD::emptyMap();
@@ -773,7 +774,7 @@ namespace tut
m["string_two"] = "string two value";
m["string_one_copy"] = m["string_one"]; // 9
- //U32 llsd_object_count = LLSD::outstandingCount();
+ //U32 llsd_object_count = llsd::outstandingCount();
//std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl;
//m.dumpStats();