diff --git a/dom/media/AsyncLogger.h b/dom/media/AsyncLogger.h index 041511d2e2ed..f3afb4cc3939 100644 --- a/dom/media/AsyncLogger.h +++ b/dom/media/AsyncLogger.h @@ -51,21 +51,30 @@ class AsyncLogger { char mPayload[PAYLOAD_TOTAL_SIZE - MPSC_MSG_RESERVERD]; }; +// On 32bits the struct is packed differently and there is a hole we need to +// account for. +#if !defined(HAVE_64BIT_BUILD) && !(defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID)) +# define PADDING 8 +#else +# define PADDING 0 +#endif + // The order of the fields is important here to minimize padding. struct TracePayload { - // The thread on which this tracepoint was gathered. - int mTID; - // If this marker is of phase X (COMPLETE), this holds the duration of the - // event in microseconds. Else, the value is not used. - uint32_t mDurationUs; // If this marker is of phase B or E (begin or end), this is the time at // which it was captured. TimeStamp mTimestamp; + // If this marker is of phase X (COMPLETE), this holds the duration of the + // event in microseconds. Else, the value is not used. + uint32_t mDurationUs; + // The thread on which this tracepoint was gathered. + int mTID; // An arbitrary string, usually containing a function signature or a // recognizable tag of some sort, to be displayed when analyzing the // profile. char mName[PAYLOAD_TOTAL_SIZE - sizeof(TracingPhase) - sizeof(int) - - sizeof(uint32_t) - sizeof(TimeStamp) - MPSC_MSG_RESERVERD]; + sizeof(uint32_t) - sizeof(TimeStamp) - MPSC_MSG_RESERVERD - + PADDING]; // A trace payload can be either: // - Begin - this marks the beginning of a temporal region // - End - this marks the end of a temporal region @@ -73,6 +82,7 @@ class AsyncLogger { // temporal region TracingPhase mPhase; }; +#undef PADDING // aLogModuleName is the name of the MOZ_LOG module. explicit AsyncLogger(const char* aLogModuleName, AsyncLogger::AsyncLoggerOutputMode aMode = diff --git a/dom/media/MPSCQueue.h b/dom/media/MPSCQueue.h index be18e82756de..bc418f1c4f3b 100644 --- a/dom/media/MPSCQueue.h +++ b/dom/media/MPSCQueue.h @@ -22,7 +22,7 @@ namespace mozilla { // allows having a simpler design, we count on the fact that jemalloc will get // the memory from a thread-local source most of the time. We'll replace // this with a fixed-size ring buffer if this becomes an issue. -const size_t MPSC_MSG_RESERVERD = sizeof(void*); +const size_t MPSC_MSG_RESERVERD = sizeof(std::atomic); template class MPSCQueue { @@ -32,8 +32,8 @@ class MPSCQueue { Message(const Message& aMessage) = delete; void operator=(const Message& aMessage) = delete; - T data; std::atomic mNext; + T data; }; // The goal here is to make it easy on the allocator. We pack a pointer in the @@ -43,9 +43,9 @@ class MPSCQueue { // making it cheap and, more importantly, lock-free enough. This has been // measured to be cheap and reliable enough, but will be replaced in the // longer run. -#if !defined(XP_WIN) && !defined(MOZ_WIDGET_ANDROID) +#if !(defined(ANDROID) && defined(__i386__)) static_assert(IsPowerOfTwo(sizeof(MPSCQueue::Message)), - "MPSCQueue internal allocations must have a size that is a" + "MPSCQueue internal allocations must have a size that is a " "power of two "); #endif