summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathias Agopian <mathias@google.com> 2013-05-08 16:04:13 -0700
committer Mathias Agopian <mathias@google.com> 2013-05-08 18:13:07 -0700
commit8050299f5b12a8994f323fa5fcfe9199c12e3acf (patch)
tree33763693e41095a2dcb78e3d4e2e7b1553d3a06b
parent002e1e58dfe19dd3e49a59c6827cbf51573941a2 (diff)
new String8, String16 ctors to initialize empty static strings with static linkage
when libutils is statically linked, the ordering of the static initializer is not guaranteed and therefore it's unsafe to use empty static strings: e.g.: static String8 sThisStaticStringIsNotSafe; instead, this new constructor can be used: static String8 sThisStaticStringIsSafe(kEmptyString); Change-Id: Ia3daf1cab1c97d021c0ee9c2b394b5e27e8d6c0d
-rw-r--r--include/utils/String16.h9
-rw-r--r--include/utils/String8.h9
-rw-r--r--libs/utils/String16.cpp13
-rw-r--r--libs/utils/String8.cpp17
4 files changed, 44 insertions, 4 deletions
diff --git a/include/utils/String16.h b/include/utils/String16.h
index 6d4253d24d..d131bfc6a7 100644
--- a/include/utils/String16.h
+++ b/include/utils/String16.h
@@ -41,7 +41,16 @@ class TextOutput;
class String16
{
public:
+ /* use String16(StaticLinkage) if you're statically linking against
+ * libutils and declaring an empty static String16, e.g.:
+ *
+ * static String16 sAStaticEmptyString(String16::kEmptyString);
+ * static String16 sAnotherStaticEmptyString(sAStaticEmptyString);
+ */
+ enum StaticLinkage { kEmptyString };
+
String16();
+ explicit String16(StaticLinkage);
String16(const String16& o);
String16(const String16& o,
size_t len,
diff --git a/include/utils/String8.h b/include/utils/String8.h
index 9426fcfc81..ef59470476 100644
--- a/include/utils/String8.h
+++ b/include/utils/String8.h
@@ -37,7 +37,16 @@ class TextOutput;
class String8
{
public:
+ /* use String8(StaticLinkage) if you're statically linking against
+ * libutils and declaring an empty static String8, e.g.:
+ *
+ * static String8 sAStaticEmptyString(String8::kEmptyString);
+ * static String8 sAnotherStaticEmptyString(sAStaticEmptyString);
+ */
+ enum StaticLinkage { kEmptyString };
+
String8();
+ explicit String8(StaticLinkage);
String8(const String8& o);
explicit String8(const char* o);
explicit String8(const char* o, size_t numChars);
diff --git a/libs/utils/String16.cpp b/libs/utils/String16.cpp
index c856ceb9b2..b09b728adf 100644
--- a/libs/utils/String16.cpp
+++ b/libs/utils/String16.cpp
@@ -93,6 +93,19 @@ String16::String16()
{
}
+String16::String16(StaticLinkage)
+ : mString(0)
+{
+ // this constructor is used when we can't rely on the static-initializers
+ // having run. In this case we always allocate an empty string. It's less
+ // efficient than using getEmptyString(), but we assume it's uncommon.
+
+ char16_t* data = static_cast<char16_t*>(
+ SharedBuffer::alloc(sizeof(char16_t))->data());
+ data[0] = 0;
+ mString = data;
+}
+
String16::String16(const String16& o)
: mString(o.mString)
{
diff --git a/libs/utils/String8.cpp b/libs/utils/String8.cpp
index 413928abb3..e852d77b79 100644
--- a/libs/utils/String8.cpp
+++ b/libs/utils/String8.cpp
@@ -47,16 +47,12 @@ void initialize_string8();
static inline char* getEmptyString()
{
- if (!gEmptyStringBuf) initialize_string8();
-
gEmptyStringBuf->acquire();
return gEmptyString;
}
void initialize_string8()
{
- if (gEmptyStringBuf) return;
-
// HACK: This dummy dependency forces linking libutils Static.cpp,
// which is needed to initialize String8/String16 classes.
// These variables are named for Darwin, but are needed elsewhere too,
@@ -146,6 +142,19 @@ String8::String8()
{
}
+String8::String8(StaticLinkage)
+ : mString(0)
+{
+ // this constructor is used when we can't rely on the static-initializers
+ // having run. In this case we always allocate an empty string. It's less
+ // efficient than using getEmptyString(), but we assume it's uncommon.
+
+ char* data = static_cast<char*>(
+ SharedBuffer::alloc(sizeof(char))->data());
+ data[0] = 0;
+ mString = data;
+}
+
String8::String8(const String8& o)
: mString(o.mString)
{