diff options
Diffstat (limited to 'js/src/vm/SharedScriptDataTableHolder.h')
-rw-r--r-- | js/src/vm/SharedScriptDataTableHolder.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/js/src/vm/SharedScriptDataTableHolder.h b/js/src/vm/SharedScriptDataTableHolder.h new file mode 100644 index 0000000000..96e51dcaa6 --- /dev/null +++ b/js/src/vm/SharedScriptDataTableHolder.h @@ -0,0 +1,88 @@ +/* -*- 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/. */ + +#ifndef vm_SharedScriptDataTableHolder_h +#define vm_SharedScriptDataTableHolder_h + +#include "mozilla/Assertions.h" // MOZ_ASSERT +#include "mozilla/Maybe.h" // mozilla::Maybe + +#include "threading/Mutex.h" // js::Mutex +#include "vm/SharedStencil.h" // js::SharedImmutableScriptDataTable + +namespace js { + +class AutoLockGlobalScriptData { + static js::Mutex mutex_; + + public: + AutoLockGlobalScriptData(); + ~AutoLockGlobalScriptData(); +}; + +// A class to provide an access to SharedImmutableScriptDataTable, +// with or without a mutex lock. +// +// js::globalSharedScriptDataTableHolder singleton can be used by any thread, +// and it needs a mutex lock. +// +// AutoLockGlobalScriptData lock; +// auto& table = js::globalSharedScriptDataTableHolder::get(lock); +// +// Private SharedScriptDataTableHolder instance can be created for thread-local +// storage, and it can be configured not to require a mutex lock. +// +// SharedScriptDataTableHolder holder( +// SharedScriptDataTableHolder::NeedsLock::No); +// ... +// auto& table = holder.getWithoutLock(); +// +// getMaybeLocked method can be used for both type of instances. +// +// Maybe<AutoLockGlobalScriptData> lock; +// auto& table = holder.getMaybeLocked(lock); +// +// Private instance is supposed to be held by the each JSRuntime, including +// both main thread runtime and worker thread runtime, and used in for +// non-helper-thread compilation. +// +// js::globalSharedScriptDataTableHolder singleton is supposed to be used by +// all helper-thread compilation. +class SharedScriptDataTableHolder { + bool needsLock_ = true; + js::SharedImmutableScriptDataTable scriptDataTable_; + + public: + enum class NeedsLock { No, Yes }; + + explicit SharedScriptDataTableHolder(NeedsLock needsLock = NeedsLock::Yes) + : needsLock_(needsLock == NeedsLock::Yes) {} + + js::SharedImmutableScriptDataTable& get( + const js::AutoLockGlobalScriptData& lock) { + MOZ_ASSERT(needsLock_); + return scriptDataTable_; + } + + js::SharedImmutableScriptDataTable& getWithoutLock() { + MOZ_ASSERT(!needsLock_); + return scriptDataTable_; + } + + js::SharedImmutableScriptDataTable& getMaybeLocked( + mozilla::Maybe<js::AutoLockGlobalScriptData>& lock) { + if (needsLock_) { + lock.emplace(); + } + return scriptDataTable_; + } +}; + +extern SharedScriptDataTableHolder globalSharedScriptDataTableHolder; + +} /* namespace js */ + +#endif /* vm_SharedScriptDataTableHolder_h */ |