Merge mozilla-central to autoland r=merge a=merge on a CLOSED TREE

--HG--
extra : amend_source : 777464d07da7436d409117fd825c624c4870380b
This commit is contained in:
ANDREEA PAVEL 2017-11-02 15:34:52 +02:00
commit ae041e25fc
9 changed files with 288 additions and 163 deletions

View File

@ -240,6 +240,94 @@ EvictEntries(nsIFile* aDirectory, const nsACString& aGroup,
}
}
/*******************************************************************************
* Client
******************************************************************************/
class Client
: public quota::Client
{
static Client* sInstance;
bool mShutdownRequested;
public:
Client();
static bool
IsShuttingDownOnBackgroundThread()
{
AssertIsOnBackgroundThread();
if (sInstance) {
return sInstance->IsShuttingDown();
}
return QuotaManager::IsShuttingDown();
}
static bool
IsShuttingDownOnNonBackgroundThread()
{
MOZ_ASSERT(!IsOnBackgroundThread());
return QuotaManager::IsShuttingDown();
}
bool
IsShuttingDown() const
{
AssertIsOnBackgroundThread();
return mShutdownRequested;
}
NS_INLINE_DECL_REFCOUNTING(Client, override)
Type
GetType() override;
nsresult
InitOrigin(PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
const AtomicBool& aCanceled,
UsageInfo* aUsageInfo) override;
nsresult
GetUsageForOrigin(PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
const AtomicBool& aCanceled,
UsageInfo* aUsageInfo) override;
void
OnOriginClearCompleted(PersistenceType aPersistenceType,
const nsACString& aOrigin)
override;
void
ReleaseIOThreadObjects() override;
void
AbortOperations(const nsACString& aOrigin) override;
void
AbortOperationsForProcess(ContentParentId aContentParentId) override;
void
StartIdleMaintenance() override;
void
StopIdleMaintenance() override;
void
ShutdownWorkThreads() override;
private:
~Client() override;
};
// FileDescriptorHolder owns a file descriptor and its memory mapping.
// FileDescriptorHolder is derived by two runnable classes (that is,
// (Parent|Child)Runnable.
@ -1044,6 +1132,10 @@ AllocEntryParent(OpenMode aOpenMode,
{
AssertIsOnBackgroundThread();
if (NS_WARN_IF(Client::IsShuttingDownOnBackgroundThread())) {
return nullptr;
}
if (NS_WARN_IF(aPrincipalInfo.type() == PrincipalInfo::TNullPrincipalInfo)) {
MOZ_ASSERT(false);
return nullptr;
@ -1593,136 +1685,160 @@ CloseEntryForWrite(size_t aSize,
}
}
class Client : public quota::Client
/*******************************************************************************
* Client
******************************************************************************/
Client* Client::sInstance = nullptr;
Client::Client()
: mShutdownRequested(false)
{
~Client() override = default;
AssertIsOnBackgroundThread();
MOZ_ASSERT(!sInstance, "We expect this to be a singleton!");
public:
NS_IMETHOD_(MozExternalRefCountType)
AddRef() override;
sInstance = this;
}
NS_IMETHOD_(MozExternalRefCountType)
Release() override;
Client::~Client()
{
AssertIsOnBackgroundThread();
MOZ_ASSERT(sInstance == this, "We expect this to be a singleton!");
Type
GetType() override
{
return ASMJS;
}
sInstance = nullptr;
}
nsresult
InitOrigin(PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
const AtomicBool& aCanceled,
UsageInfo* aUsageInfo) override
{
if (!aUsageInfo) {
return NS_OK;
}
return GetUsageForOrigin(aPersistenceType,
aGroup,
aOrigin,
aCanceled,
aUsageInfo);
}
nsresult
GetUsageForOrigin(PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
const AtomicBool& aCanceled,
UsageInfo* aUsageInfo) override
{
QuotaManager* qm = QuotaManager::Get();
MOZ_ASSERT(qm, "We were being called by the QuotaManager");
nsCOMPtr<nsIFile> directory;
nsresult rv = qm->GetDirectoryForOrigin(aPersistenceType, aOrigin,
getter_AddRefs(directory));
NS_ENSURE_SUCCESS(rv, rv);
MOZ_ASSERT(directory, "We're here because the origin directory exists");
rv = directory->Append(NS_LITERAL_STRING(ASMJSCACHE_DIRECTORY_NAME));
NS_ENSURE_SUCCESS(rv, rv);
DebugOnly<bool> exists;
MOZ_ASSERT(NS_SUCCEEDED(directory->Exists(&exists)) && exists);
nsCOMPtr<nsISimpleEnumerator> entries;
rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
NS_ENSURE_SUCCESS(rv, rv);
bool hasMore;
while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
hasMore && !aCanceled) {
nsCOMPtr<nsISupports> entry;
rv = entries->GetNext(getter_AddRefs(entry));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
NS_ENSURE_TRUE(file, NS_NOINTERFACE);
int64_t fileSize;
rv = file->GetFileSize(&fileSize);
NS_ENSURE_SUCCESS(rv, rv);
MOZ_ASSERT(fileSize >= 0, "Negative size?!");
// Since the client is not explicitly storing files, append to database
// usage which represents implicit storage allocation.
aUsageInfo->AppendToDatabaseUsage(uint64_t(fileSize));
}
NS_ENSURE_SUCCESS(rv, rv);
Client::Type
Client::GetType()
{
return ASMJS;
}
nsresult
Client::InitOrigin(PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
const AtomicBool& aCanceled,
UsageInfo* aUsageInfo)
{
if (!aUsageInfo) {
return NS_OK;
}
return GetUsageForOrigin(aPersistenceType,
aGroup,
aOrigin,
aCanceled,
aUsageInfo);
}
void
OnOriginClearCompleted(PersistenceType aPersistenceType,
const nsACString& aOrigin)
override
{ }
nsresult
Client::GetUsageForOrigin(PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
const AtomicBool& aCanceled,
UsageInfo* aUsageInfo)
{
QuotaManager* qm = QuotaManager::Get();
MOZ_ASSERT(qm, "We were being called by the QuotaManager");
void
ReleaseIOThreadObjects() override
{ }
void
AbortOperations(const nsACString& aOrigin) override
{ }
void
AbortOperationsForProcess(ContentParentId aContentParentId) override
{ }
void
StartIdleMaintenance() override
{ }
void
StopIdleMaintenance() override
{ }
void
ShutdownWorkThreads() override
{
AssertIsOnBackgroundThread();
if (sLiveParentActors) {
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() {
return !sLiveParentActors;
}));
}
nsCOMPtr<nsIFile> directory;
nsresult rv = qm->GetDirectoryForOrigin(aPersistenceType, aOrigin,
getter_AddRefs(directory));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
private:
nsAutoRefCnt mRefCnt;
NS_DECL_OWNINGTHREAD
};
MOZ_ASSERT(directory, "We're here because the origin directory exists");
NS_IMPL_ADDREF(asmjscache::Client)
NS_IMPL_RELEASE(asmjscache::Client)
rv = directory->Append(NS_LITERAL_STRING(ASMJSCACHE_DIRECTORY_NAME));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
DebugOnly<bool> exists;
MOZ_ASSERT(NS_SUCCEEDED(directory->Exists(&exists)) && exists);
nsCOMPtr<nsISimpleEnumerator> entries;
rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
bool hasMore;
while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
hasMore && !aCanceled) {
nsCOMPtr<nsISupports> entry;
rv = entries->GetNext(getter_AddRefs(entry));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
if (NS_WARN_IF(!file)) {
return NS_NOINTERFACE;
}
int64_t fileSize;
rv = file->GetFileSize(&fileSize);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
MOZ_ASSERT(fileSize >= 0, "Negative size?!");
// Since the client is not explicitly storing files, append to database
// usage which represents implicit storage allocation.
aUsageInfo->AppendToDatabaseUsage(uint64_t(fileSize));
}
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}
void
Client::OnOriginClearCompleted(PersistenceType aPersistenceType,
const nsACString& aOrigin)
{
}
void
Client::ReleaseIOThreadObjects()
{
}
void
Client::AbortOperations(const nsACString& aOrigin)
{
}
void
Client::AbortOperationsForProcess(ContentParentId aContentParentId)
{
}
void
Client::StartIdleMaintenance()
{
}
void
Client::StopIdleMaintenance()
{
}
void
Client::ShutdownWorkThreads()
{
AssertIsOnBackgroundThread();
if (sLiveParentActors) {
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() {
return !sLiveParentActors;
}));
}
}
quota::Client*
CreateClient()

