/* * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-03-24 WangXiaoyao Complete testcase for synchronization */ #ifndef __SEMAPHORE_H__ #define __SEMAPHORE_H__ #include <stdatomic.h> typedef struct { atomic_int count; } semaphore_t; void semaphore_init(semaphore_t *sem, int count) { atomic_init(&sem->count, count); } void semaphore_wait(semaphore_t *sem) { int count; do { count = atomic_load(&sem->count); } while (count == 0 || !atomic_compare_exchange_weak(&sem->count, &count, count - 1)); } void semaphore_signal(semaphore_t *sem) { atomic_fetch_add(&sem->count, 1); } #endif /* __SEMAPHORE_H__ */