1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/core/msg_bus.c
Marian Buschsieweke 57264c5059
core: Access internal vars via helper funcs
Replace accesses to `sched_active_thread`, `sched_active_pid`, and
`sched_threads` with `thread_get_active()`, `thread_get_active_pid()`, and
`thread_get_unchecked()` where sensible.
2020-08-06 16:47:33 +02:00

74 lines
1.4 KiB
C

/*
* Copyright (C) 2020 ML!PA Consulting GmbH
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup core_msg
*
* @{
*
* @file
* @brief Messaging Bus API for inter process message broadcast.
*
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
*
* @}
*/
#include "irq.h"
#include "msg_bus.h"
#include "thread.h"
void msg_bus_init(msg_bus_t *bus)
{
static uint16_t bus_count;
bus->subs.next = NULL;
bus->id = bus_count++;
}
void msg_bus_attach(msg_bus_t *bus, msg_bus_entry_t *entry)
{
unsigned state;
entry->next.next = NULL;
entry->event_mask = 0;
entry->pid = thread_getpid();
state = irq_disable();
list_add(&bus->subs, &entry->next);
irq_restore(state);
}
void msg_bus_detach(msg_bus_t *bus, msg_bus_entry_t *entry)
{
unsigned state;
state = irq_disable();
list_remove(&bus->subs, &entry->next);
irq_restore(state);
}
msg_bus_entry_t *msg_bus_get_entry(msg_bus_t *bus)
{
msg_bus_entry_t *s = NULL;
unsigned state = irq_disable();
for (list_node_t *e = bus->subs.next; e; e = e->next) {
msg_bus_entry_t *subscriber = container_of(e, msg_bus_entry_t, next);
if (subscriber->pid == thread_getpid()) {
s = subscriber;
break;
}
}
irq_restore(state);
return s;
}