View File

@ -17984,11 +17984,22 @@ QuotaClient::ShutdownWorkThreads()
mShutdownRequested = true;
// Shutdown maintenance thread pool (this spins the event loop until all
// threads are gone). This should release any maintenance related quota
// objects.
if (mMaintenanceThreadPool) {
mMaintenanceThreadPool->Shutdown();
mMaintenanceThreadPool = nullptr;
}
// Let any runnables dispatched from dying maintenance threads to be
// processed. This should release any maintenance related directory locks.
if (mCurrentMaintenance) {
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() {
return !mCurrentMaintenance;
}));
}
RefPtr<ConnectionPool> connectionPool = gConnectionPool.get();
if (connectionPool) {
connectionPool->Shutdown();
@ -18312,7 +18323,8 @@ Maintenance::Start()
AssertIsOnBackgroundThread();
MOZ_ASSERT(mState == State::Initial);
if (IsAborted()) {
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnBackgroundThread()) ||
IsAborted()) {
return NS_ERROR_ABORT;
}
@ -18336,7 +18348,8 @@ Maintenance::CreateIndexedDatabaseManager()
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(mState == State::CreateIndexedDatabaseManager);
if (IsAborted()) {
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
IsAborted()) {
return NS_ERROR_ABORT;
}
@ -18361,7 +18374,8 @@ Maintenance::OpenDirectory()
MOZ_ASSERT(!mDirectoryLock);
MOZ_ASSERT(QuotaManager::Get());
if (IsAborted()) {
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnBackgroundThread()) ||
IsAborted()) {
return NS_ERROR_ABORT;
}
@ -18385,7 +18399,8 @@ Maintenance::DirectoryOpen()
MOZ_ASSERT(mState == State::DirectoryOpenPending);
MOZ_ASSERT(mDirectoryLock);
if (IsAborted()) {
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnBackgroundThread()) ||
IsAborted()) {
return NS_ERROR_ABORT;
}
@ -18415,7 +18430,8 @@ Maintenance::DirectoryWork()
// We have to find all database files that match any persistence type and any
// origin. We ignore anything out of the ordinary for now.
if (IsAborted()) {
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
IsAborted()) {
return NS_ERROR_ABORT;
}
@ -18754,6 +18770,11 @@ Maintenance::BeginDatabaseMaintenance()
}
};
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnBackgroundThread()) ||
IsAborted()) {
return NS_ERROR_ABORT;
}
RefPtr<nsThreadPool> threadPool;
for (DirectoryInfo& directoryInfo : mDirectoryInfos) {
@ -18940,6 +18961,11 @@ DatabaseMaintenance::PerformMaintenanceOnDatabase()
}
};
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
mMaintenance->IsAborted()) {
return;
}
nsCOMPtr<nsIFile> databaseFile = GetFileForPath(mDatabasePath);
MOZ_ASSERT(databaseFile);
@ -18956,10 +18982,6 @@ DatabaseMaintenance::PerformMaintenanceOnDatabase()
AutoClose autoClose(connection);
if (mMaintenance->IsAborted()) {
return;
}
AutoProgressHandler progressHandler(mMaintenance);
if (NS_WARN_IF(NS_FAILED(progressHandler.Register(connection)))) {
return;
@ -18978,20 +19000,12 @@ DatabaseMaintenance::PerformMaintenanceOnDatabase()
return;
}
if (mMaintenance->IsAborted()) {
return;
}
MaintenanceAction maintenanceAction;
rv = DetermineMaintenanceAction(connection, databaseFile, &maintenanceAction);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
if (mMaintenance->IsAborted()) {
return;
}
switch (maintenanceAction) {
case MaintenanceAction::Nothing:
break;
@ -19018,6 +19032,11 @@ DatabaseMaintenance::CheckIntegrity(mozIStorageConnection* aConnection,
MOZ_ASSERT(aConnection);
MOZ_ASSERT(aOk);
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
mMaintenance->IsAborted()) {
return NS_ERROR_ABORT;
}
nsresult rv;
// First do a full integrity_check. Scope statements tightly here because
@ -19135,6 +19154,11 @@ DatabaseMaintenance::DetermineMaintenanceAction(
MOZ_ASSERT(aDatabaseFile);
MOZ_ASSERT(aMaintenanceAction);
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
mMaintenance->IsAborted()) {
return NS_ERROR_ABORT;
}
int32_t schemaVersion;
nsresult rv = aConnection->GetSchemaVersion(&schemaVersion);
if (NS_WARN_IF(NS_FAILED(rv))) {
@ -19344,6 +19368,11 @@ DatabaseMaintenance::IncrementalVacuum(mozIStorageConnection* aConnection)
MOZ_ASSERT(!IsOnBackgroundThread());
MOZ_ASSERT(aConnection);
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
mMaintenance->IsAborted()) {
return;
}
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"PRAGMA incremental_vacuum;"
));
@ -19361,6 +19390,11 @@ DatabaseMaintenance::FullVacuum(mozIStorageConnection* aConnection,
MOZ_ASSERT(aConnection);
MOZ_ASSERT(aDatabaseFile);
if (NS_WARN_IF(QuotaClient::IsShuttingDownOnNonBackgroundThread()) ||
mMaintenance->IsAborted()) {
return;
}
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"VACUUM;"
));

