aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/google/protobuf/extension_set.cc109
-rw-r--r--src/google/protobuf/extension_set.h32
-rw-r--r--src/google/protobuf/stubs/atomicops.h10
-rw-r--r--src/google/protobuf/stubs/port.h20
-rw-r--r--src/google/protobuf/stubs/time.cc1
5 files changed, 95 insertions, 77 deletions
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc
index 649ae184..919bd83b 100644
--- a/src/google/protobuf/extension_set.cc
+++ b/src/google/protobuf/extension_set.cc
@@ -34,7 +34,6 @@
#include <google/protobuf/stubs/hash.h>
#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/once.h>
#include <google/protobuf/extension_set.h>
#include <google/protobuf/message_lite.h>
#include <google/protobuf/io/coded_stream.h>
@@ -1747,66 +1746,68 @@ void ExtensionSet::Extension::Free() {
// ==================================================================
// Default repeated field instances for iterator-compatible accessors
-const RepeatedStringTypeTraits::RepeatedFieldType*
-RepeatedStringTypeTraits::default_repeated_field_ = NULL;
+GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_primitive_generic_type_traits_once_init_);
+GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_string_type_traits_once_init_);
+GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_message_generic_type_traits_once_init_);
-const RepeatedMessageGenericTypeTraits::RepeatedFieldType*
-RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL;
+void RepeatedPrimitiveGenericTypeTraits::InitializeDefaultRepeatedFields() {
+ default_repeated_field_int32_ = new RepeatedField<int32>;
+ default_repeated_field_int64_ = new RepeatedField<int64>;
+ default_repeated_field_uint32_ = new RepeatedField<uint32>;
+ default_repeated_field_uint64_ = new RepeatedField<uint64>;
+ default_repeated_field_double_ = new RepeatedField<double>;
+ default_repeated_field_float_ = new RepeatedField<float>;
+ default_repeated_field_bool_ = new RepeatedField<bool>;
+ OnShutdown(&DestroyDefaultRepeatedFields);
+}
+
+void RepeatedPrimitiveGenericTypeTraits::DestroyDefaultRepeatedFields() {
+ delete default_repeated_field_int32_;
+ delete default_repeated_field_int64_;
+ delete default_repeated_field_uint32_;
+ delete default_repeated_field_uint64_;
+ delete default_repeated_field_double_;
+ delete default_repeated_field_float_;
+ delete default_repeated_field_bool_;
+}
-#define PROTOBUF_DEFINE_DEFAULT_REPEATED(TYPE) \
- const RepeatedField<TYPE>* \
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_##TYPE##_ = NULL;
+void RepeatedStringTypeTraits::InitializeDefaultRepeatedFields() {
+ default_repeated_field_ = new RepeatedFieldType;
+ OnShutdown(&DestroyDefaultRepeatedFields);
+}
-PROTOBUF_DEFINE_DEFAULT_REPEATED(int32)
-PROTOBUF_DEFINE_DEFAULT_REPEATED(int64)
-PROTOBUF_DEFINE_DEFAULT_REPEATED(uint32)
-PROTOBUF_DEFINE_DEFAULT_REPEATED(uint64)
-PROTOBUF_DEFINE_DEFAULT_REPEATED(double)
-PROTOBUF_DEFINE_DEFAULT_REPEATED(float)
-PROTOBUF_DEFINE_DEFAULT_REPEATED(bool)
+void RepeatedStringTypeTraits::DestroyDefaultRepeatedFields() {
+ delete default_repeated_field_;
+}
-#undef PROTOBUF_DEFINE_DEFAULT_REPEATED
+void RepeatedMessageGenericTypeTraits::InitializeDefaultRepeatedFields() {
+ default_repeated_field_ = new RepeatedFieldType;
+ OnShutdown(&DestroyDefaultRepeatedFields);
+}
-struct StaticDefaultRepeatedFieldsInitializer {
- StaticDefaultRepeatedFieldsInitializer() {
- InitializeDefaultRepeatedFields();
- OnShutdown(&DestroyDefaultRepeatedFields);
- }
-} static_repeated_fields_initializer;
-
-void InitializeDefaultRepeatedFields() {
- RepeatedStringTypeTraits::default_repeated_field_ =
- new RepeatedStringTypeTraits::RepeatedFieldType;
- RepeatedMessageGenericTypeTraits::default_repeated_field_ =
- new RepeatedMessageGenericTypeTraits::RepeatedFieldType;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ =
- new RepeatedField<int32>;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ =
- new RepeatedField<int64>;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ =
- new RepeatedField<uint32>;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ =
- new RepeatedField<uint64>;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ =
- new RepeatedField<double>;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ =
- new RepeatedField<float>;
- RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ =
- new RepeatedField<bool>;
-}
-
-void DestroyDefaultRepeatedFields() {
- delete RepeatedStringTypeTraits::default_repeated_field_;
- delete RepeatedMessageGenericTypeTraits::default_repeated_field_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_;
- delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_;
+void RepeatedMessageGenericTypeTraits::DestroyDefaultRepeatedFields() {
+ delete default_repeated_field_;
}
+const RepeatedField<int32>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ = NULL;
+const RepeatedField<int64>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ = NULL;
+const RepeatedField<uint32>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ = NULL;
+const RepeatedField<uint64>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ = NULL;
+const RepeatedField<double>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ = NULL;
+const RepeatedField<float>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ = NULL;
+const RepeatedField<bool>*
+RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL;
+const RepeatedStringTypeTraits::RepeatedFieldType*
+RepeatedStringTypeTraits::default_repeated_field_ = NULL;
+const RepeatedMessageGenericTypeTraits::RepeatedFieldType*
+RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL;
+
} // namespace internal
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h
index c371e011..35f14b9c 100644
--- a/src/google/protobuf/extension_set.h
+++ b/src/google/protobuf/extension_set.h
@@ -45,6 +45,7 @@
#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/once.h>
#include <google/protobuf/repeated_field.h>
@@ -716,15 +717,14 @@ class RepeatedPrimitiveTypeTraits {
static const RepeatedFieldType* GetDefaultRepeatedField();
};
-// Declared here so that this can be friended below.
-void InitializeDefaultRepeatedFields();
-void DestroyDefaultRepeatedFields();
+LIBPROTOBUF_EXPORT extern ProtobufOnceType
+repeated_primitive_generic_type_traits_once_init_;
class LIBPROTOBUF_EXPORT RepeatedPrimitiveGenericTypeTraits {
private:
template<typename Type> friend class RepeatedPrimitiveTypeTraits;
- friend void InitializeDefaultRepeatedFields();
- friend void DestroyDefaultRepeatedFields();
+ static void InitializeDefaultRepeatedFields();
+ static void DestroyDefaultRepeatedFields();
static const RepeatedField<int32>* default_repeated_field_int32_;
static const RepeatedField<int64>* default_repeated_field_int64_;
static const RepeatedField<uint32>* default_repeated_field_uint32_;
@@ -759,6 +759,9 @@ template<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Add( \
} \
template<> inline const RepeatedField<TYPE>* \
RepeatedPrimitiveTypeTraits<TYPE>::GetDefaultRepeatedField() { \
+ GoogleOnceInit( \
+ &repeated_primitive_generic_type_traits_once_init_, \
+ &RepeatedPrimitiveGenericTypeTraits::InitializeDefaultRepeatedFields); \
return RepeatedPrimitiveGenericTypeTraits:: \
default_repeated_field_##TYPE##_; \
} \
@@ -812,6 +815,9 @@ class LIBPROTOBUF_EXPORT StringTypeTraits {
}
};
+LIBPROTOBUF_EXPORT extern ProtobufOnceType
+repeated_string_type_traits_once_init_;
+
class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits {
public:
typedef const string& ConstType;
@@ -855,12 +861,14 @@ class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits {
}
static const RepeatedFieldType* GetDefaultRepeatedField() {
+ GoogleOnceInit(&repeated_string_type_traits_once_init_,
+ &InitializeDefaultRepeatedFields);
return default_repeated_field_;
}
private:
- friend void InitializeDefaultRepeatedFields();
- friend void DestroyDefaultRepeatedFields();
+ static void InitializeDefaultRepeatedFields();
+ static void DestroyDefaultRepeatedFields();
static const RepeatedFieldType *default_repeated_field_;
};
@@ -1019,6 +1027,9 @@ class RepeatedMessageTypeTraits {
static const RepeatedFieldType* GetDefaultRepeatedField();
};
+LIBPROTOBUF_EXPORT extern ProtobufOnceType
+repeated_message_generic_type_traits_once_init_;
+
// This class exists only to hold a generic default empty repeated field for all
// message-type repeated field extensions.
class LIBPROTOBUF_EXPORT RepeatedMessageGenericTypeTraits {
@@ -1026,14 +1037,17 @@ class LIBPROTOBUF_EXPORT RepeatedMessageGenericTypeTraits {
typedef RepeatedPtrField< ::google::protobuf::MessageLite*> RepeatedFieldType;
private:
template<typename Type> friend class RepeatedMessageTypeTraits;
- friend void InitializeDefaultRepeatedFields();
- friend void DestroyDefaultRepeatedFields();
+ static void InitializeDefaultRepeatedFields();
+ static void DestroyDefaultRepeatedFields();
static const RepeatedFieldType* default_repeated_field_;
};
template<typename Type> inline
const typename RepeatedMessageTypeTraits<Type>::RepeatedFieldType*
RepeatedMessageTypeTraits<Type>::GetDefaultRepeatedField() {
+ GoogleOnceInit(
+ &repeated_message_generic_type_traits_once_init_,
+ &RepeatedMessageGenericTypeTraits::InitializeDefaultRepeatedFields);
return reinterpret_cast<const RepeatedFieldType*>(
RepeatedMessageGenericTypeTraits::default_repeated_field_);
}
diff --git a/src/google/protobuf/stubs/atomicops.h b/src/google/protobuf/stubs/atomicops.h
index cd20caac..5fa31b0a 100644
--- a/src/google/protobuf/stubs/atomicops.h
+++ b/src/google/protobuf/stubs/atomicops.h
@@ -173,7 +173,7 @@ Atomic64 Release_Load(volatile const Atomic64* ptr);
// Include our platform specific implementation.
#define GOOGLE_PROTOBUF_ATOMICOPS_ERROR \
-#error "Atomic operations are not supported on your platform"
+"Atomic operations are not supported on your platform"
// ThreadSanitizer, http://clang.llvm.org/docs/ThreadSanitizer.html.
#if defined(THREAD_SANITIZER)
@@ -183,7 +183,7 @@ Atomic64 Release_Load(volatile const Atomic64* ptr);
#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
#include <google/protobuf/stubs/atomicops_internals_x86_msvc.h>
#else
-GOOGLE_PROTOBUF_ATOMICOPS_ERROR
+#error GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#endif
// Solaris
@@ -218,15 +218,15 @@ GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#if __has_extension(c_atomic)
#include <google/protobuf/stubs/atomicops_internals_generic_gcc.h>
#else
-GOOGLE_PROTOBUF_ATOMICOPS_ERROR
+#error GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#endif
#else
-GOOGLE_PROTOBUF_ATOMICOPS_ERROR
+#error GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#endif
// Unknown.
#else
-GOOGLE_PROTOBUF_ATOMICOPS_ERROR
+#error GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#endif
// On some platforms we need additional declarations to make AtomicWord
diff --git a/src/google/protobuf/stubs/port.h b/src/google/protobuf/stubs/port.h
index a3c53dd9..74bdfffa 100644
--- a/src/google/protobuf/stubs/port.h
+++ b/src/google/protobuf/stubs/port.h
@@ -79,6 +79,15 @@
#define LIBPROTOC_EXPORT
#endif
+// These #includes are for the byte swap functions declared later on.
+#ifdef _MSC_VER
+#include <stdlib.h> // NOLINT(build/include)
+#elif defined(__APPLE__)
+#include <libkern/OSByteOrder.h>
+#elif defined(__GLIBC__) || defined(__CYGWIN__)
+#include <byteswap.h> // IWYU pragma: export
+#endif
+
// ===================================================================
// from google3/base/port.h
namespace google {
@@ -184,7 +193,7 @@ static const uint64 kuint64max = GOOGLE_ULONGLONG(0xFFFFFFFFFFFFFFFF);
// Provided at least since GCC 3.0.
#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
#else
-#define GOOGLE_PREDICT_TRUE
+#define GOOGLE_PREDICT_TRUE(x) (x)
#endif
#endif
@@ -193,7 +202,7 @@ static const uint64 kuint64max = GOOGLE_ULONGLONG(0xFFFFFFFFFFFFFFFF);
// Provided at least since GCC 3.0.
#define GOOGLE_PREDICT_FALSE(x) (__builtin_expect(x, 0))
#else
-#define GOOGLE_PREDICT_FALSE
+#define GOOGLE_PREDICT_FALSE(x) (x)
#endif
#endif
@@ -275,7 +284,6 @@ inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) {
// The following guarantees declaration of the byte swap functions, and
// defines __BYTE_ORDER for MSVC
#ifdef _MSC_VER
-#include <stdlib.h> // NOLINT(build/include)
#define __BYTE_ORDER __LITTLE_ENDIAN
#define bswap_16(x) _byteswap_ushort(x)
#define bswap_32(x) _byteswap_ulong(x)
@@ -283,15 +291,11 @@ inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) {
#elif defined(__APPLE__)
// Mac OS X / Darwin features
-#include <libkern/OSByteOrder.h>
#define bswap_16(x) OSSwapInt16(x)
#define bswap_32(x) OSSwapInt32(x)
#define bswap_64(x) OSSwapInt64(x)
-#elif defined(__GLIBC__) || defined(__CYGWIN__)
-#include <byteswap.h> // IWYU pragma: export
-
-#else
+#elif !defined(__GLIBC__) && !defined(__CYGWIN__)
static inline uint16 bswap_16(uint16 x) {
return static_cast<uint16>(((x & 0xFF) << 8) | ((x & 0xFF00) >> 8));
diff --git a/src/google/protobuf/stubs/time.cc b/src/google/protobuf/stubs/time.cc
index 3319a244..49c0412c 100644
--- a/src/google/protobuf/stubs/time.cc
+++ b/src/google/protobuf/stubs/time.cc
@@ -21,7 +21,6 @@ static const int64 kSecondsFromEraToEpoch = 62135596800LL;
static const int64 kMinTime = -62135596800LL; // 0001-01-01T00:00:00
static const int64 kMaxTime = 253402300799LL; // 9999-12-31T23:59:59
-static const int kNanosPerSecond = 1000000000;
static const int kNanosPerMillisecond = 1000000;
static const int kNanosPerMicrosecond = 1000;