mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 23:06:52 +00:00
56aad8a83e
- Bug 1149987 - Part 2: Make ErrorResult unassignable; r=bzbarsky (32661559b) - Bug 1149987 - Part 3: Give ErrorResult a move constructor and a move assignment operator; (27f4c6125) - Bug 1149987 - Part 4: Do not attempt to delete ErrorResult::mMessage when deserializing the object from IPDL; r=bzbarsky (0f9dcc603) - Bug 1110485 P0 Add an ErrorResult constructor that takes nsresult. (72a779666) - Bug 1110485 P1 Refactor Cache IPC requests to use a separate actor. (a7e4c1959) - Bug 1127914 - Part 1 - Duplicate keyed histograms for double submission. (78673277f) - Bug 1127914 - Part 2 - Duplicate normal histograms for double submission. (55c302057) - Bug 1127914 - Part 3 - Submit duplicate histogram data for 'non-classic' telemetry sessions. r=vladan (bb3e49c43) - Bug 1120362 - Part 1 - Enable snapshotting and clearing subsession histograms. (14378a6e5) - Bug 1120362 - Part 2 - Enable snapshotting and clearing keyed subsession histograms. r=vladan (c0e0bfb3e) - partial apply of Bug 1119281 - Fix missing telemetry client id (ae0dc0194) - Bug 1122047 - Part 1 - Sketch out Telemetry environment module. (0419391b0) - Bug 1122047 - Part 2 - Make TelemetryPing shutdown properly on delayed initialization (0102cef09) - Bug 1122061 - Give TelemetryPing a common API for sending pings. (999cb825d) - Bug 1122061 - Move TelemetrySession tests out of test_telemetryPing.js. (2d5b61de1) - Bug 1120362 - Part 3 - Reset subsession histograms on telemetry payload collections. r=vladan (0d3f04df1) - Bug 1120362 - Part 4 - Start new telemetry subsessions on local midnight. r=vladan (93eb9ca21) - Bug 1120363 - Break up Telemetry sessions on environment changes. (a7c8d70c7) - Bug 1122052 - Remove duplicated data from TelemetrySession. (bb905d602) - Bug 1122050 - Remove persona and experiment data from TelemetrySession. (40ca59a9e) - Bug 1134268 - Part 1 - Fix and order Telemetry shutdown for TelemetryPing and TelemetrySession. r=yoric (30d0f0656) - Bug 1134268 - Part 2 - Fixup TelemetryEnvironment shutdown if the module wasnt initialized. r=vladan (ec2875fea) - Bug 1135076 - Missing histograms in childPayloads. r=vladan (9f317cf9d) - Bug 1134279 - Make TelemetryPing and TelemetrySession code use the "FHR enabled" & "Telemetry enabled" prefs properly. r=vladan (4050d7f24) - Bug 1128768: Part 1 - Modify IPC to allow retrieval of topmost routing id on the stack; (cd2e8a2f0) - Bug 1129249 - Add a "restyle" feature to profiler and split the style label in Cleopatra based on the restyleSource, r=dholbert,mstange (b37df94d1) - Bug 1150684: Remove XPCOM.h from IOInterposer.h (5b7e1cef3) - Bug 1093934 - Create a XPCOM library that can be used to support standalone WebRTC. (9ec8a819f) - Merge branch 'master' of https://github.com/rmottola/Arctic-Fox (d0f05eea4) - Bug 1128768: Part 2,3,4 - Refactor hang annotation code; (f5086aba9) (with xpcom/threads/ fixes for my tele-removed tree) - Bug 1128768: Part 5 - Update plugin code to retrieve SWF file for hang annotations; (774a47aec) - Bug 1110485 P2 Remove 'P' prefix from non-protocol IPC types in Cache API. r=baku (ea29a10cf) - Bug 1110485 P3 Move Fetch IPC PHeaderEntry type to Cache. Rename HeadesEntry. (9eba0aca0) - Bug 1110485 P4 Keep Cache Actors alive during async operations. (eb75f2316) - Bug 1110485 P5 Replace useless DBSchema class type with namespace. (159b902db) - Bug 1110485 P6 Remove useless cache::FileUtils type (1bdf00fc3) - Bug 1110485 P7 Rename DeleteCache() to DeleteCacheId() better distinguish it from CacheDelete(). (5199f9d6f) - Bug 1110485 P8 Correctly set the Feature on the stream control child actor. (c8673cb13) - Bug 1150691 Fix Cache API race with storage invalidation. (2723dff50) - Bug 1151892 Refactor Cache Manager Context usage to be more sane and fix shutdown assert. r=ehsan (ea96381cf) - Bug 1136331 - OdinMonkey: allow stdlib calls in heap expressions (2fc5e2bfd) - Bug 1141439 - Exit with an error code instead of falling through the REMOTE_NOT_FOUND code path when the X-remote returns an explicit command line handler error. (afcf9b1aa) - Bug 1135825: Add missing MOZ_OVERRIDE annotation in RTCIdentityProviderRegistrar.h (e8beec4e8) - (Bug 1135138 is not merged due to broken build)
363 lines
9.2 KiB
C++
363 lines
9.2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifdef DEBUG
|
|
#define ENABLE_STRING_STATS
|
|
#endif
|
|
|
|
#include "mozilla/Atomics.h"
|
|
#include "mozilla/MemoryReporting.h"
|
|
|
|
#ifdef ENABLE_STRING_STATS
|
|
#include <stdio.h>
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
#include "nsSubstring.h"
|
|
#include "nsString.h"
|
|
#include "nsStringBuffer.h"
|
|
#include "nsDependentString.h"
|
|
#include "nsMemory.h"
|
|
#include "prprf.h"
|
|
#include "nsStaticAtom.h"
|
|
#include "nsCOMPtr.h"
|
|
|
|
#include "mozilla/IntegerPrintfMacros.h"
|
|
#ifdef XP_WIN
|
|
#include <windows.h>
|
|
#include <process.h>
|
|
#define getpid() _getpid()
|
|
#define pthread_self() GetCurrentThreadId()
|
|
#else
|
|
#include <pthread.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
using mozilla::Atomic;
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
static const char16_t gNullChar = 0;
|
|
|
|
char* const nsCharTraits<char>::sEmptyBuffer =
|
|
(char*)const_cast<char16_t*>(&gNullChar);
|
|
char16_t* const nsCharTraits<char16_t>::sEmptyBuffer =
|
|
const_cast<char16_t*>(&gNullChar);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#ifdef ENABLE_STRING_STATS
|
|
class nsStringStats
|
|
{
|
|
public:
|
|
nsStringStats()
|
|
: mAllocCount(0)
|
|
, mReallocCount(0)
|
|
, mFreeCount(0)
|
|
, mShareCount(0)
|
|
{
|
|
}
|
|
|
|
~nsStringStats()
|
|
{
|
|
// this is a hack to suppress duplicate string stats printing
|
|
// in seamonkey as a result of the string code being linked
|
|
// into seamonkey and libxpcom! :-(
|
|
if (!mAllocCount && !mAdoptCount) {
|
|
return;
|
|
}
|
|
|
|
printf("nsStringStats\n");
|
|
printf(" => mAllocCount: % 10d\n", int(mAllocCount));
|
|
printf(" => mReallocCount: % 10d\n", int(mReallocCount));
|
|
printf(" => mFreeCount: % 10d", int(mFreeCount));
|
|
if (mAllocCount > mFreeCount) {
|
|
printf(" -- LEAKED %d !!!\n", mAllocCount - mFreeCount);
|
|
} else {
|
|
printf("\n");
|
|
}
|
|
printf(" => mShareCount: % 10d\n", int(mShareCount));
|
|
printf(" => mAdoptCount: % 10d\n", int(mAdoptCount));
|
|
printf(" => mAdoptFreeCount: % 10d", int(mAdoptFreeCount));
|
|
if (mAdoptCount > mAdoptFreeCount) {
|
|
printf(" -- LEAKED %d !!!\n", mAdoptCount - mAdoptFreeCount);
|
|
} else {
|
|
printf("\n");
|
|
}
|
|
printf(" => Process ID: %" PRIuPTR ", Thread ID: %" PRIuPTR "\n",
|
|
uintptr_t(getpid()), uintptr_t(pthread_self()));
|
|
}
|
|
|
|
Atomic<int32_t> mAllocCount;
|
|
Atomic<int32_t> mReallocCount;
|
|
Atomic<int32_t> mFreeCount;
|
|
Atomic<int32_t> mShareCount;
|
|
Atomic<int32_t> mAdoptCount;
|
|
Atomic<int32_t> mAdoptFreeCount;
|
|
};
|
|
static nsStringStats gStringStats;
|
|
#define STRING_STAT_INCREMENT(_s) (gStringStats.m ## _s ## Count)++
|
|
#else
|
|
#define STRING_STAT_INCREMENT(_s)
|
|
#endif
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void
|
|
ReleaseData(void* aData, uint32_t aFlags)
|
|
{
|
|
if (aFlags & nsSubstring::F_SHARED) {
|
|
nsStringBuffer::FromData(aData)->Release();
|
|
} else if (aFlags & nsSubstring::F_OWNED) {
|
|
free(aData);
|
|
STRING_STAT_INCREMENT(AdoptFree);
|
|
// Treat this as destruction of a "StringAdopt" object for leak
|
|
// tracking purposes.
|
|
MOZ_LOG_DTOR(aData, "StringAdopt", 1);
|
|
}
|
|
// otherwise, nothing to do.
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// XXX or we could make nsStringBuffer be a friend of nsTAString
|
|
|
|
class nsAStringAccessor : public nsAString
|
|
{
|
|
private:
|
|
nsAStringAccessor(); // NOT IMPLEMENTED
|
|
|
|
public:
|
|
char_type* data() const
|
|
{
|
|
return mData;
|
|
}
|
|
size_type length() const
|
|
{
|
|
return mLength;
|
|
}
|
|
uint32_t flags() const
|
|
{
|
|
return mFlags;
|
|
}
|
|
|
|
void set(char_type* aData, size_type aLen, uint32_t aFlags)
|
|
{
|
|
ReleaseData(mData, mFlags);
|
|
mData = aData;
|
|
mLength = aLen;
|
|
mFlags = aFlags;
|
|
}
|
|
};
|
|
|
|
class nsACStringAccessor : public nsACString
|
|
{
|
|
private:
|
|
nsACStringAccessor(); // NOT IMPLEMENTED
|
|
|
|
public:
|
|
char_type* data() const
|
|
{
|
|
return mData;
|
|
}
|
|
size_type length() const
|
|
{
|
|
return mLength;
|
|
}
|
|
uint32_t flags() const
|
|
{
|
|
return mFlags;
|
|
}
|
|
|
|
void set(char_type* aData, size_type aLen, uint32_t aFlags)
|
|
{
|
|
ReleaseData(mData, mFlags);
|
|
mData = aData;
|
|
mLength = aLen;
|
|
mFlags = aFlags;
|
|
}
|
|
};
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void
|
|
nsStringBuffer::AddRef()
|
|
{
|
|
++mRefCount;
|
|
STRING_STAT_INCREMENT(Share);
|
|
NS_LOG_ADDREF(this, mRefCount, "nsStringBuffer", sizeof(*this));
|
|
}
|
|
|
|
void
|
|
nsStringBuffer::Release()
|
|
{
|
|
int32_t count = --mRefCount;
|
|
NS_LOG_RELEASE(this, count, "nsStringBuffer");
|
|
if (count == 0) {
|
|
STRING_STAT_INCREMENT(Free);
|
|
free(this); // we were allocated with |malloc|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Alloc returns a pointer to a new string header with set capacity.
|
|
*/
|
|
already_AddRefed<nsStringBuffer>
|
|
nsStringBuffer::Alloc(size_t aSize)
|
|
{
|
|
NS_ASSERTION(aSize != 0, "zero capacity allocation not allowed");
|
|
NS_ASSERTION(sizeof(nsStringBuffer) + aSize <= size_t(uint32_t(-1)) &&
|
|
sizeof(nsStringBuffer) + aSize > aSize,
|
|
"mStorageSize will truncate");
|
|
|
|
nsStringBuffer* hdr =
|
|
(nsStringBuffer*)malloc(sizeof(nsStringBuffer) + aSize);
|
|
if (hdr) {
|
|
STRING_STAT_INCREMENT(Alloc);
|
|
|
|
hdr->mRefCount = 1;
|
|
hdr->mStorageSize = aSize;
|
|
NS_LOG_ADDREF(hdr, 1, "nsStringBuffer", sizeof(*hdr));
|
|
}
|
|
return dont_AddRef(hdr);
|
|
}
|
|
|
|
nsStringBuffer*
|
|
nsStringBuffer::Realloc(nsStringBuffer* aHdr, size_t aSize)
|
|
{
|
|
STRING_STAT_INCREMENT(Realloc);
|
|
|
|
NS_ASSERTION(aSize != 0, "zero capacity allocation not allowed");
|
|
NS_ASSERTION(sizeof(nsStringBuffer) + aSize <= size_t(uint32_t(-1)) &&
|
|
sizeof(nsStringBuffer) + aSize > aSize,
|
|
"mStorageSize will truncate");
|
|
|
|
// no point in trying to save ourselves if we hit this assertion
|
|
NS_ASSERTION(!aHdr->IsReadonly(), "|Realloc| attempted on readonly string");
|
|
|
|
// Treat this as a release and addref for refcounting purposes, since we
|
|
// just asserted that the refcount is 1. If we don't do that, refcount
|
|
// logging will claim we've leaked all sorts of stuff.
|
|
NS_LOG_RELEASE(aHdr, 0, "nsStringBuffer");
|
|
|
|
aHdr = (nsStringBuffer*)realloc(aHdr, sizeof(nsStringBuffer) + aSize);
|
|
if (aHdr) {
|
|
NS_LOG_ADDREF(aHdr, 1, "nsStringBuffer", sizeof(*aHdr));
|
|
aHdr->mStorageSize = aSize;
|
|
}
|
|
|
|
return aHdr;
|
|
}
|
|
|
|
nsStringBuffer*
|
|
nsStringBuffer::FromString(const nsAString& aStr)
|
|
{
|
|
const nsAStringAccessor* accessor =
|
|
static_cast<const nsAStringAccessor*>(&aStr);
|
|
|
|
if (!(accessor->flags() & nsSubstring::F_SHARED)) {
|
|
return nullptr;
|
|
}
|
|
|
|
return FromData(accessor->data());
|
|
}
|
|
|
|
nsStringBuffer*
|
|
nsStringBuffer::FromString(const nsACString& aStr)
|
|
{
|
|
const nsACStringAccessor* accessor =
|
|
static_cast<const nsACStringAccessor*>(&aStr);
|
|
|
|
if (!(accessor->flags() & nsCSubstring::F_SHARED)) {
|
|
return nullptr;
|
|
}
|
|
|
|
return FromData(accessor->data());
|
|
}
|
|
|
|
void
|
|
nsStringBuffer::ToString(uint32_t aLen, nsAString& aStr,
|
|
bool aMoveOwnership)
|
|
{
|
|
char16_t* data = static_cast<char16_t*>(Data());
|
|
|
|
nsAStringAccessor* accessor = static_cast<nsAStringAccessor*>(&aStr);
|
|
NS_ASSERTION(data[aLen] == char16_t(0), "data should be null terminated");
|
|
|
|
// preserve class flags
|
|
uint32_t flags = accessor->flags();
|
|
flags = (flags & 0xFFFF0000) | nsSubstring::F_SHARED | nsSubstring::F_TERMINATED;
|
|
|
|
if (!aMoveOwnership) {
|
|
AddRef();
|
|
}
|
|
accessor->set(data, aLen, flags);
|
|
}
|
|
|
|
void
|
|
nsStringBuffer::ToString(uint32_t aLen, nsACString& aStr,
|
|
bool aMoveOwnership)
|
|
{
|
|
char* data = static_cast<char*>(Data());
|
|
|
|
nsACStringAccessor* accessor = static_cast<nsACStringAccessor*>(&aStr);
|
|
NS_ASSERTION(data[aLen] == char(0), "data should be null terminated");
|
|
|
|
// preserve class flags
|
|
uint32_t flags = accessor->flags();
|
|
flags = (flags & 0xFFFF0000) | nsCSubstring::F_SHARED | nsCSubstring::F_TERMINATED;
|
|
|
|
if (!aMoveOwnership) {
|
|
AddRef();
|
|
}
|
|
accessor->set(data, aLen, flags);
|
|
}
|
|
|
|
size_t
|
|
nsStringBuffer::SizeOfIncludingThisMustBeUnshared(mozilla::MallocSizeOf aMallocSizeOf) const
|
|
{
|
|
NS_ASSERTION(!IsReadonly(),
|
|
"shared StringBuffer in SizeOfIncludingThisMustBeUnshared");
|
|
return aMallocSizeOf(this);
|
|
}
|
|
|
|
size_t
|
|
nsStringBuffer::SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) const
|
|
{
|
|
if (!IsReadonly()) {
|
|
return SizeOfIncludingThisMustBeUnshared(aMallocSizeOf);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t
|
|
nsStringBuffer::SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) const
|
|
{
|
|
return aMallocSizeOf(this);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
// define nsSubstring
|
|
#include "string-template-def-unichar.h"
|
|
#include "nsTSubstring.cpp"
|
|
#include "string-template-undef.h"
|
|
|
|
// define nsCSubstring
|
|
#include "string-template-def-char.h"
|
|
#include "nsTSubstring.cpp"
|
|
#include "string-template-undef.h"
|
|
|
|
// Check that internal and external strings have the same size.
|
|
// See https://bugzilla.mozilla.org/show_bug.cgi?id=430581
|
|
|
|
#include "prlog.h"
|
|
#include "nsXPCOMStrings.h"
|
|
|
|
static_assert(sizeof(nsStringContainer_base) == sizeof(nsSubstring),
|
|
"internal and external strings must have the same size");
|