drivers: gnss: gnss_publish: Use sem for locking

The gnss_publish incorrectly uses a spinlock for mutual
exclusion when publishing data and satellites. Update it to
use a binary semaphore.

Signed-off-by: Bjarki Arge Andreasen <bjarki@arge-andreasen.me>
This commit is contained in:
Bjarki Arge Andreasen 2024-05-02 18:19:27 +02:00 committed by Fabio Baltieri
parent 2ff1ed7804
commit 15fa7f79da

View file

@ -8,29 +8,33 @@
#include <zephyr/kernel.h> #include <zephyr/kernel.h>
#include <zephyr/sys/iterable_sections.h> #include <zephyr/sys/iterable_sections.h>
static struct k_spinlock lock; static K_SEM_DEFINE(semlock, 1, 1);
void gnss_publish_data(const struct device *dev, const struct gnss_data *data) void gnss_publish_data(const struct device *dev, const struct gnss_data *data)
{ {
K_SPINLOCK(&lock) { (void)k_sem_take(&semlock, K_FOREVER);
STRUCT_SECTION_FOREACH(gnss_data_callback, callback) { STRUCT_SECTION_FOREACH(gnss_data_callback, callback) {
if (callback->dev == NULL || callback->dev == dev) { if (callback->dev == NULL || callback->dev == dev) {
callback->callback(dev, data); callback->callback(dev, data);
} }
} }
}
k_sem_give(&semlock);
} }
#if CONFIG_GNSS_SATELLITES #if CONFIG_GNSS_SATELLITES
void gnss_publish_satellites(const struct device *dev, const struct gnss_satellite *satellites, void gnss_publish_satellites(const struct device *dev, const struct gnss_satellite *satellites,
uint16_t size) uint16_t size)
{ {
K_SPINLOCK(&lock) { (void)k_sem_take(&semlock, K_FOREVER);
STRUCT_SECTION_FOREACH(gnss_satellites_callback, callback) { STRUCT_SECTION_FOREACH(gnss_satellites_callback, callback) {
if (callback->dev == NULL || callback->dev == dev) { if (callback->dev == NULL || callback->dev == dev) {
callback->callback(dev, satellites, size); callback->callback(dev, satellites, size);
} }
} }
}
k_sem_give(&semlock);
} }
#endif #endif