From f410026b7bc96dbb42fec3839dc5d2e41b12f4a4 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sat, 28 Sep 2024 20:50:36 -0600 Subject: misc --- libcr_ipc/mutex.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 libcr_ipc/mutex.c (limited to 'libcr_ipc/mutex.c') diff --git a/libcr_ipc/mutex.c b/libcr_ipc/mutex.c new file mode 100644 index 0000000..c5cea96 --- /dev/null +++ b/libcr_ipc/mutex.c @@ -0,0 +1,37 @@ +/* libcr_ipc/mutex.c - Simple mutexes for libcr (implementation file) + * + * Copyright (C) 2024 Luke T. Shumaker + * SPDX-Licence-Identifier: AGPL-3.0-or-later + */ + +#include + +void cr_mutex_lock(cr_mutex_t *mu) { + assert(mu); + if (!mu->tail) + mu->tail = &mu->head; + if (!mu->locked) { + mu->locked = true; + return; + } + struct _cr_mutex_cid_list self = { + .val = cr_getcid(), + .next = NULL, + }; + *(mu->tail) = &self; + mu->tail = &(self.next); + cr_pause_and_yield(); +} + +void cr_mutex_unlock(cr_mutex_t *mu) { + assert(mu); + assert(mu->tail); + assert(mu->locked); + if (mu->head) { + cr_unpause(mu->head->val); + mu->head = mu->head->next; + if (!mu->head) + mu->tail = &mu->head; + } else + mu->locked = false; +} -- cgit v1.2.3-2-g168b