зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1308655 - Remove js::Thread's infallible constructor. r=froydnj
This commit is contained in:
Родитель
83c01fe1ce
Коммит
84813b6a9d
|
@ -68,7 +68,8 @@ BEGIN_TEST(testSharedImmutableStringsCache)
|
||||||
for (auto i : mozilla::MakeRange(NUM_THREADS)) {
|
for (auto i : mozilla::MakeRange(NUM_THREADS)) {
|
||||||
auto cacheAndIndex = js_new<CacheAndIndex>(&cache, i);
|
auto cacheAndIndex = js_new<CacheAndIndex>(&cache, i);
|
||||||
CHECK(cacheAndIndex);
|
CHECK(cacheAndIndex);
|
||||||
threads.infallibleEmplaceBack(getString, cacheAndIndex);
|
threads.infallibleEmplaceBack();
|
||||||
|
CHECK(threads.back().init(getString, cacheAndIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& thread : threads)
|
for (auto& thread : threads)
|
||||||
|
|
|
@ -77,7 +77,8 @@ BEGIN_TEST(testExclusiveData)
|
||||||
for (auto i : mozilla::MakeRange(NumThreads)) {
|
for (auto i : mozilla::MakeRange(NumThreads)) {
|
||||||
auto counterAndBit = js_new<CounterAndBit>(i, counter);
|
auto counterAndBit = js_new<CounterAndBit>(i, counter);
|
||||||
CHECK(counterAndBit);
|
CHECK(counterAndBit);
|
||||||
CHECK(threads.emplaceBack(setBitAndCheck, counterAndBit));
|
CHECK(threads.emplaceBack());
|
||||||
|
CHECK(threads.back().init(setBitAndCheck, counterAndBit));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& thread : threads)
|
for (auto& thread : threads)
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
BEGIN_TEST(testThreadingThreadJoin)
|
BEGIN_TEST(testThreadingThreadJoin)
|
||||||
{
|
{
|
||||||
bool flag = false;
|
bool flag = false;
|
||||||
js::Thread thread([](bool* flagp){*flagp = true;}, &flag);
|
js::Thread thread;
|
||||||
|
CHECK(thread.init([](bool* flagp){*flagp = true;}, &flag));
|
||||||
CHECK(thread.joinable());
|
CHECK(thread.joinable());
|
||||||
thread.join();
|
thread.join();
|
||||||
CHECK(flag);
|
CHECK(flag);
|
||||||
|
@ -32,7 +33,8 @@ BEGIN_TEST(testThreadingThreadDetach)
|
||||||
// We are going to detach this thread. Unlike join, we can't have it pointing at the stack
|
// We are going to detach this thread. Unlike join, we can't have it pointing at the stack
|
||||||
// because it might do the write after we have returned and pushed a new frame.
|
// because it might do the write after we have returned and pushed a new frame.
|
||||||
bool* flag = js_new<bool>(false);
|
bool* flag = js_new<bool>(false);
|
||||||
js::Thread thread([](bool* flag){*flag = true; js_delete(flag);}, mozilla::Move(flag));
|
js::Thread thread;
|
||||||
|
CHECK(thread.init([](bool* flag){*flag = true; js_delete(flag);}, mozilla::Move(flag)));
|
||||||
CHECK(thread.joinable());
|
CHECK(thread.joinable());
|
||||||
thread.detach();
|
thread.detach();
|
||||||
CHECK(!thread.joinable());
|
CHECK(!thread.joinable());
|
||||||
|
@ -43,7 +45,8 @@ END_TEST(testThreadingThreadDetach)
|
||||||
|
|
||||||
BEGIN_TEST(testThreadingThreadSetName)
|
BEGIN_TEST(testThreadingThreadSetName)
|
||||||
{
|
{
|
||||||
js::Thread thread([](){js::ThisThread::SetName("JSAPI Test Thread");});
|
js::Thread thread;
|
||||||
|
CHECK(thread.init([](){js::ThisThread::SetName("JSAPI Test Thread");}));
|
||||||
thread.detach();
|
thread.detach();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -53,7 +56,8 @@ BEGIN_TEST(testThreadingThreadId)
|
||||||
{
|
{
|
||||||
CHECK(js::Thread::Id() == js::Thread::Id());
|
CHECK(js::Thread::Id() == js::Thread::Id());
|
||||||
js::Thread::Id fromOther;
|
js::Thread::Id fromOther;
|
||||||
js::Thread thread([](js::Thread::Id* idp){*idp = js::ThisThread::GetId();}, &fromOther);
|
js::Thread thread;
|
||||||
|
CHECK(thread.init([](js::Thread::Id* idp){*idp = js::ThisThread::GetId();}, &fromOther));
|
||||||
js::Thread::Id fromMain = thread.get_id();
|
js::Thread::Id fromMain = thread.get_id();
|
||||||
thread.join();
|
thread.join();
|
||||||
CHECK(fromOther == fromMain);
|
CHECK(fromOther == fromMain);
|
||||||
|
@ -67,7 +71,8 @@ BEGIN_TEST(testThreadingThreadVectorMoveConstruct)
|
||||||
mozilla::Atomic<int> count(0);
|
mozilla::Atomic<int> count(0);
|
||||||
mozilla::Vector<js::Thread, 0, js::SystemAllocPolicy> v;
|
mozilla::Vector<js::Thread, 0, js::SystemAllocPolicy> v;
|
||||||
for (auto i : mozilla::MakeRange(N)) {
|
for (auto i : mozilla::MakeRange(N)) {
|
||||||
CHECK(v.emplaceBack([](mozilla::Atomic<int>* countp){(*countp)++;}, &count));
|
CHECK(v.emplaceBack());
|
||||||
|
CHECK(v.back().init([](mozilla::Atomic<int>* countp){(*countp)++;}, &count));
|
||||||
CHECK(v.length() == i + 1);
|
CHECK(v.length() == i + 1);
|
||||||
}
|
}
|
||||||
for (auto& th : v)
|
for (auto& th : v)
|
||||||
|
@ -88,7 +93,8 @@ BEGIN_TEST(testThreadingThreadArgCopy)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < 10000; ++i) {
|
for (size_t i = 0; i < 10000; ++i) {
|
||||||
bool b = true;
|
bool b = true;
|
||||||
js::Thread thread([](bool bb){MOZ_RELEASE_ASSERT(bb);}, b);
|
js::Thread thread;
|
||||||
|
CHECK(thread.init([](bool bb){MOZ_RELEASE_ASSERT(bb);}, b));
|
||||||
b = false;
|
b = false;
|
||||||
thread.join();
|
thread.join();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3533,7 +3533,10 @@ ScheduleWatchdog(JSContext* cx, double t)
|
||||||
LockGuard<Mutex> guard(sc->watchdogLock);
|
LockGuard<Mutex> guard(sc->watchdogLock);
|
||||||
if (!sc->watchdogThread) {
|
if (!sc->watchdogThread) {
|
||||||
MOZ_ASSERT(!sc->watchdogTimeout);
|
MOZ_ASSERT(!sc->watchdogTimeout);
|
||||||
sc->watchdogThread.emplace(WatchdogMain, cx);
|
sc->watchdogThread.emplace();
|
||||||
|
AutoEnterOOMUnsafeRegion oomUnsafe;
|
||||||
|
if (!sc->watchdogThread->init(WatchdogMain, cx))
|
||||||
|
oomUnsafe.crash("watchdogThread.init");
|
||||||
} else if (!sc->watchdogTimeout || timeout < sc->watchdogTimeout.value()) {
|
} else if (!sc->watchdogTimeout || timeout < sc->watchdogTimeout.value()) {
|
||||||
sc->watchdogWakeup.notify_one();
|
sc->watchdogWakeup.notify_one();
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,20 +99,12 @@ public:
|
||||||
, options_(mozilla::Forward<O>(options))
|
, options_(mozilla::Forward<O>(options))
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
// Start a thread of execution at functor |f| with parameters |args|. Note
|
|
||||||
// that the arguments must be either POD or rvalue references (mozilla::Move).
|
|
||||||
// Attempting to pass a reference will result in the value being copied, which
|
|
||||||
// may not be the intended behavior. See the comment below on
|
|
||||||
// ThreadTrampoline::args for an explanation.
|
|
||||||
template <typename F, typename... Args>
|
|
||||||
explicit Thread(F&& f, Args&&... args) {
|
|
||||||
MOZ_RELEASE_ASSERT(init(mozilla::Forward<F>(f),
|
|
||||||
mozilla::Forward<Args>(args)...));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start a thread of execution at functor |f| with parameters |args|. This
|
// Start a thread of execution at functor |f| with parameters |args|. This
|
||||||
// method will return false if thread creation fails. This Thread must not
|
// method will return false if thread creation fails. This Thread must not
|
||||||
// already have been created.
|
// already have been created. Note that the arguments must be either POD or
|
||||||
|
// rvalue references (mozilla::Move). Attempting to pass a reference will
|
||||||
|
// result in the value being copied, which may not be the intended behavior.
|
||||||
|
// See the comment below on ThreadTrampoline::args for an explanation.
|
||||||
template <typename F, typename... Args>
|
template <typename F, typename... Args>
|
||||||
MOZ_MUST_USE bool init(F&& f, Args&&... args) {
|
MOZ_MUST_USE bool init(F&& f, Args&&... args) {
|
||||||
MOZ_RELEASE_ASSERT(!joinable());
|
MOZ_RELEASE_ASSERT(!joinable());
|
||||||
|
|
Загрузка…
Ссылка в новой задаче