summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/thread.h11
-rw-r--r--src/lib/thread.c20
2 files changed, 31 insertions, 0 deletions
diff --git a/src/include/thread.h b/src/include/thread.h
index 293a666dbd..4bc04db00a 100644
--- a/src/include/thread.h
+++ b/src/include/thread.h
@@ -6,6 +6,10 @@
#include <bootstate.h>
#include <arch/cpu.h>
+struct thread_mutex {
+ bool locked;
+};
+
#if ENV_RAMSTAGE && CONFIG(COOP_MULTITASKING)
struct thread {
@@ -53,6 +57,9 @@ int thread_yield_microseconds(unsigned int microsecs);
void thread_coop_enable(void);
void thread_coop_disable(void);
+void thread_mutex_lock(struct thread_mutex *mutex);
+void thread_mutex_unlock(struct thread_mutex *mutex);
+
static inline void thread_init_cpu_info_non_bsp(struct cpu_info *ci)
{
ci->thread = NULL;
@@ -85,6 +92,10 @@ static inline void thread_coop_enable(void) {}
static inline void thread_coop_disable(void) {}
struct cpu_info;
static inline void thread_init_cpu_info_non_bsp(struct cpu_info *ci) { }
+
+static inline void thread_mutex_lock(struct thread_mutex *mutex) {}
+
+static inline void thread_mutex_unlock(struct thread_mutex *mutex) {}
#endif
#endif /* THREAD_H_ */
diff --git a/src/lib/thread.c b/src/lib/thread.c
index 47a23acd96..e62c5d7239 100644
--- a/src/lib/thread.c
+++ b/src/lib/thread.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
@@ -377,3 +378,22 @@ void thread_coop_disable(void)
current->can_yield--;
}
+
+void thread_mutex_lock(struct thread_mutex *mutex)
+{
+ struct stopwatch sw;
+
+ stopwatch_init(&sw);
+
+ while (mutex->locked)
+ assert(thread_yield() == 0);
+ mutex->locked = true;
+
+ printk(BIOS_SPEW, "took %lu us to acquire mutex\n", stopwatch_duration_usecs(&sw));
+}
+
+void thread_mutex_unlock(struct thread_mutex *mutex)
+{
+ assert(mutex->locked);
+ mutex->locked = 0;
+}