From 42ad32da6008401e21f77f952c5d1d2f9d43166c Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 27 Apr 2021 07:51:52 +0900 Subject: [PATCH] thread: Change if-else_if to switch-case blocks of spdk_poller_pause/resume() It will be sufficiently reasonable to check if the caller thread is valid even if spdk_poller_pause() or spdk_poller_resume() does nothing. Besides, let's write all possibles states explicitly in switch - cases. This refactoring clarifies the logic and makes the following patches easier. Signed-off-by: Shuhei Matsumoto Change-Id: I1163eff388fe741d6b6924f474a82b1aa7d18acb Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7665 Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Konrad Sztyber Reviewed-by: Aleksey Marchuk Tested-by: SPDK CI Jenkins --- lib/thread/thread.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/lib/thread/thread.c b/lib/thread/thread.c index 231a205d1..41e8541a0 100644 --- a/lib/thread/thread.c +++ b/lib/thread/thread.c @@ -1391,11 +1391,6 @@ spdk_poller_pause(struct spdk_poller *poller) { struct spdk_thread *thread; - if (poller->state == SPDK_POLLER_STATE_PAUSED || - poller->state == SPDK_POLLER_STATE_PAUSING) { - return; - } - thread = spdk_get_thread(); if (!thread) { assert(false); @@ -1414,9 +1409,11 @@ spdk_poller_pause(struct spdk_poller *poller) * allows a poller to be paused from another one's context without * breaking the TAILQ_FOREACH_REVERSE_SAFE iteration. */ - if (poller->state != SPDK_POLLER_STATE_RUNNING) { - poller->state = SPDK_POLLER_STATE_PAUSING; - } else { + switch (poller->state) { + case SPDK_POLLER_STATE_PAUSED: + case SPDK_POLLER_STATE_PAUSING: + break; + case SPDK_POLLER_STATE_RUNNING: if (poller->period_ticks > 0) { TAILQ_REMOVE(&thread->timed_pollers, poller, tailq); } else { @@ -1425,6 +1422,13 @@ spdk_poller_pause(struct spdk_poller *poller) TAILQ_INSERT_TAIL(&thread->paused_pollers, poller, tailq); poller->state = SPDK_POLLER_STATE_PAUSED; + break; + case SPDK_POLLER_STATE_WAITING: + poller->state = SPDK_POLLER_STATE_PAUSING; + break; + default: + assert(false); + break; } } @@ -1433,11 +1437,6 @@ spdk_poller_resume(struct spdk_poller *poller) { struct spdk_thread *thread; - if (poller->state != SPDK_POLLER_STATE_PAUSED && - poller->state != SPDK_POLLER_STATE_PAUSING) { - return; - } - thread = spdk_get_thread(); if (!thread) { assert(false); @@ -1456,12 +1455,21 @@ spdk_poller_resume(struct spdk_poller *poller) * we just need to flip its state back to waiting, as it's already on * the appropriate list. */ - if (poller->state == SPDK_POLLER_STATE_PAUSED) { + switch (poller->state) { + case SPDK_POLLER_STATE_PAUSED: TAILQ_REMOVE(&thread->paused_pollers, poller, tailq); thread_insert_poller(thread, poller); + /* fallthrough */ + case SPDK_POLLER_STATE_PAUSING: + poller->state = SPDK_POLLER_STATE_WAITING; + break; + case SPDK_POLLER_STATE_RUNNING: + case SPDK_POLLER_STATE_WAITING: + break; + default: + assert(false); + break; } - - poller->state = SPDK_POLLER_STATE_WAITING; } const char *