View File

@ -157,7 +157,6 @@ enum {
JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT,
JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_ADDONS,
JS_TELEMETRY_ADDON_EXCEPTIONS,
JS_TELEMETRY_AOT_USAGE,
JS_TELEMETRY_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS,
JS_TELEMETRY_WEB_PARSER_COMPILE_LAZY_AFTER_MS,
JS_TELEMETRY_END

View File

@ -478,15 +478,6 @@ enum class NameType
Local = 2
};
// Telemetry sample values for the JS_AOT_USAGE key, indicating whether asm.js
// or WebAssembly is used.
enum class Telemetry
{
ASMJS = 0,
WASM = 1
};
// These limits are agreed upon with other engines for consistency.
static const unsigned MaxTypes = 1000000;

View File

@ -1220,9 +1220,6 @@ Module::instantiate(JSContext* cx,
return false;
}
uint32_t mode = uint32_t(metadata().isAsmJS() ? Telemetry::ASMJS : Telemetry::WASM);
cx->runtime()->addTelemetry(JS_TELEMETRY_AOT_USAGE, mode);
JSUseCounter useCounter = metadata().isAsmJS() ? JSUseCounter::ASMJS : JSUseCounter::WASM;
cx->runtime()->setUseCounter(instance, useCounter);

View File

