Commit caf8bd4a authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Rename function to tryUpdateState in Futures FSM

Summary: [Folly] Rename function to `tryUpdateState` in Futures `FSM` for clarity.

Reviewed By: LeeHowes

Differential Revision: D7725949

fbshipit-source-id: ccda21d990dbedfc4d0b86ab7cfb8eb68d93e429
parent 9ecd7918
...@@ -50,7 +50,7 @@ class FSM { ...@@ -50,7 +50,7 @@ class FSM {
/// The action will see the old state. /// The action will see the old state.
/// @returns true on success, false and action unexecuted otherwise /// @returns true on success, false and action unexecuted otherwise
template <class F> template <class F>
bool updateState(Enum A, Enum B, F const& action) { bool tryUpdateState(Enum A, Enum B, F const& action) {
std::lock_guard<Mutex> lock(mutex_); std::lock_guard<Mutex> lock(mutex_);
if (state_.load(std::memory_order_acquire) != A) { if (state_.load(std::memory_order_acquire) != A) {
return false; return false;
...@@ -69,7 +69,7 @@ class FSM { ...@@ -69,7 +69,7 @@ class FSM {
/// while (!done) { /// while (!done) {
/// switch (getState()) { /// switch (getState()) {
/// case State::Foo: /// case State::Foo:
/// done = updateState(State::Foo, State::Bar, /// done = tryUpdateState(State::Foo, State::Bar,
/// [&]{ /* do protected stuff */ }, /// [&]{ /* do protected stuff */ },
/// [&]{ /* do unprotected stuff */}); /// [&]{ /* do unprotected stuff */});
/// break; /// break;
...@@ -78,7 +78,7 @@ class FSM { ...@@ -78,7 +78,7 @@ class FSM {
/// while (true) { /// while (true) {
/// switch (getState()) { /// switch (getState()) {
/// case State::Foo: /// case State::Foo:
/// if (!updateState(State::Foo, State::Bar, /// if (!tryUpdateState(State::Foo, State::Bar,
/// [&]{ /* do protected stuff */ })) { /// [&]{ /* do protected stuff */ })) {
/// continue; /// continue;
/// } /// }
...@@ -88,9 +88,12 @@ class FSM { ...@@ -88,9 +88,12 @@ class FSM {
/// The protected action will see the old state, and the unprotected action /// The protected action will see the old state, and the unprotected action
/// will see the new state. /// will see the new state.
template <class F1, class F2> template <class F1, class F2>
bool updateState(Enum A, Enum B, bool tryUpdateState(
F1 const& protectedAction, F2 const& unprotectedAction) { Enum A,
bool result = updateState(A, B, protectedAction); Enum B,
F1 const& protectedAction,
F2 const& unprotectedAction) {
bool result = tryUpdateState(A, B, protectedAction);
if (result) { if (result) {
unprotectedAction(); unprotectedAction();
} }
...@@ -101,9 +104,8 @@ class FSM { ...@@ -101,9 +104,8 @@ class FSM {
#define FSM_START(fsm) {\ #define FSM_START(fsm) {\
bool done = false; \ bool done = false; \
while (!done) { auto state = fsm.getState(); switch (state) { while (!done) { auto state = fsm.getState(); switch (state) {
#define FSM_UPDATE2(fsm, b, protectedAction, unprotectedAction) \ #define FSM_UPDATE2(fsm, b, protectedAction, unprotectedAction) \
done = fsm.updateState(state, (b), (protectedAction), (unprotectedAction)); done = fsm.tryUpdateState(state, (b), (protectedAction), (unprotectedAction));
#define FSM_UPDATE(fsm, b, action) FSM_UPDATE2(fsm, (b), (action), []{}) #define FSM_UPDATE(fsm, b, action) FSM_UPDATE2(fsm, (b), (action), []{})
......
...@@ -30,10 +30,10 @@ TEST(FSM, example) { ...@@ -30,10 +30,10 @@ TEST(FSM, example) {
auto tryTransition = [&]{ auto tryTransition = [&]{
switch (fsm.getState()) { switch (fsm.getState()) {
case State::A: case State::A:
return fsm.updateState(State::A, State::B, [&]{ count++; }); return fsm.tryUpdateState(State::A, State::B, [&] { count++; });
case State::B: case State::B:
return fsm.updateState(State::B, State::A, return fsm.tryUpdateState(
[&]{ count--; }, [&]{ unprotectedCount--; }); State::B, State::A, [&] { count--; }, [&] { unprotectedCount--; });
} }
return false; // unreachable return false; // unreachable
}; };
...@@ -90,31 +90,31 @@ TEST(FSM, ctor) { ...@@ -90,31 +90,31 @@ TEST(FSM, ctor) {
TEST(FSM, update) { TEST(FSM, update) {
FSM<State, std::mutex> fsm(State::A); FSM<State, std::mutex> fsm(State::A);
EXPECT_TRUE(fsm.updateState(State::A, State::B, []{})); EXPECT_TRUE(fsm.tryUpdateState(State::A, State::B, [] {}));
EXPECT_EQ(State::B, fsm.getState()); EXPECT_EQ(State::B, fsm.getState());
} }
TEST(FSM, badUpdate) { TEST(FSM, badUpdate) {
FSM<State, std::mutex> fsm(State::A); FSM<State, std::mutex> fsm(State::A);
EXPECT_FALSE(fsm.updateState(State::B, State::A, []{})); EXPECT_FALSE(fsm.tryUpdateState(State::B, State::A, [] {}));
} }
TEST(FSM, actionOnUpdate) { TEST(FSM, actionOnUpdate) {
FSM<State, std::mutex> fsm(State::A); FSM<State, std::mutex> fsm(State::A);
int count = 0; int count = 0;
fsm.updateState(State::A, State::B, [&]{ count++; }); fsm.tryUpdateState(State::A, State::B, [&] { count++; });
EXPECT_EQ(1, count); EXPECT_EQ(1, count);
} }
TEST(FSM, noActionOnBadUpdate) { TEST(FSM, noActionOnBadUpdate) {
FSM<State, std::mutex> fsm(State::A); FSM<State, std::mutex> fsm(State::A);
int count = 0; int count = 0;
fsm.updateState(State::B, State::A, [&]{ count++; }); fsm.tryUpdateState(State::B, State::A, [&] { count++; });
EXPECT_EQ(0, count); EXPECT_EQ(0, count);
} }
TEST(FSM, stateTransitionAfterAction) { TEST(FSM, stateTransitionAfterAction) {
FSM<State, std::mutex> fsm(State::A); FSM<State, std::mutex> fsm(State::A);
fsm.updateState(State::A, State::B, fsm.tryUpdateState(
[&]{ EXPECT_EQ(State::A, fsm.getState()); }); State::A, State::B, [&] { EXPECT_EQ(State::A, fsm.getState()); });
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment