diff options
Diffstat (limited to 'js/src/jsapi-tests/testSharedImmutableStringsCache.cpp')
-rw-r--r-- | js/src/jsapi-tests/testSharedImmutableStringsCache.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testSharedImmutableStringsCache.cpp b/js/src/jsapi-tests/testSharedImmutableStringsCache.cpp new file mode 100644 index 0000000000..5a4f55a8ce --- /dev/null +++ b/js/src/jsapi-tests/testSharedImmutableStringsCache.cpp @@ -0,0 +1,74 @@ +/* -*- 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 "mozilla/IntegerRange.h" + +#include "js/Vector.h" +#include "jsapi-tests/tests.h" +#include "threading/Thread.h" +#include "util/Text.h" +#include "vm/SharedImmutableStringsCache.h" + +const int NUM_THREADS = 256; +const int NUM_ITERATIONS = 256; + +const int NUM_STRINGS = 4; +const char16_t* const STRINGS[NUM_STRINGS] = {u"uno", u"dos", u"tres", + u"quattro"}; + +struct CacheAndIndex { + js::SharedImmutableStringsCache* cache; + int index; + + CacheAndIndex(js::SharedImmutableStringsCache* cache, int index) + : cache(cache), index(index) {} +}; + +static void getString(CacheAndIndex* cacheAndIndex) { + for (int i = 0; i < NUM_ITERATIONS; i++) { + auto str = STRINGS[cacheAndIndex->index % NUM_STRINGS]; + + auto dupe = js::DuplicateString(str); + MOZ_RELEASE_ASSERT(dupe); + + auto deduped = + cacheAndIndex->cache->getOrCreate(std::move(dupe), js_strlen(str)); + MOZ_RELEASE_ASSERT(deduped.isSome()); + MOZ_RELEASE_ASSERT( + js::EqualChars(str, deduped->chars(), js_strlen(str) + 1)); + + { + auto cloned = deduped->clone(); + // We should be de-duplicating and giving back the same string. + MOZ_RELEASE_ASSERT(deduped->chars() == cloned.chars()); + } + } + + js_delete(cacheAndIndex); +} + +BEGIN_TEST(testSharedImmutableStringsCache) { + auto maybeCache = js::SharedImmutableStringsCache::Create(); + CHECK(maybeCache.isSome()); + auto& cache = *maybeCache; + + js::Vector<js::Thread> threads(cx); + CHECK(threads.reserve(NUM_THREADS)); + + for (auto i : mozilla::IntegerRange(NUM_THREADS)) { + auto cacheAndIndex = js_new<CacheAndIndex>(&cache, i); + CHECK(cacheAndIndex); + threads.infallibleEmplaceBack(); + CHECK(threads.back().init(getString, cacheAndIndex)); + } + + for (auto& thread : threads) { + thread.join(); + } + + return true; +} +END_TEST(testSharedImmutableStringsCache) |