diff options
Diffstat (limited to 'js/src/threading/ProtectedData.cpp')
-rw-r--r-- | js/src/threading/ProtectedData.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/js/src/threading/ProtectedData.cpp b/js/src/threading/ProtectedData.cpp new file mode 100644 index 0000000000..9843fd5784 --- /dev/null +++ b/js/src/threading/ProtectedData.cpp @@ -0,0 +1,106 @@ +/* -*- 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/. */ + +#include "threading/ProtectedData.h" + +#include "vm/HelperThreads.h" +#include "vm/JSContext.h" + +namespace js { + +#ifdef JS_HAS_PROTECTED_DATA_CHECKS + +/* static */ mozilla::Atomic<size_t, mozilla::SequentiallyConsistent> + AutoNoteSingleThreadedRegion::count(0); + +template <AllowedHelperThread Helper> +static inline bool OnHelperThread() { + if (Helper == AllowedHelperThread::IonCompile || + Helper == AllowedHelperThread::GCTaskOrIonCompile || + Helper == AllowedHelperThread::ParseTaskOrIonCompile) { + if (CurrentThreadIsIonCompiling()) { + return true; + } + } + + if (Helper == AllowedHelperThread::GCTask || + Helper == AllowedHelperThread::GCTaskOrIonCompile) { + if (CurrentThreadIsPerformingGC()) { + return true; + } + } + + if (Helper == AllowedHelperThread::ParseTask || + Helper == AllowedHelperThread::ParseTaskOrIonCompile) { + if (CurrentThreadIsParseThread()) { + return true; + } + } + + return false; +} + +void CheckThreadLocal::check() const { + JSContext* cx = TlsContext.get(); + MOZ_ASSERT(cx); + MOZ_ASSERT_IF(cx->isMainThreadContext(), + CurrentThreadCanAccessRuntime(cx->runtime())); + MOZ_ASSERT(id == ThreadId::ThisThreadId()); +} + +void CheckContextLocal::check() const { + if (!cx_->isInitialized()) { + return; + } + + JSContext* cx = TlsContext.get(); + MOZ_ASSERT(cx); + MOZ_ASSERT_IF(cx->isMainThreadContext(), + CurrentThreadCanAccessRuntime(cx->runtime())); + MOZ_ASSERT(cx_ == cx); +} + +template <AllowedHelperThread Helper> +void CheckMainThread<Helper>::check() const { + if (OnHelperThread<Helper>()) { + return; + } + + JSContext* cx = TlsContext.get(); + MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime())); +} + +template class CheckMainThread<AllowedHelperThread::None>; +template class CheckMainThread<AllowedHelperThread::GCTask>; +template class CheckMainThread<AllowedHelperThread::ParseTask>; +template class CheckMainThread<AllowedHelperThread::IonCompile>; +template class CheckMainThread<AllowedHelperThread::ParseTaskOrIonCompile>; + +template <GlobalLock Lock, AllowedHelperThread Helper> +void CheckGlobalLock<Lock, Helper>::check() const { + if (OnHelperThread<Helper>()) { + return; + } + + switch (Lock) { + case GlobalLock::GCLock: + TlsGCContext.get() + ->runtimeFromAnyThread() + ->gc.assertCurrentThreadHasLockedGC(); + break; + case GlobalLock::HelperThreadLock: + gHelperThreadLock.assertOwnedByCurrentThread(); + break; + } +} + +template class CheckGlobalLock<GlobalLock::GCLock, AllowedHelperThread::None>; +template class CheckGlobalLock<GlobalLock::HelperThreadLock, + AllowedHelperThread::None>; + +#endif // JS_HAS_PROTECTED_DATA_CHECKS + +} // namespace js |