/* 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; }