summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2021-07-15 13:52:03 -0600
committerRaul Rangel <rrangel@chromium.org>2021-07-18 15:13:27 +0000
commitbe60a0ddb0494e5a3becca832d706076820642f7 (patch)
tree00f8e18654bae76964c1230ec342df4229bae3ad /src/lib
parentb95369c91447f3fa6c672ffd346caf34c81134c0 (diff)
downloadcoreboot-be60a0ddb0494e5a3becca832d706076820642f7.tar.gz
coreboot-be60a0ddb0494e5a3becca832d706076820642f7.tar.bz2
coreboot-be60a0ddb0494e5a3becca832d706076820642f7.zip
lib/thread: Allow nesting thread_cooperate and thread_prevent_coop
This change allows nesting critical sections, and frees the caller from having to keep track of whether the thread has coop enabled. BUG=b:179699789 TEST=Boot guybrush with SPI DMA Suggested-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Raul E Rangel <rrangel@chromium.org> Change-Id: I325ab6181b17c5c084ca1e2c181b4df235020557 Reviewed-on: https://review.coreboot.org/c/coreboot/+/56350 Reviewed-by: Karthik Ramasubramanian <kramasub@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/thread.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/lib/thread.c b/src/lib/thread.c
index d44c218094ef..266ea381fe0b 100644
--- a/src/lib/thread.c
+++ b/src/lib/thread.c
@@ -31,7 +31,7 @@ static inline struct cpu_info *thread_cpu_info(const struct thread *t)
static inline int thread_can_yield(const struct thread *t)
{
- return (t != NULL && t->can_yield);
+ return (t != NULL && t->can_yield > 0);
}
/* Assumes current CPU info can switch. */
@@ -358,8 +358,12 @@ void thread_cooperate(void)
current = current_thread();
- if (current != NULL)
- current->can_yield = 1;
+ if (current == NULL)
+ return;
+
+ assert(current->can_yield <= 0);
+
+ current->can_yield++;
}
void thread_prevent_coop(void)
@@ -368,6 +372,8 @@ void thread_prevent_coop(void)
current = current_thread();
- if (current != NULL)
- current->can_yield = 0;
+ if (current == NULL)
+ return;
+
+ current->can_yield--;
}