@ -2669,9 +2669,6 @@ AccumulateTelemetryCallback(int id, uint32_t sample, const char* key)
case JS_TELEMETRY_ADDON_EXCEPTIONS:
Telemetry::Accumulate(Telemetry::JS_TELEMETRY_ADDON_EXCEPTIONS, nsDependentCString(key), sample);
break;
case JS_TELEMETRY_AOT_USAGE:
Telemetry::Accumulate(Telemetry::JS_AOT_USAGE, sample);
break;
case JS_TELEMETRY_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS:
Telemetry::Accumulate(Telemetry::JS_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS, sample);
break;

View File

@ -345,8 +345,6 @@ nsBufferedInputStream::Close()
};
#endif
mAsyncWaitCallback = nullptr;
if (NS_FAILED(rv1)) {
return rv1;
}

View File

@ -153,7 +153,7 @@ nsHtml5Parser::UnblockParser()
if (MOZ_LIKELY(mBlocked > 0)) {
mBlocked--;
}
if (MOZ_LIKELY(mBlocked == 0)) {
if (MOZ_LIKELY(mBlocked == 0) && mExecutor) {
mExecutor->ContinueInterruptedParsingAsync();
}
}
@ -161,7 +161,9 @@ nsHtml5Parser::UnblockParser()
NS_IMETHODIMP_(void)
nsHtml5Parser::ContinueInterruptedParsingAsync()
{
mExecutor->ContinueInterruptedParsingAsync();
if (mExecutor) {
mExecutor->ContinueInterruptedParsingAsync();
}
}
NS_IMETHODIMP_(bool)

View File

@ -13030,15 +13030,6 @@
"n_values": 6,
"description": "Number of revoke actions on permissions in the control center, keyed by permission id. Values represent the permission type that was revoked. (0=unknown, 1=permanently allowed, 2=permanently blocked, 3=temporarily allowed, 4=temporarily blocked)"
},
"JS_AOT_USAGE": {
"record_in_processes": ["main", "content"],
"alert_emails": ["luke@mozilla.com", "bbouvier@mozilla.com"],
"bug_numbers": [1288778],
"expires_in_version": "60",
"kind": "enumerated",
"n_values": 4,
"description": "Counts the number of asm.js vs WebAssembly modules instanciations, at the time modules are getting instanciated."
},
"TIME_TO_FIRST_CLICK_MS": {
"record_in_processes": ["main", "content"],
"alert_emails": ["hkirschner@mozilla.com"],