X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fio%2Fasync%2Ftest%2FScopedEventBaseThreadTest.cpp;h=6f1d226672cb037169fd122cf5e033ee8fcc929e;hb=6b8138f935ed461e8e1e3c6c675539df1be5a211;hp=ba94518ae92ccd4dd5a58d967c1d8ccdf813ba56;hpb=4f6b99265ace26691d34b78ce51acddbf598d2ab;p=folly.git diff --git a/folly/io/async/test/ScopedEventBaseThreadTest.cpp b/folly/io/async/test/ScopedEventBaseThreadTest.cpp index ba94518a..6f1d2266 100644 --- a/folly/io/async/test/ScopedEventBaseThreadTest.cpp +++ b/folly/io/async/test/ScopedEventBaseThreadTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2015 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,13 @@ #include #include -#include +#include -#include +#include +#include +#include +#include +#include using namespace std; using namespace std::chrono; @@ -32,48 +36,55 @@ TEST_F(ScopedEventBaseThreadTest, example) { Baton<> done; sebt.getEventBase()->runInEventBaseThread([&] { done.post(); }); - done.timed_wait(steady_clock::now() + milliseconds(100)); + ASSERT_TRUE(done.timed_wait(seconds(1))); } -TEST_F(ScopedEventBaseThreadTest, start_stop) { - ScopedEventBaseThread sebt(false); +TEST_F(ScopedEventBaseThreadTest, named_example) { + static constexpr StringPiece kThreadName{"named_example"}; - for (size_t i = 0; i < 4; ++i) { - EXPECT_EQ(nullptr, sebt.getEventBase()); - sebt.start(); - EXPECT_NE(nullptr, sebt.getEventBase()); + Optional createdThreadName; + Baton<> done; - Baton<> done; - sebt.getEventBase()->runInEventBaseThread([&] { done.post(); }); - done.timed_wait(steady_clock::now() + milliseconds(100)); + ScopedEventBaseThread sebt{kThreadName}; + sebt.getEventBase()->runInEventBaseThread([&] { + createdThreadName = folly::getCurrentThreadName(); + done.post(); + }); - EXPECT_NE(nullptr, sebt.getEventBase()); - sebt.stop(); - EXPECT_EQ(nullptr, sebt.getEventBase()); + ASSERT_TRUE(done.timed_wait(seconds(1))); + if (createdThreadName) { + ASSERT_EQ(kThreadName.toString(), createdThreadName.value()); } } -TEST_F(ScopedEventBaseThreadTest, move) { - auto sebt0 = ScopedEventBaseThread(); - auto sebt1 = std::move(sebt0); - auto sebt2 = std::move(sebt1); - - EXPECT_EQ(nullptr, sebt0.getEventBase()); - EXPECT_EQ(nullptr, sebt1.getEventBase()); - EXPECT_NE(nullptr, sebt2.getEventBase()); - - Baton<> done; - sebt2.getEventBase()->runInEventBaseThread([&] { done.post(); }); - done.timed_wait(steady_clock::now() + milliseconds(100)); -} - -TEST_F(ScopedEventBaseThreadTest, self_move) { +TEST_F(ScopedEventBaseThreadTest, default_manager) { + auto ebm = EventBaseManager::get(); ScopedEventBaseThread sebt; - sebt = std::move(sebt); + auto sebt_eb = sebt.getEventBase(); + auto ebm_eb = static_cast(nullptr); + sebt_eb->runInEventBaseThreadAndWait([&] { ebm_eb = ebm->getEventBase(); }); + EXPECT_EQ(uintptr_t(sebt_eb), uintptr_t(ebm_eb)); +} - EXPECT_NE(nullptr, sebt.getEventBase()); +TEST_F(ScopedEventBaseThreadTest, custom_manager) { + EventBaseManager ebm; + ScopedEventBaseThread sebt(&ebm); + auto sebt_eb = sebt.getEventBase(); + auto ebm_eb = static_cast(nullptr); + sebt_eb->runInEventBaseThreadAndWait([&] { ebm_eb = ebm.getEventBase(); }); + EXPECT_EQ(uintptr_t(sebt_eb), uintptr_t(ebm_eb)); +} - Baton<> done; - sebt.getEventBase()->runInEventBaseThread([&] { done.post(); }); - done.timed_wait(steady_clock::now() + milliseconds(100)); +TEST_F(ScopedEventBaseThreadTest, eb_dtor_in_io_thread) { + Optional sebt; + sebt.emplace(); + auto const io_thread_id = sebt->getThreadId(); + EXPECT_NE(this_thread::get_id(), io_thread_id) << "sanity"; + + auto const eb = sebt->getEventBase(); + thread::id eb_dtor_thread_id; + eb->runOnDestruction(new EventBase::FunctionLoopCallback( + [&] { eb_dtor_thread_id = this_thread::get_id(); })); + sebt.clear(); + EXPECT_EQ(io_thread_id, eb_dtor_thread_id); }